]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/tooltips_cleanup
authorterencehill <piuntn@gmail.com>
Sat, 3 Oct 2015 20:47:15 +0000 (22:47 +0200)
committerterencehill <piuntn@gmail.com>
Sat, 3 Oct 2015 20:47:15 +0000 (22:47 +0200)
287 files changed:
effectinfo.txt
gfx/hud/default/checkmark.tga [new file with mode: 0644]
gfx/hud/default/minigames/qto/board.jpg [deleted file]
gfx/hud/default/minigames/qto/board_alpha.jpg [deleted file]
gfx/hud/default/minigames/qto/icon.jpg [deleted file]
gfx/hud/default/minigames/qto/icon_notif.jpg [deleted file]
gfx/hud/default/minigames/qto/icon_notif_alpha.jpg [deleted file]
gfx/hud/default/minigames/qto/piece0.tga [deleted file]
gfx/hud/default/minigames/qto/piece1.tga [deleted file]
gfx/hud/default/minigames/snake/board.jpg [new file with mode: 0644]
gfx/hud/default/minigames/snake/board_alpha.jpg [new file with mode: 0644]
gfx/hud/default/minigames/snake/body.tga [new file with mode: 0644]
gfx/hud/default/minigames/snake/head.tga [new file with mode: 0644]
gfx/hud/default/minigames/snake/icon.jpg [new file with mode: 0644]
gfx/hud/default/minigames/snake/icon_notif.jpg [new file with mode: 0644]
gfx/hud/default/minigames/snake/icon_notif_alpha.jpg [new file with mode: 0644]
gfx/hud/default/minigames/snake/mouse.tga [new file with mode: 0644]
gfx/hud/default/minigames/snake/tail.tga [new file with mode: 0644]
gfx/hud/default/minigames/snake/tongue.tga [new file with mode: 0644]
minigames.cfg
monsters.cfg
qcsrc/Makefile
qcsrc/client/_all.qh
qcsrc/client/controlpoint.qc
qcsrc/client/controlpoint.qh
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/csqcmodel_hooks.qh [deleted file]
qcsrc/client/damage.qc
qcsrc/client/generator.qc
qcsrc/client/generator.qh
qcsrc/client/gibs.qc
qcsrc/client/gibs.qh
qcsrc/client/hook.qc
qcsrc/client/hook.qh
qcsrc/client/main.qc
qcsrc/client/mapvoting.qc
qcsrc/client/progs.inc
qcsrc/client/tuba.qc
qcsrc/client/view.qc
qcsrc/client/weapons/projectile.qc
qcsrc/collect-precache.sh [deleted file]
qcsrc/common/buffs.qh
qcsrc/common/command/generic.qc
qcsrc/common/effects/effectinfo.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo.qc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_buffs.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_ctf.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_gentle.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_gentle_happy.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_gentle_morphed.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_gentle_particlegibs.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_instagib.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_nades.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_onslaught.inc [new file with mode: 0644]
qcsrc/common/effects/effectinfo_vehicles.inc [new file with mode: 0644]
qcsrc/common/effects/effects.inc
qcsrc/common/items/all.qc
qcsrc/common/items/all.qh
qcsrc/common/items/item/ammo.qc
qcsrc/common/items/item/armor.qc
qcsrc/common/items/item/health.qc
qcsrc/common/items/item/jetpack.qc
qcsrc/common/items/item/pickup.qh
qcsrc/common/items/item/powerup.qc
qcsrc/common/minigames/cl_minigames.qc
qcsrc/common/minigames/cl_minigames.qh
qcsrc/common/minigames/cl_minigames_hud.qc
qcsrc/common/minigames/minigame/all.qh
qcsrc/common/minigames/minigame/c4.qc
qcsrc/common/minigames/minigame/nmm.qc
qcsrc/common/minigames/minigame/pong.qc
qcsrc/common/minigames/minigame/pp.qc
qcsrc/common/minigames/minigame/ps.qc
qcsrc/common/minigames/minigame/qto.qc [deleted file]
qcsrc/common/minigames/minigame/snake.qc [new file with mode: 0644]
qcsrc/common/minigames/minigame/ttt.qc
qcsrc/common/minigames/minigames.qc
qcsrc/common/minigames/minigames.qh
qcsrc/common/minigames/sv_minigames.qc
qcsrc/common/minigames/sv_minigames.qh
qcsrc/common/models/models.qh
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/monster/zombie.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/mutators/mutator/casings.qc
qcsrc/common/mutators/mutator/itemstime.qc
qcsrc/common/nades.qh
qcsrc/common/notifications.qc
qcsrc/common/sounds/sounds.inc [new file with mode: 0644]
qcsrc/common/sounds/sounds.qh [new file with mode: 0644]
qcsrc/common/triggers/func/bobbing.qc
qcsrc/common/triggers/func/breakable.qc
qcsrc/common/triggers/func/breakable.qh
qcsrc/common/triggers/func/button.qc
qcsrc/common/triggers/func/conveyor.qc
qcsrc/common/triggers/func/door.qc
qcsrc/common/triggers/func/door_rotating.qc
qcsrc/common/triggers/func/door_secret.qc
qcsrc/common/triggers/func/fourier.qc
qcsrc/common/triggers/func/ladder.qc
qcsrc/common/triggers/func/pendulum.qc
qcsrc/common/triggers/func/plat.qc
qcsrc/common/triggers/func/pointparticles.qc
qcsrc/common/triggers/func/rainsnow.qc
qcsrc/common/triggers/func/rotating.qc
qcsrc/common/triggers/func/stardust.qc
qcsrc/common/triggers/func/train.qc
qcsrc/common/triggers/func/vectormamamam.qc
qcsrc/common/triggers/misc/corner.qc
qcsrc/common/triggers/misc/follow.qc
qcsrc/common/triggers/misc/laser.qc
qcsrc/common/triggers/misc/teleport_dest.qc
qcsrc/common/triggers/platforms.qc
qcsrc/common/triggers/target/changelevel.qc
qcsrc/common/triggers/target/location.qc
qcsrc/common/triggers/target/music.qc
qcsrc/common/triggers/target/spawn.qc
qcsrc/common/triggers/target/speaker.qc
qcsrc/common/triggers/target/voicescript.qc
qcsrc/common/triggers/teleporters.qc
qcsrc/common/triggers/trigger/counter.qc
qcsrc/common/triggers/trigger/delay.qc
qcsrc/common/triggers/trigger/disablerelay.qc
qcsrc/common/triggers/trigger/flipflop.qc
qcsrc/common/triggers/trigger/gamestart.qc
qcsrc/common/triggers/trigger/gravity.qc
qcsrc/common/triggers/trigger/heal.qc
qcsrc/common/triggers/trigger/hurt.qc
qcsrc/common/triggers/trigger/impulse.qc
qcsrc/common/triggers/trigger/jumppads.qc
qcsrc/common/triggers/trigger/jumppads.qh
qcsrc/common/triggers/trigger/keylock.qc
qcsrc/common/triggers/trigger/magicear.qc
qcsrc/common/triggers/trigger/monoflop.qc
qcsrc/common/triggers/trigger/multi.qc
qcsrc/common/triggers/trigger/multi.qh
qcsrc/common/triggers/trigger/multivibrator.qc
qcsrc/common/triggers/trigger/relay.qc
qcsrc/common/triggers/trigger/relay_activators.qc
qcsrc/common/triggers/trigger/relay_if.qc
qcsrc/common/triggers/trigger/relay_teamcheck.qc
qcsrc/common/triggers/trigger/secret.qc
qcsrc/common/triggers/trigger/swamp.qc
qcsrc/common/triggers/trigger/teleport.qc
qcsrc/common/triggers/trigger/viewloc.qc
qcsrc/common/triggers/triggers.qc
qcsrc/common/turrets/all.inc [new file with mode: 0644]
qcsrc/common/turrets/all.qc [new file with mode: 0644]
qcsrc/common/turrets/all.qh
qcsrc/common/turrets/checkpoint.qc
qcsrc/common/turrets/cl_turrets.qc
qcsrc/common/turrets/cl_turrets.qh
qcsrc/common/turrets/config.qc
qcsrc/common/turrets/sv_turrets.qc
qcsrc/common/turrets/sv_turrets.qh
qcsrc/common/turrets/targettrigger.qc
qcsrc/common/turrets/turrets.qc [deleted file]
qcsrc/common/turrets/turrets.qh [deleted file]
qcsrc/common/turrets/unit/ewheel.qc
qcsrc/common/turrets/unit/flac.qc
qcsrc/common/turrets/unit/fusionreactor.qc
qcsrc/common/turrets/unit/hellion.qc
qcsrc/common/turrets/unit/hk.qc
qcsrc/common/turrets/unit/machinegun.qc
qcsrc/common/turrets/unit/mlrs.qc
qcsrc/common/turrets/unit/phaser.qc
qcsrc/common/turrets/unit/plasma.qc
qcsrc/common/turrets/unit/plasma_dual.qc
qcsrc/common/turrets/unit/tesla.qc
qcsrc/common/turrets/unit/walker.qc
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/common/vehicles/all.qc
qcsrc/common/vehicles/cl_vehicles.qc
qcsrc/common/vehicles/sv_vehicles.qc
qcsrc/common/vehicles/unit/bumblebee.qc
qcsrc/common/vehicles/unit/racer.qc
qcsrc/common/vehicles/unit/raptor.qc
qcsrc/common/vehicles/unit/spiderbot.qc
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/weapon/arc.qc
qcsrc/common/weapons/weapon/blaster.qc
qcsrc/common/weapons/weapon/crylink.qc
qcsrc/common/weapons/weapon/devastator.qc
qcsrc/common/weapons/weapon/electro.qc
qcsrc/common/weapons/weapon/fireball.qc
qcsrc/common/weapons/weapon/hagar.qc
qcsrc/common/weapons/weapon/hlac.qc
qcsrc/common/weapons/weapon/hmg.qc
qcsrc/common/weapons/weapon/hook.qc
qcsrc/common/weapons/weapon/machinegun.qc
qcsrc/common/weapons/weapon/minelayer.qc
qcsrc/common/weapons/weapon/mortar.qc
qcsrc/common/weapons/weapon/porto.qc
qcsrc/common/weapons/weapon/rifle.qc
qcsrc/common/weapons/weapon/rpc.qc
qcsrc/common/weapons/weapon/seeker.qc
qcsrc/common/weapons/weapon/shockwave.qc
qcsrc/common/weapons/weapon/shotgun.qc
qcsrc/common/weapons/weapon/tuba.qc
qcsrc/common/weapons/weapon/vaporizer.qc
qcsrc/common/weapons/weapon/vortex.qc
qcsrc/lib/_all.inc
qcsrc/lib/file.qh [new file with mode: 0644]
qcsrc/lib/log.qh
qcsrc/lib/registry.qh
qcsrc/lib/spawnfunc.qh [new file with mode: 0644]
qcsrc/menu/anim/animation.qc
qcsrc/menu/item/button.qc
qcsrc/menu/item/label.qc
qcsrc/menu/item/slider.qc
qcsrc/menu/item/textslider.qc
qcsrc/menu/xonotic/datasource.qc
qcsrc/menu/xonotic/dialog_monstertools.qc
qcsrc/menu/xonotic/dialog_settings_game.qc
qcsrc/menu/xonotic/radiobutton.qc
qcsrc/menu/xonotic/slider.qc
qcsrc/menu/xonotic/slider_decibels.qc
qcsrc/menu/xonotic/slider_particles.qc
qcsrc/menu/xonotic/slider_resolution.qc
qcsrc/menu/xonotic/slider_sbfadetime.qc
qcsrc/menu/xonotic/textslider.qc
qcsrc/server-testcase/framework.qc
qcsrc/server/_all.qh
qcsrc/server/autocvars.qh
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/scripting.qc
qcsrc/server/bot/waypoints.qc
qcsrc/server/bot/waypoints.qh
qcsrc/server/cheats.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_lights.qc
qcsrc/server/g_models.qc
qcsrc/server/g_subs.qc
qcsrc/server/g_subs.qh
qcsrc/server/g_world.qc
qcsrc/server/item_key.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/miscfunctions.qh
qcsrc/server/mutators/events.qh
qcsrc/server/mutators/gamemode_assault.qc
qcsrc/server/mutators/gamemode_ctf.qc
qcsrc/server/mutators/gamemode_domination.qc
qcsrc/server/mutators/gamemode_invasion.qc
qcsrc/server/mutators/gamemode_keepaway.qc
qcsrc/server/mutators/gamemode_keyhunt.qc
qcsrc/server/mutators/gamemode_nexball.qc
qcsrc/server/mutators/gamemode_onslaught.qc
qcsrc/server/mutators/gamemode_tdm.qc
qcsrc/server/mutators/mutator_buffs.qc
qcsrc/server/mutators/mutator_instagib.qc
qcsrc/server/mutators/mutator_instagib_items.qc
qcsrc/server/mutators/mutator_nades.qc
qcsrc/server/mutators/mutator_new_toys.qc
qcsrc/server/mutators/mutator_overkill.qc
qcsrc/server/mutators/mutator_touchexplode.qc
qcsrc/server/mutators/sandbox.qc
qcsrc/server/pathlib.qc [deleted file]
qcsrc/server/pathlib.qh [deleted file]
qcsrc/server/pathlib/costs.qc
qcsrc/server/pathlib/debug.qc
qcsrc/server/portals.qc
qcsrc/server/progs.inc
qcsrc/server/race.qc
qcsrc/server/spawnpoints.qc
qcsrc/server/spawnpoints.qh
qcsrc/server/steerlib.qc
qcsrc/server/sv_main.qc
qcsrc/server/sys-pre.qh
qcsrc/server/t_halflife.qc
qcsrc/server/t_items.qc
qcsrc/server/t_items.qh
qcsrc/server/t_quake.qc
qcsrc/server/t_quake3.qc
qcsrc/server/weapons/common.qc
qcsrc/server/weapons/selection.qc
qcsrc/server/weapons/spawning.qc
qcsrc/server/weapons/tracing.qc
qcsrc/server/weapons/weaponsystem.qc
qcsrc/warpzonelib/server.qc

index 2ba9a413b01ded720c47c53afbead18b3d3c99b0..cad4b11bcfea49b5521913ae558570f37496ecc2 100644 (file)
-// item respawn effect
-// flare particle and light
-// used in qcsrc/server/bots.qc:       //te_wizspike(e.origin)
-// used in qcsrc/server/bots.qc:               //te_wizspike(e.nearestwaypoint.wpnearestpoint)
-// used in qcsrc/server/havocbot.qc:                   //      te_wizspike(newgoal.origin)
+// ********************************************** //
+// ** WARNING - DO NOT MANUALLY EDIT THIS FILE ** //
+// **                                          ** //
+// **  This file is automatically generated by ** //
+// **  code with the command 'dumpeffectinfo'. ** //
+// **                                          ** //
+// **  If you modify an effect, please         ** //
+// **  regenerate this file with that command. ** //
+// **                                          ** //
+// ********************************************** //
+
 effect TE_WIZSPIKE
-countabsolute 1
-type static
-color 0x63F2EA 0x63f2EA
-size 20 20
-alpha 128 128 128
-lightradius 200
-lightradiusfade 200
-lightcolor 0.4 0.9 0.9
-// cloud of particles which expand rapidly and then slow to form a ball
+       alpha 128 128 128
+       color 0x63F2EA 0x63f2EA
+       countabsolute 1
+       lightcolor 0.4 0.9 0.9
+       lightradiusfade 200
+       lightradius 200
+       size 20 20
+       type static
 effect TE_WIZSPIKE
-count 50
-type static
-color 0x63F2EA 0x63f2EA
-size 2 2
-alpha 64 64 64
-airfriction 2
-liquidfriction 2
-originjitter 16 16 16
-velocityjitter 32 32 32
-
-// laser impact
-// decal
-// used in qcsrc/server/w_seeker.qc:   te_knightspike(org2)
+       airfriction 2
+       alpha 64 64 64
+       color 0x63F2EA 0x63f2EA
+       count 50
+       liquidfriction 2
+       originjitter 16 16 16
+       size 2 2
+       type static
+       velocityjitter 32 32 32
 effect TE_KNIGHTSPIKE
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 1000
-lightcolor 4 0.2 0.2
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 0.2 0.2
+       lightradiusfade 1000
+       lightradius 200
+       originjitter 16 16 16
+       size 24 24
+       tex 47 47
+       type decal
 effect TE_KNIGHTSPIKE
-countabsolute 1
-type static
-tex 39 39
-color 0xFF2010 0xFF2010
-alpha 256 256 1024
-size 24 24
-// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+       alpha 256 256 1024
+       color 0xFF2010 0xFF2010
+       countabsolute 1
+       size 24 24
+       tex 39 39
+       type static
 effect TE_KNIGHTSPIKE
-count 128
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 1024
-size 4 4
-//bounce 1.5
-airfriction 6
-liquidfriction 6
-//originjitter 32 32 32
-velocityjitter 256 256 256
-
-// machinegun bullet impact
-// bullet impact decal
-// used nowhere in code
+       airfriction 6
+       alpha 256 256 1024
+       color 0x800000 0xFF8020
+       count 128
+       liquidfriction 6
+       size 4 4
+       type spark
+       velocityjitter 256 256 256
 effect TE_SPIKE
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 6 6 6
+       size 5 5
+       tex 56 59
+       type decal
 effect TE_SPIKE
-count 4
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
+       alpha 255 255 256
+       color 0x101010 0x101010
+       count 4
+       sizeincrease 3
+       size 3 3
+       tex 0 8
+       type smoke
+       velocityjitter 8 8 8
 effect TE_SPIKE
-count 0.5
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// bouncing sparks
+       alpha 255 255 128
+       color 0x505050 0x505050
+       count 0.500000
+       sizeincrease 4
+       size 4 4
+       tex 0 8
+       type smoke
 effect TE_SPIKE
-count 10
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 256
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// electro combo explosion
-// decal
-// used nowhere in code
+       alpha 0 256 256
+       bounce 1.500000
+       color 0x8f4333 0xfff31b
+       count 10
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocityoffset 0 0 80
 effect TE_SPIKEQUAD
-countabsolute 1
-type decal
-tex 59 59
-size 64 64
-alpha 256 256 0
-originjitter 34 34 34
-lightradius 400
-lightradiusfade 200
-lightcolor 2 2.5 3
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 2 2.5 3
+       lightradiusfade 200
+       lightradius 400
+       originjitter 34 34 34
+       size 64 64
+       tex 59 59
+       type decal
 effect TE_SPIKEQUAD
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 48 48
-alpha 256 256 128
-// large sparks
+       alpha 256 256 128
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 48 48
+       tex 38 38
+       type static
 effect TE_SPIKEQUAD
-count 10
-type static
-color 0x2030FF 0x80C0FF
-size 32 32
-alpha 256 256 256
-//gravity 1
-bounce 1.5
-airfriction 4
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-
-// quake effect
-// decal
-// used nowhere in code
+       airfriction 4
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x2030FF 0x80C0FF
+       count 10
+       liquidfriction 16
+       size 32 32
+       type static
+       velocityjitter 512 512 512
 effect TE_SUPERSPIKE
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 6 6 6
+       size 3 3
+       tex 56 59
+       type decal
 effect TE_SUPERSPIKE
-count 4
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
+       alpha 255 255 256
+       color 0x101010 0x101010
+       count 4
+       sizeincrease 3
+       size 3 3
+       tex 0 8
+       type smoke
+       velocityjitter 8 8 8
 effect TE_SUPERSPIKE
-count 0.5
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// sparks that disappear on impact
+       alpha 255 255 128
+       color 0x505050 0x505050
+       count 0.500000
+       sizeincrease 4
+       size 4 4
+       tex 0 8
+       type smoke
 effect TE_SUPERSPIKE
-count 15
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// quake effect
-// decal
-// used nowhere in code
+       alpha 0 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 15
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocityoffset 0 0 80
 effect TE_SUPERSPIKEQUAD
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-lightradius 100
-lightradiusfade 500
-lightcolor 0.15 0.15 1.5
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 0.2 0.2 1.5
+       lightradiusfade 500
+       lightradius 100
+       originjitter 6 6 6
+       size 3 3
+       tex 56 59
+       type decal
 effect TE_SUPERSPIKEQUAD
-count 4
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 255 255 256
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
+       alpha 255 255 256
+       color 0x101010 0x101010
+       count 4
+       sizeincrease 3
+       size 3 3
+       tex 0 8
+       type smoke
+       velocityjitter 8 8 8
 effect TE_SUPERSPIKEQUAD
-count 0.5
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 255 255 128
-originjitter 0 0 0
-velocityjitter 0 0 0
-// sparks that disappear on impact
+       alpha 255 255 128
+       color 0x505050 0x505050
+       count 0.500000
+       sizeincrease 4
+       size 4 4
+       tex 0 8
+       type smoke
 effect TE_SUPERSPIKEQUAD
-count 15
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// shotgun pellet impact
-// decal
-// used nowhere in code
+       alpha 0 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 15
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocityoffset 0 0 80
 effect TE_GUNSHOT
-countabsolute 1
-type decal
-tex 56 59
-size 3 3
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 6 6 6
+       size 3 3
+       tex 56 59
+       type decal
 effect TE_GUNSHOT
-count 0.8
-type smoke
-tex 0 8
-color 0x101010 0x101010
-size 3 3
-sizeincrease 3
-alpha 128 128 64
-originjitter 0 0 0
-velocityjitter 8 8 8
-// dust/smoke staying at the impact
+       alpha 128 128 64
+       color 0x101010 0x101010
+       count 0.800000
+       sizeincrease 3
+       size 3 3
+       tex 0 8
+       type smoke
+       velocityjitter 8 8 8
 effect TE_GUNSHOT
-count 0.2
-type smoke
-tex 0 8
-color 0x505050 0x505050
-size 4 4
-sizeincrease 4
-alpha 128 128 64
-originjitter 0 0 0
-velocityjitter 0 0 0
-// bouncing sparks
+       alpha 128 128 64
+       color 0x505050 0x505050
+       count 0.200000
+       sizeincrease 4
+       size 4 4
+       tex 0 8
+       type smoke
 effect TE_GUNSHOT
-count 2.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 0 64 64
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-
-// crylink impact effect
-// decal
-// used nowhere in code
+       alpha 0 64 64
+       bounce 1.500000
+       color 0x8f4333 0xfff31b
+       count 2.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocityoffset 0 0 80
 effect TE_GUNSHOTQUAD
-countabsolute 1
-type decal
-tex 47 47
-size 8 8
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 100
-//lightradiusfade 300
-//lightcolor 0.5 0.5 0.5
-// purple flare effect
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 12 12 12
+       size 8 8
+       tex 47 47
+       type decal
 effect TE_GUNSHOTQUAD
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 8 8
-alpha 256 256 512
-// purple sparks
+       alpha 256 256 512
+       color 0x504060 0x504060
+       countabsolute 1
+       size 8 8
+       tex 39 39
+       type static
 effect TE_GUNSHOTQUAD
-count 6
-type spark
-color 0xA040C0 0xFFFFFF
-size 1 1
-alpha 128 128 384
-gravity 1
-bounce 1.5
-velocityoffset 0 0 80
-velocityjitter 128 128 128
-
-// mortar/hagar explosion (smaller than rocket)
-// decal
-// used in qcsrc/server/cl_client.qc:  te_explosion(org)
+       alpha 128 128 384
+       bounce 1.500000
+       color 0xA040C0 0xFFFFFF
+       count 6
+       gravity 1
+       size 1 1
+       type spark
+       velocityjitter 128 128 128
+       velocityoffset 0 0 80
 effect TE_EXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 150
-lightradiusfade 300
-lightcolor 4 2 0.5
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 2 0.5
+       lightradiusfade 300
+       lightradius 150
+       originjitter 40 40 40
+       size 48 48
+       tex 8 16
+       type decal
 effect TE_EXPLOSION
-countabsolute 1
-type static
-tex 35 37
-color 0x404040 0x404040
-size 48 48
-alpha 192 192 64
-// fire effect which expands then slows
+       alpha 192 192 64
+       color 0x404040 0x404040
+       countabsolute 1
+       size 48 48
+       tex 35 37
+       type static
 effect TE_EXPLOSION
-notunderwater
-count 64
-type static
-tex 48 55
-color 0x902010 0xFFD080
-size 16 16
-alpha 128 128 256
-bounce 1.5
-airfriction 4
-liquidfriction 4
-originjitter 8 8 8
-velocityjitter 256 256 256
-// underwater bubbles
+       airfriction 4
+       alpha 128 128 256
+       bounce 1.500000
+       color 0x902010 0xFFD080
+       count 64
+       liquidfriction 4
+       notunderwater
+       originjitter 8 8 8
+       size 16 16
+       tex 48 55
+       type static
+       velocityjitter 256 256 256
 effect TE_EXPLOSION
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect TE_EXPLOSION
-notunderwater
-count 16
-type spark
-color 0x903010 0xFFD030
-size 2 2
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// quake effect
-// decal
-// used nowhere in code
+       airfriction 0.200000
+       alpha 256 256 384
+       bounce 1.500000
+       color 0x903010 0xFFD030
+       count 16
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 2 2
+       type spark
+       velocityjitter 256 256 256
+       velocityoffset 0 0 80
 effect TE_EXPLOSIONQUAD
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 350
-lightradiusfade 700
-lightcolor 4 2 8
-// smoke cloud
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 2 8
+       lightradiusfade 700
+       lightradius 350
+       originjitter 40 40 40
+       size 48 48
+       tex 8 16
+       type decal
 effect TE_EXPLOSIONQUAD
-notunderwater
-count 16
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 12 12
-alpha 32 32 64
-velocityjitter 48 48 48
-// underwater bubbles
+       alpha 32 32 64
+       color 0x202020 0x404040
+       count 16
+       notunderwater
+       size 12 12
+       tex 0 8
+       type smoke
+       velocityjitter 48 48 48
 effect TE_EXPLOSIONQUAD
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// sparks which go through walls
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect TE_EXPLOSIONQUAD
-notunderwater
-count 64
-type spark
-color 0x903010 0xFFD030
-size 1 1
-alpha 0 256 512
-gravity 1
-airfriction 0.2
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// quake effect
-// decal
-// used in qcsrc/server/keyhunt.qc:    te_tarexplosion(lostkey.origin)
+       airfriction 0.200000
+       alpha 0 256 512
+       color 0x903010 0xFFD030
+       count 64
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 1 1
+       type spark
+       velocityjitter 256 256 256
+       velocityoffset 0 0 80
 effect TE_TAREXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 600
-lightradiusfade 1200
-lightcolor 1.6 0.8 2
-// smoke cloud
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 1.6 0.8 2
+       lightradiusfade 1200
+       lightradius 600
+       originjitter 40 40 40
+       size 48 48
+       tex 8 16
+       type decal
 effect TE_TAREXPLOSION
-notunderwater
-count 16
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 12 12
-alpha 32 32 64
-velocityjitter 48 48 48
-// underwater bubbles
+       alpha 32 32 64
+       color 0x202020 0x404040
+       count 16
+       notunderwater
+       size 12 12
+       tex 0 8
+       type smoke
+       velocityjitter 48 48 48
 effect TE_TAREXPLOSION
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// sparks which go through walls
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect TE_TAREXPLOSION
-notunderwater
-count 64
-type spark
-color 0x903010 0xFFD030
-size 1 1
-alpha 0 256 512
-gravity 1
-airfriction 0.2
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-// bloody impact effect indicating damage
-// used nowhere in code
+       airfriction 0.200000
+       alpha 0 256 512
+       color 0x903010 0xFFD030
+       count 64
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 1 1
+       type spark
+       velocityjitter 256 256 256
+       velocityoffset 0 0 80
 effect TE_BLOOD
-count 0.167
-type blood
-tex 24 32
-size 8 8
-alpha 256 256 64
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 1
-staincolor 0x808080 0x808080
-staintex 16 24
-
-
-
-// sparks (quake effect)
-// used in qcsrc/server/antilag.qc:            te_spark(antilag_takebackorigin(e, time - e.antilag_debug), '0 0 0', 32)
-// used in qcsrc/server/g_triggers.qc: self.mdl = "TE_SPARK"
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       count 0.167000
+       liquidfriction 4
+       size 8 8
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 1
 effect TE_SPARK
-count 0.5
-type spark
-tex 40 40
-color 0x8f4333 0xfff31b
-size 0.4 0.6
-alpha 64 256 768
-gravity 1
-bounce -1
-velocityoffset 0 0 80
-velocityjitter 64 64 64
-velocitymultiplier 1
-
-// nex impact
-// decal
-// used in qcsrc/server/bots.qc:               te_plasmaburn(org)
+       alpha 64 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.600000
+       tex 40 40
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 1
+       velocityoffset 0 0 80
 effect TE_PLASMABURN
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-lightradius 200
-lightradiusfade 400
-lightcolor 1 1 1
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 1 1 1
+       lightradiusfade 400
+       lightradius 200
+       originjitter 16 16 16
+       size 24 24
+       tex 47 47
+       type decal
 effect TE_PLASMABURN
-countabsolute 1
-type static
-tex 37 37
-color 0x80C0FF 0x80C0FF
-size 8 8
-alpha 256 256 512
-// small sparks which form a sphere as they slow down
+       alpha 256 256 512
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 8 8
+       tex 37 37
+       type static
 effect TE_PLASMABURN
-count 128
-type spark
-color 0x2030FF 0x80C0FF
-size 1 2
-alpha 256 256 1024
-bounce 2
-airfriction 8
-liquidfriction 8
-velocityjitter 128 128 128
-
-// quake effect
-// used in qcsrc/server/bots.qc:       //te_smallflash((e.absmin + e.absmax) * 0.5)
-// used in qcsrc/server/bots.qc:               //te_smallflash((e.absmin + e.absmax) * 0.5)
+       airfriction 8
+       alpha 256 256 1024
+       bounce 2
+       color 0x2030FF 0x80C0FF
+       count 128
+       liquidfriction 8
+       size 1 2
+       type spark
+       velocityjitter 128 128 128
 effect TE_SMALLFLASH
-lightradius 200
-lightradiusfade 1000
-lightcolor 2 2 2
-
-// quake effect
-// used nowhere in code
+       lightcolor 2 2 2
+       lightradiusfade 1000
+       lightradius 200
 effect TE_FLAMEJET
-count 0.5
-type smoke
-color 0x6f0f00 0xe3974f
-size 4 4
-alpha 64 128 384
-gravity -1
-bounce 1.1
-airfriction 1
-liquidfriction 4
-velocityjitter 128 128 128
-velocitymultiplier 1
-
-// quake effect
-// used nowhere in code
+       airfriction 1
+       alpha 64 128 384
+       bounce 1.100000
+       color 0x6f0f00 0xe3974f
+       count 0.500000
+       gravity -1
+       liquidfriction 4
+       size 4 4
+       type smoke
+       velocityjitter 128 128 128
+       velocitymultiplier 1
 effect TE_LAVASPLASH
-count 32
-type alphastatic
-color 0x6f0f00 0xe3974f
-size 12 12
-alpha 256 256 256
-gravity 0.05
-originoffset 0 0 32
-originjitter 128 128 32
-velocityoffset 0 0 256
-velocityjitter 128 128 0
-
-// player teleport effect
-// used nowhere in code
+       alpha 256 256 256
+       color 0x6f0f00 0xe3974f
+       count 32
+       gravity 0.050000
+       originjitter 128 128 32
+       originoffset 0 0 32
+       size 12 12
+       type alphastatic
+       velocityjitter 128 128 0
+       velocityoffset 0 0 256
 effect TE_TELEPORT
-count 56
-type static
-color 0xA0A0A0 0xFFFFFF
-size 10 10
-alpha 64 128 256
-airfriction 1
-liquidfriction 4
-originoffset 0 0 28
-originjitter 16 16 28
-velocityjitter 0 0 256
-
-// nex beam
-// used in qcsrc/server/w_minstanex.qc:        trailparticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, trace_endpos)
-// used in qcsrc/client/particles.qc:          trailparticles(world, particleeffectnum("TE_TEI_G3"), shotorg, endpos)
+       airfriction 1
+       alpha 64 128 256
+       color 0xA0A0A0 0xFFFFFF
+       count 56
+       liquidfriction 4
+       originjitter 16 16 28
+       originoffset 0 0 28
+       size 10 10
+       type static
+       velocityjitter 0 0 256
 effect TE_TEI_G3
-countabsolute 1
-type beam
-tex 200 200
-color 0xFFFFFF 0xFFFFFF
-size 4 4
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0xFFFFFF 0xFFFFFF
+       countabsolute 1
+       size 4 4
+       tex 200 200
+       type beam
 effect TE_TEI_G3
-trailspacing 4
-type static
-color 0x202020 0x404040
-size 1 1
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 8 8 8
-type smoke
-
-// smoke effect
-// used nowhere in code
+       airfriction -4
+       alpha 256 256 512
+       color 0x202020 0x404040
+       size 1 1
+       trailspacing 4
+       type smoke
+       velocityjitter 8 8 8
 effect TE_TEI_SMOKE
-count 0.167
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 1
-
-// rocket explosion (bigger than mortar and hagar)
-// decal
-// used nowhere in code
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 0.167000
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 1
 effect TE_TEI_BIGEXPLOSION
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 500
-lightradiusfade 500
-lightcolor 4 2 0.5
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 2 0.5
+       lightradiusfade 500
+       lightradius 500
+       originjitter 40 40 40
+       size 72 72
+       tex 8 16
+       type decal
 effect TE_TEI_BIGEXPLOSION
-countabsolute 1
-type static
-tex 35 37
-color 0x404040 0x404040
-size 72 72
-alpha 192 192 64
-// fire effect
+       alpha 192 192 64
+       color 0x404040 0x404040
+       countabsolute 1
+       size 72 72
+       tex 35 37
+       type static
 effect TE_TEI_BIGEXPLOSION
-notunderwater
-count 128
-type static
-tex 48 55
-color 0x902010 0xFFD080
-size 16 16
-alpha 128 128 256
-bounce 1.5
-airfriction 4
-liquidfriction 4
-originjitter 8 8 8
-velocityjitter 512 512 512
-// underwater bubbles
+       airfriction 4
+       alpha 128 128 256
+       bounce 1.500000
+       color 0x902010 0xFFD080
+       count 128
+       liquidfriction 4
+       notunderwater
+       originjitter 8 8 8
+       size 16 16
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect TE_TEI_BIGEXPLOSION
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 144 144 144
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect TE_TEI_BIGEXPLOSION
-notunderwater
-count 64
-type spark
-color 0x903010 0xFFD030
-size 2 2
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 384 384 384
-
-// electro explosion
-// decal
-// used nowhere in code
+       airfriction 0.200000
+       alpha 256 256 384
+       bounce 1.500000
+       color 0x903010 0xFFD030
+       count 64
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 2 2
+       type spark
+       velocityjitter 384 384 384
+       velocityoffset 0 0 80
 effect TE_TEI_PLASMAHIT
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 20 20 20
-lightradius 200
-lightradiusfade 600
-lightcolor 2.4 4.8 8
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 2.4 4.8 8
+       lightradiusfade 600
+       lightradius 200
+       originjitter 20 20 20
+       size 32 32
+       tex 59 59
+       type decal
 effect TE_TEI_PLASMAHIT
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 32 32
-alpha 256 256 512
-// cloud of bouncing sparks
+       alpha 256 256 512
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 32 32
+       tex 38 38
+       type static
 effect TE_TEI_PLASMAHIT
-count 0.5
-type spark
-color 0x2030FF 0x80C0FF
-size 2 4
-alpha 256 256 1024
-//gravity 1
-bounce 1.5
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////
-// New effects in 2.4
-//////////////////////////////////////////////////
-
-
-
-// bloody impact effect indicating damage
-// used in qcsrc/client/gibs.qc:       pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10)
-// used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("blood"), org, vel, amount * 16)
+       alpha 256 256 1024
+       bounce 1.500000
+       color 0x2030FF 0x80C0FF
+       count 0.500000
+       size 2 4
+       type spark
+       velocityjitter 512 512 512
 effect blood
-count 0.4
-type spark
-blend invmod
-tex 24 32
-size 5 11
-alpha 1560 2560 7000
-color 0xA8FFFF 0xA8FFFFF
-bounce -1
-airfriction 0.4
-velocityjitter 99 99 55
-//velocitymultiplier 2
-staincolor 0x808080 0x808080
-staintex 16 24
-stainsize 1 2
-stretchfactor 20
-sizeincrease 20
-//blood mist
+       airfriction 0.400000
+       alpha 1560 2560 7000
+       blend invmod
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.400000
+       sizeincrease 20
+       size 5 11
+       staincolor 0x808080 0x808080
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 20
+       tex 24 32
+       type spark
+       velocityjitter 99 99 55
 effect blood
-countabsolute 1
-type alphastatic
-blend invmod
-tex 24 32
-size 25 30
-sizeincrease 20
-alpha 100 256 400
-color 0x000000 0x420000
-originjitter 11 11 11
-
-
-// player teleport effect
-// used in qcsrc/server/t_teleporters.qc:              pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1)
-// used in qcsrc/server/t_teleporters.qc:              pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1)
+       alpha 100 256 400
+       blend invmod
+       color 0x000000 0x420000
+       countabsolute 1
+       originjitter 11 11 11
+       sizeincrease 20
+       size 25 30
+       tex 24 32
+       type alphastatic
 effect teleport
-count 500
-type spark
-tex 64 64
-color 0x807aff 0x4463d5
-size 1 1
-alpha 0 256 100
-stretchfactor 2
-//gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1000 1000 1500
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 0.6
+       airfriction 2
+       alpha 0 256 100
+       bounce 1.500000
+       color 0x807aff 0x4463d5
+       count 500
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 1000 1000 1500
+       velocitymultiplier 0.500000
 effect teleport
-countabsolute 1
-type smoke
-tex 65 65
-size 150 150
-alpha 190 190 180
-sizeincrease -80
-color 0x807aff 0x4463d5
-
-
-
-// normal super gory blood trail (used by gibs)
-// used in qcsrc/client/gibs.qc:               trailparticles(self, particleeffectnum("TR_BLOOD"), oldorg, self.origin)
+       alpha 190 190 180
+       color 0x807aff 0x4463d5
+       countabsolute 1
+       sizeincrease -80
+       size 150 150
+       tex 65 65
+       type smoke
 effect TR_BLOOD
-trailspacing 20
-type spark
-blend invmod
-color 0xA8FFFF 0xA8FFFF
-tex 24 32
-size 4 19
-alpha 384 984 1492
-bounce -1
-gravity 0.4
-airfriction -2
-liquidfriction 1
-velocityjitter 64 64 64
-velocitymultiplier -0.1
-staincolor 0x808080 0x808080
-staintex 16 24
-stainsize 1 2
-stretchfactor 7
-sizeincrease -5
-// splash around gib
+       airfriction -2
+       alpha 384 984 1492
+       blend invmod
+       bounce -1
+       color 0xA8FFFF 0xA8FFFF
+       gravity 0.400000
+       liquidfriction 1
+       sizeincrease -5
+       size 4 19
+       staincolor 0x808080 0x808080
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 7
+       tex 24 32
+       trailspacing 20
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier -0.100000
 effect TR_BLOOD
-trailspacing 42
-type blood
-color 0xA8FFFF 0xA8FFFF
-tex 24 32
-size 4 6
-alpha 684 684 7492
-sizeincrease 500
-
-// thinner blood trail (used by quake zombies)
-// used in qcsrc/client/gibs.qc:               trailparticles(self, particleeffectnum("TR_SLIGHTBLOOD"), oldorg, self.origin)
+       alpha 684 684 7492
+       color 0xA8FFFF 0xA8FFFF
+       sizeincrease 500
+       size 4 6
+       tex 24 32
+       trailspacing 42
+       type blood
 effect TR_SLIGHTBLOOD
-trailspacing 64
-type blood
-color 0xA8FFFF 0xA8FFFF
-tex 24 32
-size 8 8
-alpha 384 384 192
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 0.5
-staincolor 0x808080 0x808080
-staintex 16 24
-
-
-
-// func_stardust effect, used in some maps to indicate teleporters
-// used in qcsrc/server/g_triggers.qc: self.effects = EF_STARDUST
-// used in qcsrc/server/portals.qc:    portal.effects = EF_STARDUST | EF_BLUE
+       airfriction 1
+       alpha 384 384 192
+       bounce -1
+       color 0xA8FFFF 0xA8FFFF
+       liquidfriction 4
+       size 8 8
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       trailspacing 64
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 0.500000
 effect EF_STARDUST
-count 37.5
-type static
-color 0xfff368 0xfff368
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// flare particle and light
-// used in qcsrc/server/t_items.qc:    //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1)
-// used in qcsrc/server/t_items.qc:    pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1)
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0xfff368 0xfff368
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect item_respawn
-countabsolute 1
-type static
-color 0x63F2EA 0x63f2EA
-size 32 32
-alpha 128 128 128
-// cloud of particles which expand rapidly and then slow to form a ball
+       alpha 128 128 128
+       color 0x63F2EA 0x63f2EA
+       countabsolute 1
+       size 32 32
+       type static
 effect item_respawn
-count 128
-type spark
-tex 41 41
-color 0x63F2EA 0x63f2EA
-size 2 2
-alpha 256 256 1280
-//originjitter 24 24 24
-velocityjitter 256 256 256
-
-
-
-// used in qcsrc/server/t_jumppads.qc:                 pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1)
+       alpha 256 256 1280
+       color 0x63F2EA 0x63f2EA
+       count 128
+       size 2 2
+       tex 41 41
+       type spark
+       velocityjitter 256 256 256
 effect jumppad_activate
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 2 2
-
-
-
-// used in qcsrc/server/w_hlac.qc:     pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_hlac.qc:     pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_laser.qc:    pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       lightcolor 2 2 2
+       lightradiusfade 2000
+       lightradius 200
 effect laser_muzzleflash
-// glow and light
-countabsolute 1
-type smoke
-color 0xcc0000 0xff0000
-tex 65 65
-size 10 15
-alpha 256 512 6280
-airfriction 10
-sizeincrease -100
-stretchfactor 2
-lightradius 200
-lightradiusfade 2000
-lightcolor 3 0.1 0.1
-// electricity
+       airfriction 10
+       alpha 256 512 6280
+       color 0xcc0000 0xff0000
+       countabsolute 1
+       lightcolor 3 0.1 0.1
+       lightradiusfade 2000
+       lightradius 200
+       sizeincrease -100
+       size 10 15
+       stretchfactor 2
+       tex 65 65
+       type smoke
 effect laser_muzzleflash
-count 3
-type spark
-color 0xb44215 0xff0000
-tex 43 43
-size 5 7
-alpha 256 512 6280
-airfriction 10
-originjitter 2 2 2
-velocityjitter 150 150 150
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2.3
-rotate -180 180 4000 -4000
-// fire
+       airfriction 10
+       alpha 256 512 6280
+       color 0xb44215 0xff0000
+       count 3
+       originjitter 2 2 2
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 5 7
+       stretchfactor 2.300000
+       tex 43 43
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.200000
 effect laser_muzzleflash
-count 6
-type spark
-color 0xff4200 0xff0000
-tex 8 15
-size 7 9
-alpha 256 512 6280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 100 100 100
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2
-
-
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1)
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1)
+       airfriction 12
+       alpha 256 512 6280
+       color 0xff4200 0xff0000
+       count 6
+       originjitter 2 2 2
+       sizeincrease -100
+       size 7 9
+       stretchfactor 2
+       tex 8 15
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 0.200000
 effect laser_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 14 14 14
-lightradius 200
-lightradiusfade 500
-lightcolor 8 0.4 0.4
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 0.4 0.4
+       lightradiusfade 500
+       lightradius 200
+       originjitter 14 14 14
+       size 24 24
+       tex 47 47
+       type decal
 effect laser_impact
-countabsolute 1
-type static
-tex 39 39
-color 0xFF2010 0xFF2010
-alpha 256 256 1024
-size 24 24
-// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+       alpha 256 256 1024
+       color 0xFF2010 0xFF2010
+       countabsolute 1
+       size 24 24
+       tex 39 39
+       type static
 effect laser_impact
-count 128
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 1024
-size 4 4
-//bounce 1.5
-airfriction 6
-liquidfriction 6
-//originjitter 32 32 32
-velocityjitter 256 256 256
+       airfriction 6
+       alpha 256 256 1024
+       color 0x800000 0xFF8020
+       count 128
+       liquidfriction 6
+       size 4 4
+       type spark
+       velocityjitter 256 256 256
 effect laser_impact
-count 4
-type smoke
-tex 48 55
-color 0x800000 0xFF8020
-size 12 12
-alpha 128 256 256
-originjitter 1 1 1
-velocitymultiplier 0.01
-velocityjitter 16 16 16
-sizeincrease 6
-
-
-
-// used in qcsrc/server/w_campingrifle.qc:     pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1)
-// used in qcsrc/server/w_shotgun.qc:  pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"))
-// used in qcsrc/server/w_shotgun.qc:  pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"))
-effect shotgun_muzzleflash
-count 1.5
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-sizeincrease 12
-velocitymultiplier 0.05
+       alpha 128 256 256
+       color 0x800000 0xFF8020
+       count 4
+       originjitter 1 1 1
+       sizeincrease 6
+       size 12 12
+       tex 48 55
+       type smoke
+       velocityjitter 16 16 16
+       velocitymultiplier 0.010000
 effect shotgun_muzzleflash
-count 16
-type spark
-tex 48 55
-color 0xffdb96 0xff5400
-size 10 20
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 100 100 100
-airfriction 5
-stretchfactor 2.5
-velocitymultiplier 0.5
-
-// shotgun pellet impact
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("shotgun_impact"), org2, backoff * 1000, 1)
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 1.500000
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       sizeincrease 12
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.050000
+effect shotgun_muzzleflash
+       airfriction 5
+       alpha 0 128 1024
+       color 0xffdb96 0xff5400
+       count 16
+       originjitter 1 1 1
+       size 10 20
+       stretchfactor 2.500000
+       tex 48 55
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 0.500000
 effect shotgun_impact
-countabsolute 1
-type decal
-tex 56 59
-size 5 8
-alpha 256 256 0
-originjitter 10 10 10
-//lightradius 30
-//lightradiusfade 90
-//lightcolor 1 1 1
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 10 10 10
+       size 5 8
+       tex 56 59
+       type decal
 effect shotgun_impact
-type alphastatic
-notunderwater
-tex 0 8
-count 1
-size 10 20
-sizeincrease 25
-alpha 300 550 756
-velocityjitter 150 150 150
-velocitymultiplier 0.2
-airfriction 5
-color 0x473a37 0x0b0a07
-rotate 0 360 -50 50
-// dust/smoke staying at the impact
+       airfriction 5
+       alpha 300 550 756
+       color 0x473a37 0x0b0a07
+       count 1
+       notunderwater
+       rotate 0 360 -50 50
+       sizeincrease 25
+       size 10 20
+       tex 0 8
+       type alphastatic
+       velocityjitter 150 150 150
+       velocitymultiplier 0.200000
 effect shotgun_impact
-type alphastatic
-notunderwater
-tex 36 36
-count 0.2
-size 10 11
-sizeincrease 74
-alpha 200 350 500
-velocityjitter 11 11 11
-airfriction 5
-color 0x201d1a 0x000000
-bounce 6
-velocitymultiplier 0.03
-rotate 0 360 -50 50
-// sparks
+       airfriction 5
+       alpha 200 350 500
+       bounce 6
+       color 0x201d1a 0x000000
+       count 0.200000
+       notunderwater
+       rotate 0 360 -50 50
+       sizeincrease 74
+       size 10 11
+       tex 36 36
+       type alphastatic
+       velocityjitter 11 11 11
+       velocitymultiplier 0.030000
 effect shotgun_impact
-notunderwater
-count 0.5
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.6 0.6
-alpha 0 356 268
-gravity 1
-bounce 1.5
-airfriction 1.1
-originjitter 1 1 1
-velocityjitter 200 200 200
-velocitymultiplier 0.2
-
-
-// used in qcsrc/server/w_uzi.qc:      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 1.100000
+       alpha 0 356 268
+       bounce 1.500000
+       color 0xFDFFD9 0xFDFFD9
+       count 0.500000
+       gravity 1
+       notunderwater
+       originjitter 1 1 1
+       size 0.600000 0.600000
+       tex 40 40
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.200000
 effect uzi_muzzleflash
-count 1
-type static
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 1 1 1
-velocitymultiplier 0.03
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
-gravity -0.1
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 1
+       gravity -0.100000
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type static
+       velocityjitter 1 1 1
+       velocitymultiplier 0.030000
 effect uzi_muzzleflash
-count 3
-type spark
-tex 40 40
-color 0xff9c00 0xffd200
-size 0.3 0.4
-alpha 0 256 6000
-originjitter 1 1 1
-velocityjitter 555 555 555
-velocitymultiplier 3
-stretchfactor 0.15
-airfriction 12
-
-
-// used in qcsrc/server/cl_client.qc:  //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1)
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1)
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1)
-// decal
+       airfriction 12
+       alpha 0 256 6000
+       color 0xff9c00 0xffd200
+       count 3
+       originjitter 1 1 1
+       size 0.300000 0.400000
+       stretchfactor 0.150000
+       tex 40 40
+       type spark
+       velocityjitter 555 555 555
+       velocitymultiplier 3
 effect machinegun_impact
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 10 10 10
-lightradius 80
-lightradiusfade 800
-lightcolor 6 3.6 0.6
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 6 3.6 0.6
+       lightradiusfade 800
+       lightradius 80
+       originjitter 10 10 10
+       size 5 5
+       tex 56 59
+       type decal
 effect machinegun_impact
-type alphastatic
-notunderwater
-tex 0 8
-count 1.5
-size 10 20
-sizeincrease 15
-alpha 300 550 456
-velocityjitter 150 150 150
-velocitymultiplier 0.1
-airfriction 5
-color 0x473a37 0x0b0a07
-rotate 0 360 -50 50
-// dust/smoke staying at the impact
+       airfriction 5
+       alpha 300 550 456
+       color 0x473a37 0x0b0a07
+       count 1.500000
+       notunderwater
+       rotate 0 360 -50 50
+       sizeincrease 15
+       size 10 20
+       tex 0 8
+       type alphastatic
+       velocityjitter 150 150 150
+       velocitymultiplier 0.100000
 effect machinegun_impact
-type alphastatic
-notunderwater
-tex 36 36
-count 0.5
-size 10 11
-sizeincrease 74
-alpha 200 350 500
-velocityjitter 11 11 11
-airfriction 5
-color 0x201d1a 0x000000
-bounce 6
-velocitymultiplier 0.03
-rotate 0 360 -50 50
-//debris
+       airfriction 5
+       alpha 200 350 500
+       bounce 6
+       color 0x201d1a 0x000000
+       count 0.500000
+       notunderwater
+       rotate 0 360 -50 50
+       sizeincrease 74
+       size 10 11
+       tex 36 36
+       type alphastatic
+       velocityjitter 11 11 11
+       velocitymultiplier 0.030000
 effect machinegun_impact
-type alphastatic
-notunderwater
-tex 66 68
-count 1
-size 1 5
-airfriction 1
-gravity 1.4
-alpha 300 550 256
-velocityjitter 350 350 350
-velocitymultiplier 0.2
-bounce 1.7
-color 0x63493e 0xffffff
-rotate 0 360 -500 500
-// sparks
+       airfriction 1
+       alpha 300 550 256
+       bounce 1.700000
+       color 0x63493e 0xffffff
+       count 1
+       gravity 1.400000
+       notunderwater
+       rotate 0 360 -500 500
+       size 1 5
+       tex 66 68
+       type alphastatic
+       velocityjitter 350 350 350
+       velocitymultiplier 0.200000
 effect machinegun_impact
-notunderwater
-count 1
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.3 0.3
-alpha 256 256 168
-gravity 1
-bounce 1
-airfriction 2
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.2
-
-
-
-
-// used in qcsrc/server/nexball.qc:    pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_grenadelauncher.qc:  pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_grenadelauncher.qc:  pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_porto.qc:    //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 2
+       alpha 256 256 168
+       bounce 1
+       color 0xFDFFD9 0xFDFFD9
+       count 1
+       gravity 1
+       notunderwater
+       originjitter 1 1 1
+       size 0.300000 0.300000
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.200000
 effect grenadelauncher_muzzleflash
-count 1.5
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-airfriction 12
-velocityjitter 20 20 20
-velocitymultiplier 0.03
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
+       airfriction 12
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 1.500000
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 20 20 20
+       velocitymultiplier 0.030000
 effect grenadelauncher_muzzleflash
-count 16
-type spark
-tex 48 55
-color 0xffdb96 0xff5400
-size 10 20
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier 0.5
-airfriction 5
-stretchfactor 2.5
-
-
-
-// mortar trail
-// smoke
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_GRENADE"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_GRENADE"), from, to)
+       airfriction 5
+       alpha 0 128 1024
+       color 0xffdb96 0xff5400
+       count 16
+       originjitter 1 1 1
+       size 10 20
+       stretchfactor 2.500000
+       tex 48 55
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 0.500000
 effect TR_GRENADE
-trailspacing 4
-type smoke
-color 0x101010 0x000000
-tex 0 8
-size 3 2
-bounce 1
-sizeincrease 10
-alpha 300 400 780
-originjitter 1 1 1
-velocityjitter 1 1 1
-velocitymultiplier -0.02
-//gravity -0.11
-// fire
+       alpha 300 400 780
+       bounce 1
+       color 0x101010 0x000000
+       originjitter 1 1 1
+       sizeincrease 10
+       size 3 2
+       tex 0 8
+       trailspacing 4
+       type smoke
+       velocityjitter 1 1 1
+       velocitymultiplier -0.020000
 effect TR_GRENADE
-notunderwater
-trailspacing 4
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 5 2
-sizeincrease -15
-alpha 100 144 988
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.0
-// bubbles
+       airfriction 8
+       alpha 100 144 988
+       color 0xffdf72 0x811200
+       notunderwater
+       sizeincrease -15
+       size 5 2
+       tex 48 55
+       trailspacing 4
+       type static
+       velocityjitter 32 32 32
+       velocitymultiplier -1
 effect TR_GRENADE
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-
-
-// hookbomb trail
-// smoke
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to)
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-notunderwater
-trailspacing 6
-type smoke
-color 0x303030 0x000000
-tex 0 8
-size 3 3
-bounce 1
-sizeincrease 11
-alpha 300 400 600
-originjitter 2 2 2
-velocityjitter 3 3 3
-velocitymultiplier -0.02
-gravity -0.11
-//marker
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-type alphastatic
-color 0x666666 0x000000
-tex 62 62
-size 1 1
-sizeincrease -0.1
-trailspacing 2
-alpha 256 256 720
-// bubbles
-effect TR_KNIGHTSPIKE // used for MF_TRACER2
-underwater
-trailspacing 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-
-
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1)
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
+effect TR_KNIGHTSPIKE
+       alpha 300 400 600
+       bounce 1
+       color 0x303030 0x000000
+       gravity -0.110000
+       notunderwater
+       originjitter 2 2 2
+       sizeincrease 11
+       size 3 3
+       tex 0 8
+       trailspacing 6
+       type smoke
+       velocityjitter 3 3 3
+       velocitymultiplier -0.020000
+effect TR_KNIGHTSPIKE
+       alpha 256 256 720
+       color 0x666666 0x000000
+       sizeincrease -0.100000
+       size 1 1
+       tex 62 62
+       trailspacing 2
+       type alphastatic
+effect TR_KNIGHTSPIKE
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 32
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect grenade_explode
-countabsolute 1
-type decal
-tex 8 16
-size 48 48
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 250
-lightradiusfade 400
-lightcolor 8 4 1
-// fire effect which expands then slows
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 1
+       lightradiusfade 400
+       lightradius 250
+       originjitter 26 26 26
+       size 48 48
+       tex 8 16
+       type decal
 effect grenade_explode
-notunderwater
-count 40
-type static
-tex 48 55
-color 0xe03f00 0x5e0000
-size 16 26
-sizeincrease 20
-alpha 128 228 356
-bounce 4.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-// fire effect which make brigt dot inside
+       airfriction 8
+       alpha 128 228 356
+       bounce 4.500000
+       color 0xe03f00 0x5e0000
+       count 40
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 20
+       size 16 26
+       tex 48 55
+       type static
+       velocityjitter 256 256 256
 effect grenade_explode
-notunderwater
-count 15
-type static
-tex 48 55
-color 0xe03f00 0xffdf92
-size 6 16
-sizeincrease 40
-alpha 228 328 756
-bounce 1
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-// smoke
+       airfriction 8
+       alpha 228 328 756
+       bounce 1
+       color 0xe03f00 0xffdf92
+       count 15
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 40
+       size 6 16
+       tex 48 55
+       type static
+       velocityjitter 256 256 256
 effect grenade_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 10
-size 20 40
-sizeincrease 34
-alpha 300 550 556
-velocityjitter 256 256 256
-airfriction 5
-color 0x000000 0x111111
-bounce 6
-// underwater bubbles
+       airfriction 5
+       alpha 300 550 556
+       bounce 6
+       color 0x000000 0x111111
+       count 10
+       notunderwater
+       sizeincrease 34
+       size 20 40
+       tex 0 8
+       type alphastatic
+       velocityjitter 256 256 256
 effect grenade_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect grenade_explode
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 5 5
-sizeincrease 1500
-alpha 40 40 300
-velocitymultiplier 0.3
-// bouncing sparks
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 1500
+       size 5 5
+       tex 33 33
+       type smoke
+       underwater
+       velocitymultiplier 0.300000
 effect grenade_explode
-notunderwater
-count 16
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 1 0.1
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xffa35b 0xfff2be
+       count 16
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 0.100000
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect grenade_explode
-notunderwater
-count 12
-type alphastatic
-tex 66 68
-color 0x6a3d25 0xcac5b4
-size 2 6
-alpha 644 956 684
-gravity 1.3
-airfriction 0.5
-bounce 1.6
-velocityjitter 324 324 524
-rotate -180 180 -1000 1000
-
-
-
-// used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 0.500000
+       alpha 644 956 684
+       bounce 1.600000
+       color 0x6a3d25 0xcac5b4
+       count 12
+       gravity 1.300000
+       notunderwater
+       rotate -180 180 -1000 1000
+       size 2 6
+       tex 66 68
+       type alphastatic
+       velocityjitter 324 324 524
 effect electro_muzzleflash
-countabsolute 1
-type smoke
-color 0x283880 0x283880 // 0x202020 0x404040
-tex 65 65
-size 15 15
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-sizeincrease -10
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 1.5 3 6
-
+       alpha 256 256 512
+       color 0x283880 0x283880
+       countabsolute 1
+       lightcolor 1.5 3 6
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       sizeincrease -10
+       size 15 15
+       tex 65 65
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect electro_muzzleflash
-count 7
-type spark
-tex 8 15
-color 0xD9FDFF 0xD9FDFF
-size 5 15
-alpha 110 228 2024
-originjitter 1 1 1
-velocityjitter 150 150 150
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 1.5
-
+       airfriction 2
+       alpha 110 228 2024
+       color 0xD9FDFF 0xD9FDFF
+       count 7
+       originjitter 1 1 1
+       size 5 15
+       stretchfactor 1.500000
+       tex 8 15
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.500000
 effect electro_muzzleflash
-count 5
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 7 6
-alpha 110 228 1024
-originjitter 1 1 1
-velocityjitter 350 350 350
-velocitymultiplier 2.5
-airfriction 8
-gravity 1.3
-stretchfactor 0.1
-
-
-// electro trail
-// glowing vapor trail
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), from, to)
+       airfriction 8
+       alpha 110 228 1024
+       color 0xD9FDFF 0xD9FDFF
+       count 5
+       gravity 1.300000
+       originjitter 1 1 1
+       size 7 6
+       stretchfactor 0.100000
+       tex 41 41
+       type spark
+       velocityjitter 350 350 350
+       velocitymultiplier 2.500000
 effect TR_NEXUIZPLASMA
-trailspacing 2
-type static
-color 0x283880 0x283880
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0x283880 0x283880
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect TR_NEXUIZPLASMA
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0x629dff 0x0018ff
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-
-
-// decal
-// used in qcsrc/client/damage.qc:                                             pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1)
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0x629dff 0x0018ff
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect electro_impact
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 17 17 17
-lightradius 250
-lightradiusfade 250
-lightcolor 3.125 4.375 10
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 3.1 4.4 10
+       lightradiusfade 250
+       lightradius 250
+       originjitter 17 17 17
+       size 32 32
+       tex 59 59
+       type decal
 effect electro_impact
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 1000
-color 0x80C0FF 0x80C0FF
-alpha 40 40 350
-velocitymultiplier 44
-// flare effect
+       alpha 40 40 350
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       sizeincrease 1000
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect electro_impact
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 12 32
-alpha 256 256 512
-// cloud of bouncing sparks
+       alpha 256 256 512
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 12 32
+       tex 38 38
+       type static
 effect electro_impact
-count 30
-type smoke
-tex 42 42
-color 0x629dff 0x0018ff
-size 36 36
-sizeincrease -50
-alpha 256 256 1024
-bounce 2
-gravity -0.3
-airfriction 6
-originjitter 1 1 1
-velocityjitter 512 512 512
-rotate -180 180 -9999 9999
-// inner cloud of smoke
+       airfriction 6
+       alpha 256 256 1024
+       bounce 2
+       color 0x629dff 0x0018ff
+       count 30
+       gravity -0.300000
+       originjitter 1 1 1
+       rotate -180 180 -9999 9999
+       sizeincrease -50
+       size 36 36
+       tex 42 42
+       type smoke
+       velocityjitter 512 512 512
 effect electro_impact
-count 30
-type smoke
-color 0x629dff 0x0018ff
-tex 0 8
-size 20 24
-sizeincrease 50
-alpha 200 256 512
-airfriction 30
-originjitter 20 20 20
-velocityjitter 320 320 320
-
-// decal
-// used in qcsrc/client/damage.qc:                                     pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1)
+       airfriction 30
+       alpha 200 256 512
+       color 0x629dff 0x0018ff
+       count 30
+       originjitter 20 20 20
+       sizeincrease 50
+       size 20 24
+       tex 0 8
+       type smoke
+       velocityjitter 320 320 320
 effect electro_ballexplode
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 17 17 17
-lightradius 250
-lightradiusfade 250
-lightcolor 3.125 4.375 10
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 3.1 4.4 10
+       lightradiusfade 250
+       lightradius 250
+       originjitter 17 17 17
+       size 32 32
+       tex 59 59
+       type decal
 effect electro_ballexplode
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 32 32
-alpha 256 256 512
-// cloud of bouncing sparks
+       alpha 256 256 512
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 32 32
+       tex 38 38
+       type static
 effect electro_ballexplode
-count 64
-type spark
-tex 41 41
-color 0xFDFFD9 0xFDFFD9
-size 1 2
-alpha 256 256 1024
-bounce 2
-stretchfactor 0.4
-//airfriction 2
-originjitter 1 1 1
-velocityjitter 512 512 512
-// inner cloud of smoke
+       alpha 256 256 1024
+       bounce 2
+       color 0xFDFFD9 0xFDFFD9
+       count 64
+       originjitter 1 1 1
+       size 1 2
+       stretchfactor 0.400000
+       tex 41 41
+       type spark
+       velocityjitter 512 512 512
 effect electro_ballexplode
-count 8
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 24 24
-alpha 256 256 512
-originjitter 20 20 20
-velocityjitter 32 32 32
-
-
-
-// decal
-// used in qcsrc/client/damage.qc:                                             pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1)
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 8
+       originjitter 20 20 20
+       size 24 24
+       tex 0 8
+       type smoke
+       velocityjitter 32 32 32
 effect electro_combo
-countabsolute 1
-type decal
-tex 59 59
-size 64 64
-alpha 256 256 0
-originjitter 17 17 17
-lightradius 400
-lightradiusfade 300
-lightcolor 4 5 6
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 5 6
+       lightradiusfade 300
+       lightradius 400
+       originjitter 17 17 17
+       size 64 64
+       tex 59 59
+       type decal
 effect electro_combo
-countabsolute 1
-type static
-tex 38 38
-color 0x80C0FF 0x80C0FF
-size 48 48
-alpha 128 128 64
-// large sparks
+       alpha 128 128 64
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 48 48
+       tex 38 38
+       type static
 effect electro_combo
-count 5
-type static
-color 0x2030FF 0x80C0FF
-size 32 32
-sizeincrease 50
-tex 0 7
-alpha 156 156 156
-bounce 2
-airfriction 6
-liquidfriction 16
-//velocityoffset 0 0 120
-velocityjitter 512 512 512
+       airfriction 6
+       alpha 156 156 156
+       bounce 2
+       color 0x2030FF 0x80C0FF
+       count 5
+       liquidfriction 16
+       sizeincrease 50
+       size 32 32
+       tex 0 7
+       type static
+       velocityjitter 512 512 512
 effect electro_combo
-count 32
-type spark
-tex 41 41
-color 0xa9cacf 0x0054ff
-size 2 4
-stretchfactor 2
-gravity 0.3
-alpha 444 512 700
-velocitymultiplier 3
-bounce 1.6
-//airfriction 2
-originjitter 1 1 1
-velocityjitter 312 312 312
-// inner cloud of smoke
+       alpha 444 512 700
+       bounce 1.600000
+       color 0xa9cacf 0x0054ff
+       count 32
+       gravity 0.300000
+       originjitter 1 1 1
+       size 2 4
+       stretchfactor 2
+       tex 41 41
+       type spark
+       velocityjitter 312 312 312
+       velocitymultiplier 3
 effect electro_combo
-count 0.125
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 24 24
-alpha 256 256 256
-originjitter 20 20 20
-velocityjitter 32 32 32
-// shockwave
+       alpha 256 256 256
+       color 0x202020 0x404040
+       count 0.125000
+       originjitter 20 20 20
+       size 24 24
+       tex 0 8
+       type smoke
+       velocityjitter 32 32 32
 effect electro_combo
-type smoke
-countabsolute 1
-color 0xa9cacf 0x0054ff
-tex 33 33
-size 30 30
-sizeincrease 600
-alpha 40 40 100
-velocitymultiplier 0.3
-
-
-
-// used in qcsrc/server/w_crylink.qc:  pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
-// used in qcsrc/server/w_crylink.qc:  pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
+       alpha 40 40 100
+       color 0xa9cacf 0x0054ff
+       countabsolute 1
+       sizeincrease 600
+       size 30 30
+       tex 33 33
+       type smoke
+       velocitymultiplier 0.300000
 effect crylink_muzzleflash
-count 0.5
-type smoke
-color 0xdd9cff 0xff0090
-tex 65 65
-size 15 20
-alpha 128 128 2024
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 1.6 0.2 2
+       alpha 128 128 2024
+       color 0xdd9cff 0xff0090
+       count 0.500000
+       lightcolor 1.6 0.2 2
+       lightradiusfade 2000
+       lightradius 200
+       size 15 20
+       tex 65 65
+       type smoke
+       velocitymultiplier 0.010000
 effect crylink_muzzleflash
-count 5
-type spark
-tex 35 36
-color 0xA080C0 0xA080C0
-size 5 10
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 200 200 200
-velocitymultiplier 0.3
-airfriction 12
-stretchfactor 1.5
-
-
-// crylink impact effect
-// decal
-// used in qcsrc/client/damage.qc:                                     pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1)
+       airfriction 12
+       alpha 0 128 1024
+       color 0xA080C0 0xA080C0
+       count 5
+       originjitter 1 1 1
+       size 5 10
+       stretchfactor 1.500000
+       tex 35 36
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.300000
 effect crylink_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 200
-//lightradiusfade 800
-//lightcolor 3.2 0.4 4
-// purple flare effect
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 12 12 12
+       size 24 24
+       tex 47 47
+       type decal
 effect crylink_impact
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 24 24
-alpha 256 256 512
-// purple sparks
+       alpha 256 256 512
+       color 0x504060 0x504060
+       countabsolute 1
+       size 24 24
+       tex 39 39
+       type static
 effect crylink_impact
-count 40
-type spark
-tex 41 41
-color 0xA040C0 0xA040C0
-bounce 2
-size 6 6
-alpha 256 256 1024
-velocityjitter 512 512 512
-// purple splash
+       alpha 256 256 1024
+       bounce 2
+       color 0xA040C0 0xA040C0
+       count 40
+       size 6 6
+       tex 41 41
+       type spark
+       velocityjitter 512 512 512
 effect crylink_impact
-count 1.5
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 512
-velocityjitter 32 32 32
-// purple splash
+       alpha 256 256 512
+       color 0xE070FF 0xE070FF
+       count 1.500000
+       size 16 16
+       type static
+       velocityjitter 32 32 32
 effect crylink_impact
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 1024
-velocityjitter 256 256 256
-
-
-
-// used in qcsrc/server/w_minstanex.qc:        pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/client/particles.qc:  pointparticles(particleeffectnum("nex_muzzleflash"), shotorg, normalize(endpos - shotorg) * 1000, 1)
+       alpha 256 256 1024
+       color 0xE070FF 0xE070FF
+       count 3
+       size 16 16
+       type static
+       velocityjitter 256 256 256
 effect nex_muzzleflash
-count 12
-type spark
-color 0x202020 0x0072ff
-tex 48 55
-size 16 16
-alpha 328 328 4000
-originjitter 4 4 4
-velocityjitter 180 180 180
-velocitymultiplier 1.4
-stretchfactor 2
-sizeincrease -100
-airfriction 9
-lightradius 200
-lightradiusfade 200
-lightcolor 2 2.5 3
+       airfriction 9
+       alpha 328 328 4000
+       color 0x202020 0x0072ff
+       count 12
+       lightcolor 2 2.5 3
+       lightradiusfade 200
+       lightradius 200
+       originjitter 4 4 4
+       sizeincrease -100
+       size 16 16
+       stretchfactor 2
+       tex 48 55
+       type spark
+       velocityjitter 180 180 180
+       velocitymultiplier 1.400000
 effect nex_muzzleflash
-count 50
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 1 1
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 600 600 600
-velocitymultiplier 1.5
-airfriction 9
-
-
-
-//// nex beam
-//effect nex_beam
-//countabsolute 1
-//type beam
-//tex 200 200
-//color 0xFFFFFF 0xFFFFFF
-//size 6 6
-//alpha 128 128 192
-// nex beam: ring smoke
-// used in qcsrc/client/particles.qc:          trailparticles(world, particleeffectnum("nex_beam"), shotorg, endpos)
+       airfriction 9
+       alpha 0 128 1024
+       color 0xD9FDFF 0xD9FDFF
+       count 50
+       originjitter 1 1 1
+       size 1 1
+       tex 41 41
+       type spark
+       velocityjitter 600 600 600
+       velocitymultiplier 1.500000
 effect nex_beam
-trailspacing 64
-color 0x1680A0 0x1680A0
-size 4 4
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
-// nex beam: drifting smoke
+       airfriction 5
+       alpha 64 128 64
+       color 0x1680A0 0x1680A0
+       sizeincrease 2
+       size 4 4
+       tex 32 32
+       trailspacing 64
+       type static
 effect nex_beam
-trailspacing 12
-color 0x5080A0 0x5080A0
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
-// nex beam: bright core
+       airfriction 9
+       alpha 32 64 32
+       color 0x5080A0 0x5080A0
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
 effect nex_beam
-trailspacing 12
-color 0x80CDFF 0x80CDFF
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-//sparks
+       alpha 256 256 1280
+       color 0x80CDFF 0x80CDFF
+       size 4 4
+       trailspacing 12
+       type static
 effect nex_beam
-trailspacing 16
-color 0x1680A0 0x1680A0
-size 1 1
-tex 63 63
-alpha 64 128 80
-airfriction 5
-gravity -0.01
-type snow
-
-// nex impact
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1)
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1)
+       airfriction 5
+       alpha 64 128 80
+       color 0x1680A0 0x1680A0
+       gravity -0.010000
+       size 1 1
+       tex 63 63
+       trailspacing 16
+       type snow
 effect nex_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 14 14 14
-lightradius 200
-lightradiusfade 250
-lightcolor 4 6 8
-rotate -180 180 0 0
-// rotating something
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 6 8
+       lightradiusfade 250
+       lightradius 200
+       originjitter 14 14 14
+       rotate -180 180 0 0
+       size 24 24
+       tex 47 47
+       type decal
 effect nex_impact
-count 5
-type smoke
-tex 46 46
-color 0x1680A0 0x1680A0
-size 25 28
-sizeincrease 20
-alpha 55 55 50
-rotate 180 -180 500 -500
-// shockwave
+       alpha 55 55 50
+       color 0x1680A0 0x1680A0
+       count 5
+       rotate 180 -180 500 -500
+       sizeincrease 20
+       size 25 28
+       tex 46 46
+       type smoke
 effect nex_impact
-countabsolute 1
-type static
-tex 33 33
-color 0x1680A0 0x1680A0
-size 16 16
-alpha 50 50 400
-sizeincrease 900
-// shockwave2
+       alpha 50 50 400
+       color 0x1680A0 0x1680A0
+       countabsolute 1
+       sizeincrease 900
+       size 16 16
+       tex 33 33
+       type static
 effect nex_impact
-countabsolute 1
-type static
-tex 65 65
-color 0x1680A0 0x1680A0
-size 5 5
-alpha 50 50 100
-sizeincrease 500
-
-// flare effect
+       alpha 50 50 100
+       color 0x1680A0 0x1680A0
+       countabsolute 1
+       sizeincrease 500
+       size 5 5
+       tex 65 65
+       type static
 effect nex_impact
-countabsolute 1
-type static
-tex 37 37
-color 0x80C0FF 0x80C0FF
-size 8 8
-alpha 256 256 256
-// small sparks which form a sphere as they slow down
-//effect nex_impact
-//count 256
-//type spark
-//color 0x2030FF 0x80C0FF
-//size 1 2
-//alpha 256 256 512
-//bounce 2
-//airfriction 8
-//liquidfriction 8
-//velocityjitter 384 384 384
-// small sparks which glow brightly but live briefly
+       alpha 256 256 256
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       size 8 8
+       tex 37 37
+       type static
 effect nex_impact
-count 64
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 4 4
-alpha 0 128 512
-bounce 2
-stretchfactor 3
-velocityjitter 600 600 600
-velocitymultiplier 0.5
-airfriction 9
-// small sparks that live longer
+       airfriction 9
+       alpha 0 128 512
+       bounce 2
+       color 0xD9FDFF 0xD9FDFF
+       count 64
+       size 4 4
+       stretchfactor 3
+       tex 41 41
+       type spark
+       velocityjitter 600 600 600
+       velocitymultiplier 0.500000
 effect nex_impact
-count 16
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 2 2
-alpha 255 255 112
-bounce 1.6
-stretchfactor 0.7
-velocityjitter 300 300 600
-velocitymultiplier 2.5
-airfriction 2
-gravity 1
-
-// used in qcsrc/server/w_hagar.qc:    pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_hagar.qc:    pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_seeker.qc:   pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 2
+       alpha 255 255 112
+       bounce 1.600000
+       color 0xD9FDFF 0xD9FDFF
+       count 16
+       gravity 1
+       size 2 2
+       stretchfactor 0.700000
+       tex 41 41
+       type spark
+       velocityjitter 300 300 600
+       velocitymultiplier 2.500000
 effect hagar_muzzleflash
-count 2
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 2
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect hagar_muzzleflash
-count 15
-type spark
-tex 48 55
-color 0xff8400 0xff4200
-size 5 10
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 200 200 200
-velocitymultiplier 0.5
-airfriction 12
-stretchfactor 2
-rotate -180 180 -400 400
-
-
-
-// used in qcsrc/server/w_hagar.qc:            pointparticles(particleeffectnum("hagar_bounce"), self.origin, self.velocity, 1)
+       airfriction 12
+       alpha 0 128 1024
+       color 0xff8400 0xff4200
+       count 15
+       originjitter 1 1 1
+       rotate -180 180 -400 400
+       size 5 10
+       stretchfactor 2
+       tex 48 55
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.500000
 effect hagar_bounce
-count 2
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 256
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 60
-lightradiusfade 300
-lightcolor 2 1.5 0.2
+       alpha 256 256 256
+       color 0x202020 0x404040
+       count 2
+       lightcolor 2 1.5 0.2
+       lightradiusfade 300
+       lightradius 60
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect hagar_bounce
-count 15
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 256 256
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 600 600 600
-velocitymultiplier 0.5
-airfriction 12
-
-
-
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
-// used in qcsrc/client/damage.qc:                                             pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
-// used in qcsrc/client/damage.qc:                                             pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1)
+       airfriction 12
+       alpha 0 256 256
+       bounce 1.500000
+       color 0xFFFDD9 0xFFFDD9
+       count 15
+       gravity 1
+       originjitter 1 1 1
+       size 3 3
+       tex 40 40
+       type spark
+       velocityjitter 600 600 600
+       velocitymultiplier 0.500000
 effect hagar_explode
-countabsolute 1
-type decal
-tex 8 16
-size 28 38
-alpha 256 256 0
-originjitter 14 14 14
-lightradius 120
-lightradiusfade 400
-lightcolor 8 4 1
-// fire effect which make bright dot inside
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 1
+       lightradiusfade 400
+       lightradius 120
+       originjitter 14 14 14
+       size 28 38
+       tex 8 16
+       type decal
 effect hagar_explode
-notunderwater
-count 3.5
-type smoke
-tex 48 55
-color 0xffe955 0xff5a00
-size 16 26
-sizeincrease 5
-alpha 80 200 356
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 156 156 156
-// fire effect which expands then slows
+       airfriction 8
+       alpha 80 200 356
+       bounce 1.500000
+       color 0xffe955 0xff5a00
+       count 3.500000
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 5
+       size 16 26
+       tex 48 55
+       type smoke
+       velocityjitter 156 156 156
 effect hagar_explode
-notunderwater
-count 12
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 26
-sizeincrease 15
-alpha 128 256 456
-bounce 1.5
-airfriction 12
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 286 286 286
-
-// smoke
+       airfriction 12
+       alpha 128 256 456
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 12
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 15
+       size 20 26
+       tex 48 55
+       type static
+       velocityjitter 286 286 286
 effect hagar_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 7
-size 20 40
-sizeincrease 20
-alpha 200 500 600
-velocityjitter 244 244 244
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-
-// underwater bubbles
+       airfriction 5
+       alpha 200 500 600
+       bounce 2
+       color 0x000000 0x111111
+       count 7
+       notunderwater
+       sizeincrease 20
+       size 20 40
+       tex 0 8
+       type alphastatic
+       velocityjitter 244 244 244
 effect hagar_explode
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect hagar_explode
-notunderwater
-count 4
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 1 0.1
-alpha 644 956 684
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 224 224 224
-
-
-
-// used in qcsrc/server/w_rocketlauncher.qc:   pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 1
+       alpha 644 956 684
+       bounce 1.600000
+       color 0xffa35b 0xfff2be
+       count 4
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 0.100000
+       tex 40 40
+       type spark
+       velocityjitter 224 224 224
+       velocityoffset 0 0 80
 effect rocketlauncher_muzzleflash
-count 10
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 1 1
-sizeincrease 20
-alpha 256 256 256
-airfriction 2
-originjitter 1.5 1.5 1.5
-velocityjitter 40 40 40
-velocitymultiplier -0.13
-//lightradius 200
-//lightradiusfade 2000
-//lightcolor 2 1.5 0.2
+       airfriction 2
+       alpha 256 256 256
+       color 0x202020 0x404040
+       count 10
+       originjitter 1.5 1.5 1.5
+       sizeincrease 20
+       size 1 1
+       tex 0 8
+       type smoke
+       velocityjitter 40 40 40
+       velocitymultiplier -0.130000
 effect rocketlauncher_muzzleflash
-count 6
-type smoke
-tex 35 36
-color 0xFFFDD9 0xFFFDD9
-size 5 10
-sizeincrease 20
-alpha 10 25 20
-originjitter 3 3 3
-velocityjitter 100 100 100
-velocitymultiplier 0.3
-airfriction 9
-rotate -180 180 -30 30
-
-
-
-// rocket trail
-// smoke
-// used in qcsrc/server/cl_client.qc:          self.modelflags |= MF_ROCKET
-// used in qcsrc/server/cl_client.qc:          self.modelflags &~= MF_ROCKET
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_ROCKET"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_ROCKET"), from, to)
+       airfriction 9
+       alpha 10 25 20
+       color 0xFFFDD9 0xFFFDD9
+       count 6
+       originjitter 3 3 3
+       rotate -180 180 -30 30
+       sizeincrease 20
+       size 5 10
+       tex 35 36
+       type smoke
+       velocityjitter 100 100 100
+       velocitymultiplier 0.300000
 effect TR_ROCKET
-trailspacing 10
-type smoke
-notunderwater
-color 0x000000 0x666666
-tex 0 8
-size 3 4
-bounce 1
-sizeincrease 11
-alpha 200 300 200
-lightradius 150
-lighttime 0
-lightcolor 6 3 1
-originjitter 2 2 2
-velocityjitter 3 3 3
-velocitymultiplier -0.02
-rotate -180 180 -30 30
-//gravity -0.11
-// fire
+       alpha 200 300 200
+       bounce 1
+       color 0x000000 0x666666
+       lightcolor 6 3 1
+       lightradius 150
+       notunderwater
+       originjitter 2 2 2
+       rotate -180 180 -30 30
+       sizeincrease 11
+       size 3 4
+       tex 0 8
+       trailspacing 10
+       type smoke
+       velocityjitter 3 3 3
+       velocitymultiplier -0.020000
 effect TR_ROCKET
-trailspacing 4
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 7 7
-sizeincrease -30
-alpha 100 144 588
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.5
-// bubbles
+       airfriction 8
+       alpha 100 144 588
+       color 0xffdf72 0x811200
+       sizeincrease -30
+       size 7 7
+       tex 48 55
+       trailspacing 4
+       type static
+       velocityjitter 32 32 32
+       velocitymultiplier -1.500000
 effect TR_ROCKET
-type bubble
-underwater
-trailspacing 16
-tex 62 62
-size 1 2
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-velocitymultiplier -0.31
-rotate 0 0 0 0
-// sparks
+       alpha 256 256 256
+       bounce 1.500000
+       gravity -0.125000
+       liquidfriction 4
+       size 1 2
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
+       velocitymultiplier -0.310000
 effect TR_ROCKET
-notunderwater
-trailspacing 20
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 0.5 0.5
-alpha 444 512 1866
-stretchfactor 0.3
-//gravity 1
-bounce 1
-//velocityoffset 0 0 15
-airfriction 5
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier -0.31
-
-// rocket explosion (bigger than mortar and hagar)
+       airfriction 5
+       alpha 444 512 1866
+       bounce 1
+       color 0xFFFDD9 0xFFFDD9
+       notunderwater
+       originjitter 1 1 1
+       size 0.500000 0.500000
+       stretchfactor 0.300000
+       tex 40 40
+       trailspacing 20
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier -0.310000
 effect rocket_explode
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 23 23 23
-lightradius 400
-lightradiusfade 750
-lightcolor 8 4 1
-// fire effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 1
+       lightradiusfade 750
+       lightradius 400
+       originjitter 23 23 23
+       size 72 72
+       tex 8 16
+       type decal
 effect rocket_explode
-notunderwater
-count 32
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 33 44
-sizeincrease 45
-alpha 200 256 512
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 512 512 512
-// fire effect 2
+       airfriction 8
+       alpha 200 256 512
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 32
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 45
+       size 33 44
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect rocket_explode
-notunderwater
-count 14
-type smoke
-tex 48 55
-color 0xea691b 0xeed05a
-size 33 44
-sizeincrease 55
-alpha 200 256 612
-bounce 2.5
-airfriction 19
-liquidfriction 19
-originjitter 8 8 8
-velocityjitter 912 912 912
-// smoke
+       airfriction 19
+       alpha 200 256 612
+       bounce 2.500000
+       color 0xea691b 0xeed05a
+       count 14
+       liquidfriction 19
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 55
+       size 33 44
+       tex 48 55
+       type smoke
+       velocityjitter 912 912 912
 effect rocket_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 32
-size 20 40
-sizeincrease 44
-alpha 200 450 456
-velocityjitter 444 444 444
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-// underwater bubbles
+       airfriction 5
+       alpha 200 450 456
+       bounce 2
+       color 0x000000 0x111111
+       count 32
+       notunderwater
+       sizeincrease 44
+       size 20 40
+       tex 0 8
+       type alphastatic
+       velocityjitter 444 444 444
 effect rocket_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 144 144 144
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect rocket_explode
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 1900
-alpha 40 40 300
-velocitymultiplier 0.3
-// bouncing sparks
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 1900
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
+       velocitymultiplier 0.300000
 effect rocket_explode
-notunderwater
-count 16
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 1 0.1
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xffa35b 0xfff2be
+       count 16
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 0.100000
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect rocket_explode
-notunderwater
-count 12
-type alphastatic
-tex 66 68
-color 0x6a3d25 0xcac5b4
-size 2 6
-alpha 644 956 684
-gravity 1.3
-airfriction 0.5
-bounce 1.6
-velocityjitter 324 324 524
-rotate -180 180 -1000 1000
-
-// used in qcsrc/server/g_hook.qc:     pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1)
+       airfriction 0.500000
+       alpha 644 956 684
+       bounce 1.600000
+       color 0x6a3d25 0xcac5b4
+       count 12
+       gravity 1.300000
+       notunderwater
+       rotate -180 180 -1000 1000
+       size 2 6
+       tex 66 68
+       type alphastatic
+       velocityjitter 324 324 524
 effect grapple_muzzleflash
-lightradius 160
-lightradiusfade 800
-lightcolor 1 0 0
-
-
-
-// used in qcsrc/server/g_hook.qc:     pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1)
+       lightcolor 1 0 0
+       lightradiusfade 800
+       lightradius 160
 effect grapple_impact
-lightradius 160
-lightradiusfade 800
-lightcolor 1 0 0
-
-
-
-// used nowhere in code
+       lightcolor 1 0 0
+       lightradiusfade 800
+       lightradius 160
 effect nex242_misc_laser_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0xff0000 0xff0000
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0xff0000 0xff0000
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_beam_fast
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 640
-color 0xff0000 0xff0000
-sizeincrease 0.1
-
-// used nowhere in code
+       alpha 256 256 640
+       color 0xff0000 0xff0000
+       countabsolute 1
+       sizeincrease 0.100000
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_beam_fast_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// additional laser colors (mike)
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_green_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0x00ff00 0x00ff00
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0x00ff00 0x00ff00
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_green_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_blue_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0x0000ff 0x0000ff
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0x0000ff 0x0000ff
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_blue_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_yellow_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0xffff00 0xffff00
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0xffff00 0xffff00
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_yellow_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_cyan_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0x00ffff 0x00ffff
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0x00ffff 0x00ffff
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_cyan_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_magenta_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0xff00ff 0xff00ff
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0xff00ff 0xff00ff
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_magenta_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_white_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0xffffff 0xffffff
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0xffffff 0xffffff
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_white_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_black_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0x000000 0x000000
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0x000000 0x000000
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_black_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-// used nowhere in code
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect nex242_misc_laser_orange_beam
-countabsolute 1
-type beam
-tex 200 200
-size 1 1
-alpha 256 256 64
-color 0xff6600 0xff6600
-sizeincrease 1
-
-// used nowhere in code
+       alpha 256 256 64
+       color 0xff6600 0xff6600
+       countabsolute 1
+       sizeincrease 1
+       size 1 1
+       tex 200 200
+       type beam
 effect nex242_misc_laser_orange_beam_end
-count 0.5
-type spark
-color 0x8f4333 0xfff31b
-size 0.4 0.4
-alpha 128 256 768
-gravity 1
-bounce -1
-velocityjitter 64 64 64
-velocitymultiplier 100
-
-
-
-
-// bigger crylink impact effect
-// decal
-// used in qcsrc/client/damage.qc:                                     pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1)
+       alpha 128 256 768
+       bounce -1
+       color 0x8f4333 0xfff31b
+       count 0.500000
+       gravity 1
+       size 0.400000 0.400000
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier 100
 effect crylink_impactbig
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 200
-//lightradiusfade 800
-//lightcolor 3.2 0.4 4
-// purple flare effect
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 12 12 12
+       size 24 24
+       tex 47 47
+       type decal
 effect crylink_impactbig
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 24 24
-alpha 256 256 512
-// purple sparks
+       alpha 256 256 512
+       color 0x504060 0x504060
+       countabsolute 1
+       size 24 24
+       tex 39 39
+       type static
 effect crylink_impactbig
-count 40
-type spark
-tex 41 41
-color 0xA040C0 0xA040C0
-bounce 2
-size 6 6
-alpha 256 256 1024
-velocityjitter 512 512 512
-// purple splash
+       alpha 256 256 1024
+       bounce 2
+       color 0xA040C0 0xA040C0
+       count 40
+       size 6 6
+       tex 41 41
+       type spark
+       velocityjitter 512 512 512
 effect crylink_impactbig
-count 1.5
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 512
-velocityjitter 32 32 32
-// purple splash
+       alpha 256 256 512
+       color 0xE070FF 0xE070FF
+       count 1.500000
+       size 16 16
+       type static
+       velocityjitter 32 32 32
 effect crylink_impactbig
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 1024
-velocityjitter 256 256 256
-
-// Zero-violence effects
-
-// impact effect indicating damage
-// used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16)
+       alpha 256 256 1024
+       color 0xE070FF 0xE070FF
+       count 3
+       size 16 16
+       type static
+       velocityjitter 256 256 256
 effect damage_hit
-tex 48 55
-count 0.5
-type alphastatic
-color 0x00FFFF 0xFF00FF
-size 16 16
-sizeincrease -24
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 256 256 256
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0x00FFFF 0xFF00FF
+       count 0.500000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -24
+       size 16 16
+       tex 48 55
+       type alphastatic
+       velocityjitter 256 256 256
 effect damage_hit
-tex 48 55
-count 0.5
-type alphastatic
-color 0xFF00FF 0xFFFF00
-size 16 16
-sizeincrease -24
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 256 256 256
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0xFF00FF 0xFFFF00
+       count 0.500000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -24
+       size 16 16
+       tex 48 55
+       type alphastatic
+       velocityjitter 256 256 256
 effect damage_hit
-tex 48 55
-count 0.5
-type alphastatic
-color 0xFFFF00 0x00FFFF
-size 16 16
-sizeincrease -24
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 256 256 256
-
-// effect for removing player model
-// "teleport"
-// NOTE: maintained by div0, make your own new effect instead of changing this one without asking!
-// large sparks
-// used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount)
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0xFFFF00 0x00FFFF
+       count 0.500000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -24
+       size 16 16
+       tex 48 55
+       type alphastatic
+       velocityjitter 256 256 256
 effect damage_dissolve
-tex 48 55
-count 15
-type alphastatic
-color 0x00FFFF 0xFF00FF
-size 32 32
-sizeincrease -16
-alpha 256 256 128
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 512 512 512
+       airfriction 3
+       alpha 256 256 128
+       bounce 1.500000
+       color 0x00FFFF 0xFF00FF
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -16
+       size 32 32
+       tex 48 55
+       type alphastatic
+       velocityjitter 512 512 512
 effect damage_dissolve
-tex 48 55
-count 15
-type alphastatic
-color 0xFF00FF 0xFFFF00
-size 32 32
-sizeincrease -16
-alpha 256 256 128
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 512 512 512
+       airfriction 3
+       alpha 256 256 128
+       bounce 1.500000
+       color 0xFF00FF 0xFFFF00
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -16
+       size 32 32
+       tex 48 55
+       type alphastatic
+       velocityjitter 512 512 512
 effect damage_dissolve
-tex 48 55
-count 15
-type alphastatic
-color 0xFFFF00 0x00FFFF
-size 32 32
-sizeincrease -16
-alpha 256 256 128
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 512 512 512
-
-
-// decal
-// used in qcsrc/server/g_triggers.qc:                                 self.cnt = particleeffectnum("laser_deadly")
-// used in qcsrc/server/g_triggers.qc:                 self.cnt = particleeffectnum("laser_deadly")
+       airfriction 3
+       alpha 256 256 128
+       bounce 1.500000
+       color 0xFFFF00 0x00FFFF
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -16
+       size 32 32
+       tex 48 55
+       type alphastatic
+       velocityjitter 512 512 512
 effect laser_deadly
-countabsolute 1
-type decal
-tex 56 59
-size 5 5
-alpha 256 256 0
-originjitter 6 6 6
-// dust/smoke drifting away from the impact
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 6 6 6
+       size 5 5
+       tex 56 59
+       type decal
 effect laser_deadly
-count 0.025
-type smoke
-tex 48 55
-color 0xFFFFFF 0xFFFFFF
-size 3 3
-alpha 0 64 64
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 15 15 15
-sizeincrease 2
-velocitymultiplier 20
-// sparks
+       airfriction 7
+       alpha 0 64 64
+       color 0xFFFFFF 0xFFFFFF
+       count 0.025000
+       liquidfriction 16
+       originjitter 1 1 1
+       sizeincrease 2
+       size 3 3
+       tex 48 55
+       type smoke
+       velocityjitter 15 15 15
+       velocitymultiplier 20
 effect laser_deadly
-notunderwater
-count 0.025
-type spark
-tex 40 40
-color 0xFDFFD9 0xFDFFD9
-size 0.6 0.6
-alpha 256 256 768
-gravity 1
-bounce 1
-airfriction 5
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier 100
-
-
-//torch
-//fire
-// used nowhere in code
+       airfriction 5
+       alpha 256 256 768
+       bounce 1
+       color 0xFDFFD9 0xFDFFD9
+       count 0.025000
+       gravity 1
+       notunderwater
+       originjitter 1 1 1
+       size 0.600000 0.600000
+       tex 40 40
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 100
 effect torch_small
-//notunderwater
-count 8
-type smoke
-tex 48 55
-size 1 11
-alpha 200 256 512
-gravity -0.5
-color 0x8f0d00 0xff5a00
-//bounce 1
-sizeincrease -1
-originjitter 5 5 5
-velocityjitter 1 1 50
-// smoke
+       alpha 200 256 512
+       color 0x8f0d00 0xff5a00
+       count 8
+       gravity -0.500000
+       originjitter 5 5 5
+       sizeincrease -1
+       size 1 11
+       tex 48 55
+       type smoke
+       velocityjitter 1 1 50
 effect torch_small
-type alphastatic
-count 4
-tex 0 8
-size 5 10
-sizeincrease 5
-alpha 200 256 200
-color 0x000000 0x111111
-gravity -0.3
-originjitter 3 3 3
-velocityjitter 11 11 50
-//bounce 1
-
-//fountain01
-// used nowhere in code
+       alpha 200 256 200
+       color 0x000000 0x111111
+       count 4
+       gravity -0.300000
+       originjitter 3 3 3
+       sizeincrease 5
+       size 5 10
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect fountain01
-count 16
-tex 0 8
-size 10 15
-alpha 0 100 100
-gravity 0.6
-bounce 1
-sizeincrease 20
-type snow
-bounce 1
-originjitter 5 5 5
-velocityjitter 81 81 150
-color 0x7cbaff 0xcfd1ff
-velocitymultiplier 2
-
-// decal
-// used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1)
+       alpha 0 100 100
+       bounce 1
+       color 0x7cbaff 0xcfd1ff
+       count 16
+       gravity 0.600000
+       originjitter 5 5 5
+       sizeincrease 20
+       size 10 15
+       tex 0 8
+       type snow
+       velocityjitter 81 81 150
+       velocitymultiplier 2
 effect hookbomb_explode
-count 25
-type static
-tex 38 38
-color 0x807aff 0x4463d5
-size 150 200
-sizeincrease -160
-alpha 0 256 200
-//gravity 1
-bounce 1.5
-originjitter 10 10 10
-velocityjitter 550 550 550
-//velocitymultiplier -20
-airfriction 10
-// decal in the air
+       airfriction 10
+       alpha 0 256 200
+       bounce 1.500000
+       color 0x807aff 0x4463d5
+       count 25
+       originjitter 10 10 10
+       sizeincrease -160
+       size 150 200
+       tex 38 38
+       type static
+       velocityjitter 550 550 550
 effect hookbomb_explode
-countabsolute 3
-type static
-tex 38 38
-color 0x807aff 0x4463d5
-size 160 200
-alpha 256 265 100
-sizeincrease -60
-originoffset 0 0 6
-// decal on the ground
+       alpha 256 265 100
+       color 0x807aff 0x4463d5
+       countabsolute 3
+       originoffset 0 0 6
+       sizeincrease -60
+       size 160 200
+       tex 38 38
+       type static
 effect hookbomb_explode
-countabsolute 1
-type decal
-tex 39 39
-size 80 100
-alpha 256 256 0
-originjitter 6 6 6
-// some sparks
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 6 6 6
+       size 80 100
+       tex 39 39
+       type decal
 effect hookbomb_explode
-count 30
-type spark
-tex 38 38
-color 0x807aff 0x4463d5
-size 20 30
-alpha 256 256 456
-sizeincrease -60
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1900 1900 1300
-velocitymultiplier 0.5
-airfriction 2
-
-
-// smoke
+       airfriction 2
+       alpha 256 256 456
+       bounce 1.500000
+       color 0x807aff 0x4463d5
+       count 30
+       gravity 1
+       originjitter 1 1 1
+       sizeincrease -60
+       size 20 30
+       tex 38 38
+       type spark
+       velocityjitter 1900 1900 1300
+       velocitymultiplier 0.500000
 effect EF_MGTURRETTRAIL
-notunderwater
-trailspacing 10
-type smoke
-color 0xd0d0a0 0xffffff
-tex 0 8
-size 5 4
-alpha 128 196 768
-sizeincrease -8
-gravity -0.01
-// bubbles
+       alpha 128 196 768
+       color 0xd0d0a0 0xffffff
+       gravity -0.010000
+       notunderwater
+       sizeincrease -8
+       size 5 4
+       tex 0 8
+       trailspacing 10
+       type smoke
 effect EF_MGTURRETTRAIL
-underwater
-trailspacing 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-//fire_big
-//fire
-// used nowhere in code
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 32
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect fire_big
-//notunderwater
-count 26
-type smoke
-tex 48 55
-size 11 31
-alpha 200 356 512
-gravity -0.5
-color 0x8f0d00 0xff5a00
-bounce 2
-sizeincrease -3
-originjitter 33 33 33
-velocityjitter 22 22 50
-// smoke
+       alpha 200 356 512
+       bounce 2
+       color 0x8f0d00 0xff5a00
+       count 26
+       gravity -0.500000
+       originjitter 33 33 33
+       sizeincrease -3
+       size 11 31
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect fire_big
-type alphastatic
-count 11
-tex 0 8
-size 22 33
-sizeincrease 11
-alpha 200 256 200
-color 0x000000 0x111111
-gravity -0.3
-originjitter 44 44 44
-velocityjitter 11 11 50
-bounce 2
-
-//red_flare
-//smoke
-// used nowhere in code
+       alpha 200 256 200
+       bounce 2
+       color 0x000000 0x111111
+       count 11
+       gravity -0.300000
+       originjitter 44 44 44
+       sizeincrease 11
+       size 22 33
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect red_flare
-type alphastatic
-count 10.5
-tex 0 8
-size 1 11
-sizeincrease 11
-alpha 200 256 160
-color 0xff0000 0xdc7171
-gravity -0.24
-originjitter 2 2 0
-velocityjitter 15 15 30
-bounce 1
-
-//blue_flare
-//smoke
-// used nowhere in code
+       alpha 200 256 160
+       bounce 1
+       color 0xff0000 0xdc7171
+       count 10.500000
+       gravity -0.240000
+       originjitter 2 2 0
+       sizeincrease 11
+       size 1 11
+       tex 0 8
+       type alphastatic
+       velocityjitter 15 15 30
 effect blue_flare
-type alphastatic
-count 10.5
-tex 0 8
-size 1 11
-sizeincrease 11
-alpha 200 256 160
-color 0x0000ff 0x7194dc
-gravity -0.24
-originjitter 2 2 0
-velocityjitter 15 15 30
-bounce 1
-
-//smoke_ring
-//smoke
-// used in qcsrc/server/ctf.qc:                pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
+       alpha 200 256 160
+       bounce 1
+       color 0x0000ff 0x7194dc
+       count 10.500000
+       gravity -0.240000
+       originjitter 2 2 0
+       sizeincrease 11
+       size 1 11
+       tex 0 8
+       type alphastatic
+       velocityjitter 15 15 30
 effect smoke_ring
-type smoke
-count 45
-tex 0 8
-size 1 11
-sizeincrease 21
-gravity 0.1
-airfriction 3
-alpha 100 156 200
-color 0x111111 0x979797
-//originjitter 2 2 0
-velocityjitter 190 190 50
-bounce 1.1
-notunderwater
-
-//smoke_large
-//smoke
-// used nowhere in code
+       airfriction 3
+       alpha 100 156 200
+       bounce 1.100000
+       color 0x111111 0x979797
+       count 45
+       gravity 0.100000
+       notunderwater
+       sizeincrease 21
+       size 1 11
+       tex 0 8
+       type smoke
+       velocityjitter 190 190 50
 effect smoke_large
-type alphastatic
-count 25
-tex 0 8
-size 11 21
-sizeincrease 21
-gravity -0.15
-airfriction 7
-alpha 140 256 190
-color 0x9e895f 0xffd39b
-//originjitter 2 2 0
-velocityjitter 390 390 390
-bounce 1.1
-notunderwater
-
-//sparks
-// used nowhere in code
+       airfriction 7
+       alpha 140 256 190
+       bounce 1.100000
+       color 0x9e895f 0xffd39b
+       count 25
+       gravity -0.150000
+       notunderwater
+       sizeincrease 21
+       size 11 21
+       tex 0 8
+       type alphastatic
+       velocityjitter 390 390 390
 effect sparks
-count 15
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 1 3
-alpha 0 256 256
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 200
-velocitymultiplier 1.5
-airfriction 3
-
-//sparks
-// used nowhere in code
+       airfriction 3
+       alpha 0 256 256
+       bounce 1.500000
+       color 0xFFFDD9 0xFFFDD9
+       count 15
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 200
+       velocitymultiplier 1.500000
 effect electricity_sparks
-count 35
-type spark
-tex 40 40
-color 0x807aff 0x4463d5
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-//steam, it needs direction
-// used nowhere in code
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0x807aff 0x4463d5
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect steam
-type smoke
-count 1
-tex 0 8
-size 1 3
-sizeincrease 7
-gravity -0.25
-velocitymultiplier 14
-airfriction 5
-alpha 140 256 190
-color 0xfffbdf 0xffffff
-//originjitter 2 2 0
-velocityjitter 19 19 19
-bounce 1.1
-notunderwater
-
-// smoke emiter
-// used nowhere in code
+       airfriction 5
+       alpha 140 256 190
+       bounce 1.100000
+       color 0xfffbdf 0xffffff
+       count 1
+       gravity -0.250000
+       notunderwater
+       sizeincrease 7
+       size 1 3
+       tex 0 8
+       type smoke
+       velocityjitter 19 19 19
+       velocitymultiplier 14
 effect smoking
-count 10
-type alphastatic
-tex 0 8
-color 0x292929 0x000000
-size 10 40
-sizeincrease 5
-alpha 100 256 100
-gravity -0.1
-bounce 1.5
-originjitter 10 10 10
-velocityjitter 5 5 20
-//velocitymultiplier -20
-airfriction -1
-
-//golden dust (create it once per second to cover large area in small yellow particles)
-// used nowhere in code
+       airfriction -1
+       alpha 100 256 100
+       bounce 1.500000
+       color 0x292929 0x000000
+       count 10
+       gravity -0.100000
+       originjitter 10 10 10
+       sizeincrease 5
+       size 10 40
+       tex 0 8
+       type alphastatic
+       velocityjitter 5 5 20
 effect goldendust
-count 25
-type snow
-tex 38 38
-color 0xff9600 0xffefb8
-size 2 3
-sizeincrease -0.3
-alpha 256 256 70
-//gravity -0.1
-bounce 1.5
-originjitter 500 500 500
-velocityjitter 0.1 0.1 0.1
-//velocitymultiplier -20
-//airfriction -0.1
-
-// used nowhere in code
+       alpha 256 256 70
+       bounce 1.500000
+       color 0xff9600 0xffefb8
+       count 25
+       originjitter 500 500 500
+       sizeincrease -0.300000
+       size 2 3
+       tex 38 38
+       type snow
+       velocityjitter 0.1 0.1 0.1
 effect healing_fx
-count 25
-type spark
-tex 40 40
-color 0xff0000 0xff0000
-size 1 3
-sizeincrease -0.05
-alpha 256 256 170
-gravity -0.1
-bounce 1.5
-originjitter 5 5 100
-velocityjitter 50 50 0
-//velocitymultiplier 20
-airfriction -0.5
-
-// used nowhere in code
+       airfriction -0.500000
+       alpha 256 256 170
+       bounce 1.500000
+       color 0xff0000 0xff0000
+       count 25
+       gravity -0.100000
+       originjitter 5 5 100
+       sizeincrease -0.050000
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 50 50 0
 effect armorrepair_fx
-count 25
-type spark
-tex 40 40
-color 0x00ff00 0x00ff00
-size 1 3
-sizeincrease -0.05
-alpha 256 256 170
-gravity -0.1
-bounce 1.5
-originjitter 5 5 50
-velocityjitter 50 50 0
-//velocitymultiplier 20
-airfriction -0.5
-
-// used nowhere in code
+       airfriction -0.500000
+       alpha 256 256 170
+       bounce 1.500000
+       color 0x00ff00 0x00ff00
+       count 25
+       gravity -0.100000
+       originjitter 5 5 50
+       sizeincrease -0.050000
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 50 50 0
 effect ammoregen_fx
-count 25
-type spark
-tex 40 40
-color 0x0000ff 0x0000ff
-size 1 3
-sizeincrease -0.05
-alpha 256 256 170
-gravity -0.1
-bounce 1.5
-originjitter 5 5 50
-velocityjitter 50 50 0
-//velocitymultiplier 20
-airfriction -0.5
-
-// red-yellow flame like fx
-// used nowhere in code
+       airfriction -0.500000
+       alpha 256 256 170
+       bounce 1.500000
+       color 0x0000ff 0x0000ff
+       count 25
+       gravity -0.100000
+       originjitter 5 5 50
+       sizeincrease -0.050000
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 50 50 0
 effect rage
-count 2.5
-type smoke
-tex 35 36
-color 0xff0000 0xff7800
-size 1 3
-sizeincrease 10
-gravity -0.06
-alpha 256 256 190
-originjitter 5 5 5
-velocityjitter 25 25 25
-airfriction 2
-
-// pieces of glass or ice falling on the floor
-// used nowhere in code
+       airfriction 2
+       alpha 256 256 190
+       color 0xff0000 0xff7800
+       count 2.500000
+       gravity -0.060000
+       originjitter 5 5 5
+       sizeincrease 10
+       size 1 3
+       tex 35 36
+       type smoke
+       velocityjitter 25 25 25
 effect iceorglass
-count 15
-type alphastatic
-tex 44 44
-color 0xffffff 0xb2d3e6
-size 3 7
-//sizeincrease 10
-gravity 1.3
-alpha 256 256 0
-time 1 3
-bounce 2
-originjitter 30 30 30
-velocityjitter 100 100 100
-airfriction 3
-
-// cover small area in poison gas, spawn it once per second
-// used nowhere in code
+       airfriction 3
+       alpha 256 256 0
+       bounce 2
+       color 0xffffff 0xb2d3e6
+       count 15
+       gravity 1.300000
+       originjitter 30 30 30
+       size 3 7
+       tex 44 44
+       time 1 3
+       type alphastatic
+       velocityjitter 100 100 100
 effect poisonfield
-count 15
-type smoke
-tex 0 8
-color 0x00ff00 0x7db843
-size 1 1
-sizeincrease 30
- gravity -0.01
-alpha 256 256 50
-bounce 1.5
-originjitter 333 333 50
-velocityjitter 5 5 5
-airfriction 1
-
-// cover small area in icy mist, spawn it once per second
-// used nowhere in code
+       airfriction 1
+       alpha 256 256 50
+       bounce 1.500000
+       color 0x00ff00 0x7db843
+       count 15
+       gravity -0.010000
+       originjitter 333 333 50
+       sizeincrease 30
+       size 1 1
+       tex 0 8
+       type smoke
+       velocityjitter 5 5 5
 effect icefield
-count 10
-type smoke
-tex 0 8
-color 0x008aff 0x75e7ff
-size 1 1
-sizeincrease 10
- gravity -0.01
-alpha 256 256 50
-bounce 1.5
-originjitter 333 333 0
-velocityjitter 5 5 30
-airfriction 1
+       airfriction 1
+       alpha 256 256 50
+       bounce 1.500000
+       color 0x008aff 0x75e7ff
+       count 10
+       gravity -0.010000
+       originjitter 333 333 0
+       sizeincrease 10
+       size 1 1
+       tex 0 8
+       type smoke
+       velocityjitter 5 5 30
 effect icefield
-count 5
-type smoke
-tex 48 55
-size 1 1
-sizeincrease 10
-color 0x008aff 0x75e7ff
-alpha 256 256 50
-gravity -0.001
-originjitter 333 333 0
-
-
-// cover very small area in flames, spawn it 3 times per second (or more often to get better looking fire at cost of fps hit )
-// flames that go up
-// used nowhere in code
+       alpha 256 256 50
+       color 0x008aff 0x75e7ff
+       count 5
+       gravity -0.001000
+       originjitter 333 333 0
+       sizeincrease 10
+       size 1 1
+       tex 48 55
+       type smoke
 effect firefield
-count 100
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 1
-sizeincrease 20
- gravity -0.06
-alpha 50 256 200
-bounce 1.5
-originjitter 180 180 0
-velocityjitter 5 5 30
-airfriction 1
-//flames that stay on the ground
+       airfriction 1
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 100
+       gravity -0.060000
+       originjitter 180 180 0
+       sizeincrease 20
+       size 1 1
+       tex 48 55
+       type smoke
+       velocityjitter 5 5 30
 effect firefield
-count 50
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 1
-sizeincrease 40
-alpha 50 256 200
-originjitter 180 180 0
-// smoke
+       alpha 50 256 200
+       color 0x8f0d00 0xff5a00
+       count 50
+       originjitter 180 180 0
+       sizeincrease 40
+       size 1 1
+       tex 48 55
+       type smoke
 effect firefield
-count 20
-type alphastatic
-tex 0 8
-size 1 1
-sizeincrease 7
-color 0x000000 0x111111
-alpha 256 256 70
-gravity -0.02
-originjitter 180 180 0
-
-//flamethrower, spawn it as fast as you can  20 times per second or more, it needs direction
-//fast fire
-// used nowhere in code
+       alpha 256 256 70
+       color 0x000000 0x111111
+       count 20
+       gravity -0.020000
+       originjitter 180 180 0
+       sizeincrease 7
+       size 1 1
+       tex 0 8
+       type alphastatic
 effect flamethrower
-count 3
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
- gravity -0.06
-alpha 50 256 250
-bounce 1.5
-velocityjitter 40 40 11
-velocitymultiplier 30
-airfriction 1.2
-//slowfire
+       airfriction 1.200000
+       alpha 50 256 250
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 3
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 40 40 11
+       velocitymultiplier 30
 effect flamethrower
-count 2.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
- gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 40 40 40
-velocitymultiplier 20
-airfriction 1.2
-// very slow and small fire
+       airfriction 1.200000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 2.500000
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 40 40 40
+       velocitymultiplier 20
 effect flamethrower
-count 1.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 10
- gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 30 30 30
-velocitymultiplier 10
-airfriction 0.3
-//decreasing fire
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 1.500000
+       gravity -0.060000
+       sizeincrease 10
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 30 30 30
+       velocitymultiplier 10
 effect flamethrower
-count 2
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 30
-sizeincrease -10
- gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 10 10 10
-velocitymultiplier 15
-airfriction 0.3
-//smoke
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 2
+       gravity -0.060000
+       sizeincrease -10
+       size 20 30
+       tex 48 55
+       type smoke
+       velocityjitter 10 10 10
+       velocitymultiplier 15
 effect flamethrower
-count 0.5
-type alphastatic
-tex 0 8
-size 5 15
-sizeincrease 7
-color 0x000000 0x111111
-alpha 256 256 90
-//gravity -0.2
-originjitter 10 10 10
-velocitymultiplier 20
-velocityoffset 0 0 10
-airfriction 1
-
-// port-o-launch trail
-// glowing vapor trail
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_WIZSPIKE"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_WIZSPIKE"), from, to)
+       airfriction 1
+       alpha 256 256 90
+       color 0x000000 0x111111
+       count 0.500000
+       originjitter 10 10 10
+       sizeincrease 7
+       size 5 15
+       tex 0 8
+       type alphastatic
+       velocitymultiplier 20
+       velocityoffset 0 0 10
 effect TR_WIZSPIKE
-trailspacing 4
-type static
-color 0x404040 0x404040
-size 3 3
-tex 62 62
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0x404040 0x404040
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 62 62
+       trailspacing 4
+       type static
+       velocitymultiplier -0.100000
 effect TR_WIZSPIKE
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0x404040 0x404040
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// TAG trail
-// glowing vapor trail
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_VORESPIKE"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_VORESPIKE"), from, to)
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0x404040 0x404040
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect TR_VORESPIKE
-trailspacing 4
-type static
-color 0x804000 0x804000
-size 3 3
-tex 62 62
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0x804000 0x804000
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 62 62
+       trailspacing 4
+       type static
+       velocitymultiplier -0.100000
 effect TR_VORESPIKE
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0xff8000 0xff8000
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// used in qcsrc/client/damage.qc:                                     pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1)
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0xff8000 0xff8000
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect flac_explode
-countabsolute 1
-type decal
-tex 8 16
-size 18 28
-alpha 256 256 0
-originjitter 40 40 40
-lightradius 150
-lightradiusfade 400
-lightcolor 8 4 1
-// fire effect which make bright dot inside
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 1
+       lightradiusfade 400
+       lightradius 150
+       originjitter 40 40 40
+       size 18 28
+       tex 8 16
+       type decal
 effect flac_explode
-notunderwater
-count 3
-type smoke
-tex 48 55
-color 0xffe955 0xff5a00
-size 6 16
-sizeincrease 5
-alpha 128 256 456
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 156 156 156
-// fire effect which expands then slows
+       airfriction 8
+       alpha 128 256 456
+       bounce 1.500000
+       color 0xffe955 0xff5a00
+       count 3
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 5
+       size 6 16
+       tex 48 55
+       type smoke
+       velocityjitter 156 156 156
 effect flac_explode
-notunderwater
-count 6
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 10 16
-sizeincrease 15
-alpha 128 256 456
-bounce 1.5
-airfriction 12
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 256 256 256
-
-// smoke
+       airfriction 12
+       alpha 128 256 456
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 6
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 15
+       size 10 16
+       tex 48 55
+       type static
+       velocityjitter 256 256 256
 effect flac_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 5
-size 10 20
-sizeincrease 20
-alpha 500 600 556
-velocityjitter 244 244 244
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-
-// underwater bubbles
+       airfriction 5
+       alpha 500 600 556
+       bounce 2
+       color 0x000000 0x111111
+       count 5
+       notunderwater
+       sizeincrease 20
+       size 10 20
+       tex 0 8
+       type alphastatic
+       velocityjitter 244 244 244
 effect flac_explode
-underwater
-count 8
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 2
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 8
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 1 2
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect flac_explode
-notunderwater
-count 4
-type spark
-color 0x903010 0xFFD030
-size 2 2
-tex 40 40
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-
-// bullet trail (somewhat like a tracer)
-// used in qcsrc/server/w_common.qc:                           zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("tr_bullet"), from, to)
+       airfriction 0.200000
+       alpha 256 256 384
+       bounce 1.500000
+       color 0x903010 0xFFD030
+       count 4
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 2 2
+       tex 40 40
+       type spark
+       velocityjitter 256 256 256
+       velocityoffset 0 0 80
 effect tr_bullet
-trailspacing 750
-type spark
-tex 70 70
-color 0xff8960 0xff8533
-alpha 256 256 2560
-size 4 4
-stretchfactor 0.2
-velocitymultiplier 3
-
-// smoke emitter for small pipes
-// used nowhere in code
+       alpha 256 256 2560
+       color 0xff8960 0xff8533
+       size 4 4
+       stretchfactor 0.200000
+       tex 70 70
+       trailspacing 750
+       type spark
+       velocitymultiplier 3
 effect smoking_smallemitter
-count 10
-type alphastatic
-tex 0 8
-color 0x292929 0x000000
-size 6 15
-sizeincrease 20
-alpha 200 256 100
-gravity -0.1
-bounce 0
-originjitter 10 10 10
-velocityjitter 5 5 20
-//velocitymultiplier -20
-airfriction -1
-
-// crylink trail
-// plasma smoke
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_CRYLINKPLASMA"), from, to)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_CRYLINKPLASMA"), from, to)
+       airfriction -1
+       alpha 200 256 100
+       color 0x292929 0x000000
+       count 10
+       gravity -0.100000
+       originjitter 10 10 10
+       sizeincrease 20
+       size 6 15
+       tex 0 8
+       type alphastatic
+       velocityjitter 5 5 20
 effect TR_CRYLINKPLASMA
-trailspacing 128
-type static
-color 0x5522aa 0x6622ff
-size 2 2
-sizeincrease 8
-tex 32 32
-alpha 256 256 1024
-velocityjitter 8 8 8
-//lightradius 90
-//lighttime 0
-//lightcolor 1 0 1
-velocitymultiplier -0.01
-// crylink main trail
+       alpha 256 256 1024
+       color 0x5522aa 0x6622ff
+       sizeincrease 8
+       size 2 2
+       tex 32 32
+       trailspacing 128
+       type static
+       velocityjitter 8 8 8
+       velocitymultiplier -0.010000
 effect TR_CRYLINKPLASMA
-trailspacing 16
-type static
-color 0x5522aa 0x6622ff
-size 3 3
-sizeincrease 15
-tex 3 3
-alpha 256 256 2600
-velocityjitter 2 2 2
-velocitymultiplier 0.01
-
+       alpha 256 256 2600
+       color 0x5522aa 0x6622ff
+       sizeincrease 15
+       size 3 3
+       tex 3 3
+       trailspacing 16
+       type static
+       velocityjitter 2 2 2
+       velocitymultiplier 0.010000
 effect cherryblossom
-count 1.5
-type static
-color 0xb123ff 0xb183ff
-size 1.5 2
-alpha 128 256 32
-gravity 0.05
-bounce 1.5
-airfriction 1
-liquidfriction 1
-originjitter 16 16 16
-velocityjitter 32 32 0
-tex 40 40
-//lightradius 200
-//lighttime 0
-
+       airfriction 1
+       alpha 128 256 32
+       bounce 1.500000
+       color 0xb123ff 0xb183ff
+       count 1.500000
+       gravity 0.050000
+       liquidfriction 1
+       originjitter 16 16 16
+       size 1.500000 2
+       tex 40 40
+       type static
+       velocityjitter 32 32 0
 effect alien_blood
-count 0.4
-type spark
-blend invmod
-tex 24 32
-size 5 11
-alpha 1560 2560 7000
-color 0xDC9BCD 0xDC9BCD
-bounce -1
-airfriction 0.4
-velocityjitter 99 99 55
-//velocitymultiplier 2
-staincolor 0xDC9BCD 0xDC9BCD
-staintex 16 24
-stainsize 1 2
-stretchfactor 25
-sizeincrease 20
-//blood mist
+       airfriction 0.400000
+       alpha 1560 2560 7000
+       blend invmod
+       bounce -1
+       color 0xDC9BCD 0xDC9BCD
+       count 0.400000
+       sizeincrease 20
+       size 5 11
+       staincolor 0xDC9BCD 0xDC9BCD
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 25
+       tex 24 32
+       type spark
+       velocityjitter 99 99 55
 effect alien_blood
-countabsolute 1
-type smoke
-blend invmod
-tex 24 32
-size 25 30
-sizeincrease 20
-alpha 3000 5560 12000
-color 0xDC9BCD 0xDC9BCD
-originjitter 11 11 11
-
+       alpha 3000 5560 12000
+       blend invmod
+       color 0xDC9BCD 0xDC9BCD
+       countabsolute 1
+       originjitter 11 11 11
+       sizeincrease 20
+       size 25 30
+       tex 24 32
+       type smoke
 effect robot_blood
-count 0.167
-type spark
-tex 70 70
-size 1 2
-alpha 256 256 64
-color 0xff3000 0xff7373
-bounce -1
-gravity 1
-airfriction 1
-liquidfriction 4
-velocityjitter 264 264 264
-velocityoffset 0 0 100
-//shockwave
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xff3000 0xff7373
+       count 0.167000
+       gravity 1
+       liquidfriction 4
+       size 1 2
+       tex 70 70
+       type spark
+       velocityjitter 264 264 264
+       velocityoffset 0 0 100
 effect robot_blood
-countabsolute 1
-type smoke
-tex 74 74
-size 2 2
-alpha 0 90 1000
-color 0xff8400 0xffbb72
-originjitter 11 11 11
-sizeincrease 800
-// electo sparcks
+       alpha 0 90 1000
+       color 0xff8400 0xffbb72
+       countabsolute 1
+       originjitter 11 11 11
+       sizeincrease 800
+       size 2 2
+       tex 74 74
+       type smoke
 effect robot_blood
-count 0.1
-type smoke
-tex 71 73
-size 20 40
-alpha 256 256 5120
-color 0xff3000 0xff8585
-originjitter 41 41 21
-rotate -180 180 4000 -4000
-
-
-
+       alpha 256 256 5120
+       color 0xff3000 0xff8585
+       count 0.100000
+       originjitter 41 41 21
+       rotate -180 180 4000 -4000
+       size 20 40
+       tex 71 73
+       type smoke
 effect alien_TR_BLOOD
-trailspacing 20
-type spark
-blend invmod
-color 0xC080B0 0xC080B0
-tex 24 32
-size 4 19
-alpha 384 984 1492
-bounce -1
-gravity 0.4
-airfriction -2
-liquidfriction 1
-velocityjitter 64 64 64
-velocitymultiplier -0.1
-staincolor 0xC080B0 0xC080B0
-staintex 16 24
-stainsize 1 2
-stretchfactor 7
-sizeincrease -5
-// splash around gib
-effect TR_BLOOD
-trailspacing 42
-type blood
-color 0xA8FFFF 0xA8FFFF
-tex 24 32
-size 4 6
-alpha 684 684 7492
-sizeincrease 500
-
+       airfriction -2
+       alpha 384 984 1492
+       blend invmod
+       bounce -1
+       color 0xC080B0 0xC080B0
+       gravity 0.400000
+       liquidfriction 1
+       sizeincrease -5
+       size 4 19
+       staincolor 0xC080B0 0xC080B0
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 7
+       tex 24 32
+       trailspacing 20
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier -0.100000
+effect alien_TR_BLOOD
+       alpha 684 684 7492
+       color 0xA8FFFF 0xA8FFFF
+       sizeincrease 500
+       size 4 6
+       tex 24 32
+       trailspacing 42
+       type blood
 effect robot_TR_BLOOD
-trailspacing 16
-type spark
-blend invmod
-color 0xC0D890 0xC0D890
-tex 24 32
-size 4 13
-alpha 384 984 1892
-bounce -1
-gravity 0.4
-airfriction -2
-liquidfriction 1
-velocityjitter 64 64 64
-velocitymultiplier -0.3
-staincolor 0x808080 0x808080
-staintex 16 24
-stainsize 1 3
-stretchfactor 6
-sizeincrease -6
-// fire
+       airfriction -2
+       alpha 384 984 1892
+       blend invmod
+       bounce -1
+       color 0xC0D890 0xC0D890
+       gravity 0.400000
+       liquidfriction 1
+       sizeincrease -6
+       size 4 13
+       staincolor 0x808080 0x808080
+       stainsize 1 3
+       staintex 16 24
+       stretchfactor 6
+       tex 24 32
+       trailspacing 16
+       type spark
+       velocityjitter 64 64 64
+       velocitymultiplier -0.300000
 effect robot_TR_BLOOD
-notunderwater
-trailspacing 16
-type spark
-tex 48 55
-color 0x902010 0xff3600
-size 5 20
-alpha 128 256 900
-gravity -1
-airfriction 4
-liquidfriction 4
-stretchfactor 5
-sizeincrease 10
-velocityjitter 44 44 44
-// arcs
+       airfriction 4
+       alpha 128 256 900
+       color 0x902010 0xff3600
+       gravity -1
+       liquidfriction 4
+       notunderwater
+       sizeincrease 10
+       size 5 20
+       stretchfactor 5
+       tex 48 55
+       trailspacing 16
+       type spark
+       velocityjitter 44 44 44
 effect robot_TR_BLOOD
-trailspacing 128
-type smoke
-tex 71 73
-color 0xff3000 0xff8585
-size 25 30
-alpha 1128 1256 44900
-rotate -180 180 4000 -4000
-velocityjitter 44 44 44
-
-
+       alpha 1128 1256 44900
+       color 0xff3000 0xff8585
+       rotate -180 180 4000 -4000
+       size 25 30
+       tex 71 73
+       trailspacing 128
+       type smoke
+       velocityjitter 44 44 44
 effect alien_TR_SLIGHTBLOOD
-trailspacing 64
-type blood
-color 0xC080B0 0xC080B0
-tex 24 32
-size 80 80
-alpha 384 384 192
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 0.5
-staincolor 0x808080 0x808080
-staintex 16 24
-
+       airfriction 1
+       alpha 384 384 192
+       bounce -1
+       color 0xC080B0 0xC080B0
+       liquidfriction 4
+       size 80 80
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       trailspacing 64
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 0.500000
 effect robot_TR_SLIGHTBLOOD
-trailspacing 64
-type blood
-color 0xC0D890 0xC0D890
-tex 24 32
-size 8 8
-alpha 384 384 192
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 0.5
-staincolor 0x808080 0x808080
-staintex 16 24
-
-// flare particle and light
-// used in qcsrc/server/t_items.qc:    pointparticles(particleeffectnum("item_pickup"), self.origin, '0 0 0', 1)
+       airfriction 1
+       alpha 384 384 192
+       bounce -1
+       color 0xC0D890 0xC0D890
+       liquidfriction 4
+       size 8 8
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       trailspacing 64
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 0.500000
 effect item_pickup
-countabsolute 1
-type static
-color 0x63F2EA 0xB0C5C4
-size 8 16
-alpha 128 64 64
-// cloud of particles which expand rapidly and then slow to form a ball
+       alpha 128 64 64
+       color 0x63F2EA 0xB0C5C4
+       countabsolute 1
+       size 8 16
+       type static
 effect item_pickup
-count 32
-type spark
-tex 41 41
-color 0x63F2EA 0xB0C5C4
-size 1 1
-alpha 256 256 1280
-//originjitter 24 24 24
-velocityjitter 256 256 256
-
+       alpha 256 256 1280
+       color 0x63F2EA 0xB0C5C4
+       count 32
+       size 1 1
+       tex 41 41
+       type spark
+       velocityjitter 256 256 256
 effect bloodshower
-count 125
-type spark
-blend invmod
-tex 24 32
-size 8 28
-color 0xA8FFFF 0xA8FFFFF
-alpha 156 656 1664
-bounce -1
-gravity 1
-stretchfactor 3
-liquidfriction 4
-velocityjitter 764 764 764
-// velocitymultiplier 1
-staincolor 0x808080 0x808080
-staintex 16 24
-stainsize 1 2
-// center blood
+       alpha 156 656 1664
+       blend invmod
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 125
+       gravity 1
+       liquidfriction 4
+       size 8 28
+       staincolor 0x808080 0x808080
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 3
+       tex 24 32
+       type spark
+       velocityjitter 764 764 764
 effect bloodshower
-countabsolute 0.1
-type smoke
-blend invmod
-tex 24 32
-size 1 28
-sizeincrease 300
-originjitter 50 50 50
-color 0xA8FFFF 0xA8FFFFF
-alpha 156 656 1664
-
+       alpha 156 656 1664
+       blend invmod
+       color 0xA8FFFF 0xA8FFFFF
+       countabsolute 0.100000
+       originjitter 50 50 50
+       sizeincrease 300
+       size 1 28
+       tex 24 32
+       type smoke
 effect alien_bloodshower
-count 125
-type spark
-blend invmod
-tex 24 32
-size 8 28
-color 0xC080B0 0xC080B0
-alpha 156 656 1664
-bounce -1
-gravity 1
-stretchfactor 3
-liquidfriction 4
-velocityjitter 764 764 764
-// velocitymultiplier 1
-staincolor 0xC080B0 0xC080B0
-staintex 16 24
-stainsize 1 2
-// center blood
-effect bloodshower
-countabsolute 0.1
-type smoke
-blend invmod
-tex 24 32
-size 1 28
-sizeincrease 300
-originjitter 50 50 50
-color 0xA8FFFF 0xA8FFFFF
-alpha 156 656 1664
-
-
+       alpha 156 656 1664
+       blend invmod
+       bounce -1
+       color 0xC080B0 0xC080B0
+       count 125
+       gravity 1
+       liquidfriction 4
+       size 8 28
+       staincolor 0xC080B0 0xC080B0
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 3
+       tex 24 32
+       type spark
+       velocityjitter 764 764 764
+effect alien_bloodshower
+       alpha 156 656 1664
+       blend invmod
+       color 0xA8FFFF 0xA8FFFFF
+       countabsolute 0.100000
+       originjitter 50 50 50
+       sizeincrease 300
+       size 1 28
+       tex 24 32
+       type smoke
 effect robot_bloodshower
-count 100
-type spark
-blend invmod
-tex 24 32
-size 8 28
-color 0xC0D890 0xC0D890
-alpha 156 656 1664
-bounce -1
-gravity 1
-stretchfactor 3
-liquidfriction 4
-velocityjitter 764 764 764
-// velocitymultiplier 1
-staincolor 0xC0D890 0xC0D890
-staintex 16 24
-stainsize 1 2
-// arc
+       alpha 156 656 1664
+       blend invmod
+       bounce -1
+       color 0xC0D890 0xC0D890
+       count 100
+       gravity 1
+       liquidfriction 4
+       size 8 28
+       staincolor 0xC0D890 0xC0D890
+       stainsize 1 2
+       staintex 16 24
+       stretchfactor 3
+       tex 24 32
+       type spark
+       velocityjitter 764 764 764
 effect robot_bloodshower
-count 2.5
-type smoke
-tex 71 73
-color 0xff3000 0xff8585
-size 25 40
-alpha 1128 1256 4200
-rotate -180 180 99 -99
-velocityjitter 44 44 44
-originjitter 150 150 150
-// shockwave
+       alpha 1128 1256 4200
+       color 0xff3000 0xff8585
+       count 2.500000
+       originjitter 150 150 150
+       rotate -180 180 99 -99
+       size 25 40
+       tex 71 73
+       type smoke
+       velocityjitter 44 44 44
 effect robot_bloodshower
-count 2.5
-type smoke
-tex 74 74
-color 0xff3000 0xff8585
-size 5 50
-sizeincrease 3000
-alpha 11 125 990
-
-//red_ground_quake
-//smoke
-// used in qsrc/server/ctf.qc:         pointparticles(particleeffectnum("red_ground_quake"), self.origin, '0 0 0', 1);
+       alpha 11 125 990
+       color 0xff3000 0xff8585
+       count 2.500000
+       sizeincrease 3000
+       size 5 50
+       tex 74 74
+       type smoke
 effect red_ground_quake
-type smoke
-count 90
-tex 0 8
-size 20 50
-sizeincrease 100
-gravity 0.5
-time 5 10
-airfriction 3
-alpha 100 126 200
-color 0x111111 0xbbbbbb
-//originjitter 2 2 0
-velocityjitter 190 190 50
-bounce 1.1
-notunderwater
+       airfriction 3
+       alpha 100 126 200
+       bounce 1.100000
+       color 0x111111 0xbbbbbb
+       count 90
+       gravity 0.500000
+       notunderwater
+       sizeincrease 100
+       size 20 50
+       tex 0 8
+       time 5 10
+       type smoke
+       velocityjitter 190 190 50
 effect red_ground_quake
-type smoke
-count 40
-tex 0 8
-size 10 30
-sizeincrease 60
-gravity 0.2
-time 10 15
-airfriction 4
-alpha 100 126 200
-color 0x111111 0x979797
-//originjitter 2 2 0
-velocityjitter 190 190 50
-bounce 1.2
-notunderwater
+       airfriction 4
+       alpha 100 126 200
+       bounce 1.200000
+       color 0x111111 0x979797
+       count 40
+       gravity 0.200000
+       notunderwater
+       sizeincrease 60
+       size 10 30
+       tex 0 8
+       time 10 15
+       type smoke
+       velocityjitter 190 190 50
 effect red_ground_quake
-//notunderwater
-count 16
-type smoke
-tex 48 55
-size 4 20
-time 15 25
-alpha 200 356 512
-gravity -0.5
-color 0x9E6A64 0x91302D
-bounce 6
-sizeincrease 5
-originjitter 33 33 33
-velocityjitter 22 22 50
-// smoke
+       alpha 200 356 512
+       bounce 6
+       color 0x9E6A64 0x91302D
+       count 16
+       gravity -0.500000
+       originjitter 33 33 33
+       sizeincrease 5
+       size 4 20
+       tex 48 55
+       time 15 25
+       type smoke
+       velocityjitter 22 22 50
 effect red_ground_quake
-type alphastatic
-count 11
-tex 0 8
-size 22 33
-sizeincrease 11
-time 25 35
-alpha 200 256 200
-color 0x000000 0xffffff
-gravity -0.3
-originjitter 44 44 44
-velocityjitter 11 11 50
-bounce 2
-
-//blue_ground_quake
-//smoke
-// used in qsrc/server/ctf.qc:         pointparticles(particleeffectnum("blue_ground_quake"), self.origin, '0 0 0', 1);
+       alpha 200 256 200
+       bounce 2
+       color 0x000000 0xffffff
+       count 11
+       gravity -0.300000
+       originjitter 44 44 44
+       sizeincrease 11
+       size 22 33
+       tex 0 8
+       time 25 35
+       type alphastatic
+       velocityjitter 11 11 50
 effect blue_ground_quake
-type smoke
-count 90
-tex 0 8
-size 20 50
-sizeincrease 100
-gravity 0.5
-time 5 10
-airfriction 3
-alpha 100 126 200
-color 0x111111 0xbbbbbb
-//originjitter 2 2 0
-velocityjitter 190 190 50
-bounce 1.1
-notunderwater
+       airfriction 3
+       alpha 100 126 200
+       bounce 1.100000
+       color 0x111111 0xbbbbbb
+       count 90
+       gravity 0.500000
+       notunderwater
+       sizeincrease 100
+       size 20 50
+       tex 0 8
+       time 5 10
+       type smoke
+       velocityjitter 190 190 50
 effect blue_ground_quake
-type smoke
-count 40
-tex 0 8
-size 10 30
-sizeincrease 60
-gravity 0.2
-time 10 15
-airfriction 4
-alpha 100 126 200
-color 0x111111 0x979797
-//originjitter 2 2 0
-velocityjitter 190 190 50
-bounce 1.2
-notunderwater
+       airfriction 4
+       alpha 100 126 200
+       bounce 1.200000
+       color 0x111111 0x979797
+       count 40
+       gravity 0.200000
+       notunderwater
+       sizeincrease 60
+       size 10 30
+       tex 0 8
+       time 10 15
+       type smoke
+       velocityjitter 190 190 50
 effect blue_ground_quake
-//notunderwater
-count 16
-type smoke
-tex 48 55
-size 4 20
-time 15 25
-alpha 200 356 512
-gravity -0.5
-color 0x64679E 0x2D4C91
-bounce 6
-sizeincrease 5
-originjitter 33 33 33
-velocityjitter 22 22 50
-// smoke
+       alpha 200 356 512
+       bounce 6
+       color 0x64679E 0x2D4C91
+       count 16
+       gravity -0.500000
+       originjitter 33 33 33
+       sizeincrease 5
+       size 4 20
+       tex 48 55
+       time 15 25
+       type smoke
+       velocityjitter 22 22 50
 effect blue_ground_quake
-type alphastatic
-count 11
-tex 0 8
-size 22 33
-sizeincrease 11
-time 25 35
-alpha 200 256 200
-color 0x000000 0xffffff
-gravity -0.3
-originjitter 44 44 44
-velocityjitter 11 11 50
-bounce 2
-
-
-
-// cl_gentle impact effect indicating damage
-// maintained by morphed
-// used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16)
+       alpha 200 256 200
+       bounce 2
+       color 0x000000 0xffffff
+       count 11
+       gravity -0.300000
+       originjitter 44 44 44
+       sizeincrease 11
+       size 22 33
+       tex 0 8
+       time 25 35
+       type alphastatic
+       velocityjitter 11 11 50
 effect morphed_damage_hit
-tex 43 43
-count 0.5
-type spark
-color 0xffffff 0x9271fb
-size 14 24
-sizeincrease -24
-alpha 128 128 292
-gravity -0.4
-airfriction 5
-liquidfriction 10
-velocityjitter 356 356 456
-
+       airfriction 5
+       alpha 128 128 292
+       color 0xffffff 0x9271fb
+       count 0.500000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -24
+       size 14 24
+       tex 43 43
+       type spark
+       velocityjitter 356 356 456
 effect morphed_damage_hit
-tex 0 8
-count 0.5
-type smoke
-color 0xffffff 0x9271fb
-size 24 24
-sizeincrease -24
-alpha 128 128 292
-airfriction 5
-liquidfriction 10
-originjitter 10 10 10
-
-
-// effect for removing player model
-// "teleport"
-
-// cl_gentle deathfx
-// used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount)
+       airfriction 5
+       alpha 128 128 292
+       color 0xffffff 0x9271fb
+       count 0.500000
+       liquidfriction 10
+       originjitter 10 10 10
+       sizeincrease -24
+       size 24 24
+       tex 0 8
+       type smoke
 effect morphed_damage_dissolve
-tex 43 43
-count 10
-type smoke
-color 0xffffff 0x9271fb
-size 40 40
-sizeincrease -16
-alpha 456 456 1828
-gravity -1.9
-airfriction 8
-liquidfriction 6
-velocityjitter 256 256 512
-rotate -180 180 -399 -99
-
+       airfriction 8
+       alpha 456 456 1828
+       color 0xffffff 0x9271fb
+       count 10
+       gravity -1.900000
+       liquidfriction 6
+       rotate -180 180 -399 -99
+       sizeincrease -16
+       size 40 40
+       tex 43 43
+       type smoke
+       velocityjitter 256 256 512
 effect morphed_damage_dissolve
-tex 43 43
-count 2.5
-type smoke
-color 0x7bdbff 0xbed2ff
-size 40 40
-sizeincrease -16
-alpha 256 256 628
-gravity -0.8
-airfriction 9
-liquidfriction 6
-velocityjitter 256 256 512
-rotate -180 180 0 0
-
+       airfriction 9
+       alpha 256 256 628
+       color 0x7bdbff 0xbed2ff
+       count 2.500000
+       gravity -0.800000
+       liquidfriction 6
+       rotate -180 180 0 0
+       sizeincrease -16
+       size 40 40
+       tex 43 43
+       type smoke
+       velocityjitter 256 256 512
 effect morphed_damage_dissolve
-tex 65 65
-count 5
-type smoke
-color 0xffffff 0x9271fb
-size 44 44
-sizeincrease -16
-alpha 156 156 128
-airfriction 3
-liquidfriction 6
-originjitter 22 22 76
-
+       airfriction 3
+       alpha 156 156 128
+       color 0xffffff 0x9271fb
+       count 5
+       liquidfriction 6
+       originjitter 22 22 76
+       sizeincrease -16
+       size 44 44
+       tex 65 65
+       type smoke
 effect morphed_damage_dissolve
-tex 46 46
-count 15
-type smoke
-color 0xffffff 0x9271fb
-size 32 32
-sizeincrease -16
-alpha 56 56 128
-gravity 1
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 400 400 0
-rotate -180 180 999 -999
-
-// Team / hit minsta effects
+       airfriction 3
+       alpha 56 56 128
+       bounce 1.500000
+       color 0xffffff 0x9271fb
+       count 15
+       gravity 1
+       liquidfriction 6
+       rotate -180 180 999 -999
+       sizeincrease -16
+       size 32 32
+       tex 46 46
+       type smoke
+       velocityjitter 400 400 0
 effect TE_TEI_G3RED
-countabsolute 1
-type beam
-tex 200 200
-color 0xFF0000 0xFF0000
-size 4 4
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0xFF0000 0xFF0011
+       countabsolute 1
+       size 4 4
+       tex 200 200
+       type beam
 effect TE_TEI_G3RED
-trailspacing 8
-type static
-color 0x200000 0x400000
-size 0.3 0.3
-sizeincrease 3
-tex 46 46
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 3 3 3
-type smoke
-
+       airfriction -4
+       alpha 256 256 512
+       color 0x200000 0x400000
+       sizeincrease 3
+       size 0.300000 0.300000
+       tex 46 46
+       trailspacing 8
+       type smoke
+       velocityjitter 3 3 3
 effect TE_TEI_G3RED_HIT
-countabsolute 1
-type beam
-tex 200 200
-color 0xFF0000 0xFF0000
-size 8 8
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0xFF0000 0xFF0011
+       countabsolute 1
+       size 8 8
+       tex 200 200
+       type beam
 effect TE_TEI_G3RED_HIT
-trailspacing 20
-type static
-color 0xFFFFFF 0xFF0011
-size 2 2
-sizeincrease -2
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 2 2 2
-type smoke
-// rings
+       airfriction -4
+       alpha 256 256 512
+       color 0xFFFFFF 0xFF0011
+       sizeincrease -2
+       size 2 2
+       trailspacing 20
+       type smoke
+       velocityjitter 2 2 2
 effect TE_TEI_G3RED_HIT
-trailspacing 40
-type static
-color 0xFF0000 0xFF0011
-size 10 10 
-sizeincrease -6
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-type smoke
-
+       airfriction -4
+       alpha 256 256 512
+       color 0xFF0000 0xFF0011
+       sizeincrease -6
+       size 10 10
+       trailspacing 40
+       type smoke
 effect TE_TEI_G3BLUE
-countabsolute 1
-type beam
-tex 200 200
-color 0x0000FF 0x1100FF
-size 4 4
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0x0000FF 0x1100FF
+       countabsolute 1
+       size 4 4
+       tex 200 200
+       type beam
 effect TE_TEI_G3BLUE
-trailspacing 8
-type static
-color 0x000020 0x000040
-size 0.3 0.3
-sizeincrease 3
-tex 46 46
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 3 3 3
-type smoke
-
+       airfriction -4
+       alpha 256 256 512
+       color 0x000020 0x000040
+       sizeincrease 3
+       size 0.300000 0.300000
+       tex 46 46
+       trailspacing 8
+       type smoke
+       velocityjitter 3 3 3
 effect TE_TEI_G3BLUE_HIT
-countabsolute 1
-type beam
-tex 200 200
-color 0x0000FF 0x1100FF
-size 8 8
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0x0000FF 0x1100FF
+       countabsolute 1
+       size 8 8
+       tex 200 200
+       type beam
 effect TE_TEI_G3BLUE_HIT
-trailspacing 20
-type static
-color 0xFFFFFF 0x100FF
-size 2 2
-sizeincrease -2
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 2 2 2
-type smoke
-// rings
+       airfriction -4
+       alpha 256 256 512
+       color 0xFFFFFF 0x1100FF
+       sizeincrease -2
+       size 2 2
+       trailspacing 20
+       type smoke
+       velocityjitter 2 2 2
 effect TE_TEI_G3BLUE_HIT
-trailspacing 40
-type static
-color 0x0000FF 0x1100FF
-size 10 10 
-sizeincrease -6
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-type smoke
-
-// Yellow 
+       airfriction -4
+       alpha 256 256 512
+       color 0x0000FF 0x1100FF
+       sizeincrease -6
+       size 10 10
+       trailspacing 40
+       type smoke
 effect TE_TEI_G3YELLOW
-countabsolute 1
-type beam
-tex 200 200
-color 0xffff00 0xffff11
-size 4 4
-alpha 128 128 256
+       alpha 128 128 256
+       color 0xffff00 0xffff11
+       countabsolute 1
+       size 4 4
+       tex 200 200
+       type beam
 effect TE_TEI_G3YELLOW
-trailspacing 8
-type static
-color 0x202000 0x404000
-size 0.3 0.3
-sizeincrease 3
-tex 46 46
-alpha 256 256 512
-airfriction -4
-velocityjitter 3 3 3
-type smoke
-
+       airfriction -4
+       alpha 256 256 512
+       color 0x202000 0x404000
+       sizeincrease 3
+       size 0.300000 0.300000
+       tex 46 46
+       trailspacing 8
+       type smoke
+       velocityjitter 3 3 3
 effect TE_TEI_G3YELLOW_HIT
-countabsolute 1
-type beam
-tex 200 200
-color 0xffff00 0xffff11
-size 8 8
-alpha 128 128 256
+       alpha 128 128 256
+       color 0xffff00 0xffff11
+       countabsolute 1
+       size 8 8
+       tex 200 200
+       type beam
 effect TE_TEI_G3YELLOW_HIT
-trailspacing 20
-type static
-color 0xFFFFFF 0xffff10
-size 2 2
-sizeincrease -2
-alpha 256 256 512
-airfriction -4
-velocityjitter 2 2 2
-type smoke
-// rings
+       airfriction -4
+       alpha 256 256 512
+       color 0xFFFFFF 0xffff11
+       sizeincrease -2
+       size 2 2
+       trailspacing 20
+       type smoke
+       velocityjitter 2 2 2
 effect TE_TEI_G3YELLOW_HIT
-trailspacing 40
-type static
-color 0xffff00 0xffff11
-size 10 10 
-sizeincrease -6
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-type smoke
-
-
-// Pink
-effect TE_TEI_G3PINK
-countabsolute 1
-type beam
-tex 200 200
-color 0xFF00FF 0xFF11FF
-size 4 4
-alpha 128 128 256
-// experimental
+       airfriction -4
+       alpha 256 256 512
+       color 0xffff00 0xffff11
+       sizeincrease -6
+       size 10 10
+       trailspacing 40
+       type smoke
 effect TE_TEI_G3PINK
-trailspacing 8
-type static
-color 0x200020 0x400040
-size 0.3 0.3
-sizeincrease 3
-tex 46 46
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 3 3 3
-type smoke
-
+       alpha 128 128 256
+       color 0xFF00FF 0xFF11FF
+       countabsolute 1
+       size 4 4
+       tex 200 200
+       type beam
+effect TE_TEI_G3PINK
+       airfriction -4
+       alpha 256 256 512
+       color 0x200020 0x400040
+       sizeincrease 3
+       size 0.300000 0.300000
+       tex 46 46
+       trailspacing 8
+       type smoke
+       velocityjitter 3 3 3
 effect TE_TEI_G3PINK_HIT
-countabsolute 1
-type beam
-tex 200 200
-color 0xFF00FF 0xFF11FF
-size 8 8
-alpha 128 128 256
-// experimental
+       alpha 128 128 256
+       color 0xFF00FF 0xFF11FF
+       countabsolute 1
+       size 8 8
+       tex 200 200
+       type beam
 effect TE_TEI_G3PINK_HIT
-trailspacing 20
-type static
-color 0xFFFFFF 0xFF10FF
-size 2 2
-sizeincrease -2
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-velocityjitter 2 2 2
-type smoke
-// rings
+       airfriction -4
+       alpha 256 256 512
+       color 0xFFFFFF 0xFF11FF
+       sizeincrease -2
+       size 2 2
+       trailspacing 20
+       type smoke
+       velocityjitter 2 2 2
 effect TE_TEI_G3PINK_HIT
-trailspacing 40
-type static
-color 0xFF00FF 0xFF11FF
-size 10 10 
-sizeincrease -6
-alpha 256 256 512
-airfriction -4
-//liquidfriction -4
-type smoke
-
-
-
-
-// cl_gentle impact effect indicating damage
-// maintained by particlegibs
-// used in qcsrc/client/gibs.qc:                        pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16)
-// core decal
+       airfriction -4
+       alpha 256 256 512
+       color 0xFF00FF 0xFF11FF
+       sizeincrease -6
+       size 10 10
+       trailspacing 40
+       type smoke
 effect particlegibs_damage_hit
-type blood
-count 0.5
-tex 0 8
-size 5 10
-color 0xA8FFFF 0xA8FFFFF
-alpha 256 256 428
-gravity 1
-bounce -1
-airfriction 3
-liquidfriction 6
-velocityjitter 156 156 212
-staincolor 0x808080 0x808080
-staintex 16 24
-// front blood
+       airfriction 3
+       alpha 256 256 428
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.500000
+       gravity 1
+       liquidfriction 6
+       size 5 10
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 0 8
+       type blood
+       velocityjitter 156 156 212
 effect particlegibs_damage_hit
-type blood
-count 0.1
-tex 24 32
-size 10 20
-color 0xA8FFFF 0xA8FFFFF
-sizeincrease -15
-alpha 256 256 328
-bounce -1
-gravity 0.5
-airfriction 1
-liquidfriction 3
-velocityjitter 6 6 30
-velocitymultiplier -1
-staincolor 0x808080 0x808080
-staintex 16 24
-// back blood
+       airfriction 1
+       alpha 256 256 328
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.100000
+       gravity 0.500000
+       liquidfriction 3
+       sizeincrease -15
+       size 10 20
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 6 6 30
+       velocitymultiplier -1
 effect particlegibs_damage_hit
-type blood
-count 0.1
-tex 24 32
-size 5 15
-color 0xA8FFFF 0xA8FFFFF
-sizeincrease 10
-alpha 256 256 328
-bounce -1
-gravity 1
-airfriction 1
-liquidfriction 3
-velocityjitter 26 26 112
-originjitter 3 3 3
-velocitymultiplier 2
-staincolor 0x808080 0x808080
-staintex 16 24
-// effect for removing player model
-// "teleport"
-// cl_gentle deathfx
-// used in qcsrc/client/gibs.qc:                        pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount)
-// small core blood no decals
+       airfriction 1
+       alpha 256 256 328
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.100000
+       gravity 1
+       liquidfriction 3
+       originjitter 3 3 3
+       sizeincrease 10
+       size 5 15
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 26 26 112
+       velocitymultiplier 2
 effect particlegibs_damage_dissolve
-type blood
-count 32
-tex 0 8
-size 15 20
-color 0x00ffff 0x82ffff
-alpha 256 256 328
-gravity 1
-airfriction 3
-liquidfriction 6
-originjitter 10 10 25
-velocityjitter 256 256 312
-staincolor 0x808080 0x808080
-staintex 16 24
-// core decal
+       airfriction 3
+       alpha 256 256 328
+       color 0x00ffff 0x82ffff
+       count 32
+       gravity 1
+       liquidfriction 6
+       originjitter 10 10 25
+       size 15 20
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 0 8
+       type blood
+       velocityjitter 256 256 312
 effect particlegibs_damage_dissolve
-type blood
-count 12
-tex 0 8
-size 20 40
-color 0xA8FFFF 0xA8FFFFF
-alpha 256 256 528
-gravity 2
-bounce -1
-airfriction 2
-liquidfriction 6
-originjitter 10 10 25
-velocityjitter 356 356 412
-staincolor 0x808080 0x808080
-staintex 16 24
-// front blood
+       airfriction 2
+       alpha 256 256 528
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 12
+       gravity 2
+       liquidfriction 6
+       originjitter 10 10 25
+       size 20 40
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 0 8
+       type blood
+       velocityjitter 356 356 412
 effect particlegibs_damage_dissolve
-type blood
-count 32
-tex 24 32
-size 10 20
-color 0xA8FFFF 0xA8FFFFF
-sizeincrease -15
-alpha 256 256 328
-bounce -1
-gravity 0.5
-airfriction 1
-liquidfriction 3
-velocityjitter 56 56 212
-originjitter 5 5 10
-velocitymultiplier -0.3
-staincolor 0x808080 0x808080
-staintex 16 24
-// back blood
+       airfriction 1
+       alpha 256 256 328
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 32
+       gravity 0.500000
+       liquidfriction 3
+       originjitter 5 5 10
+       sizeincrease -15
+       size 10 20
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 56 56 212
+       velocitymultiplier -0.300000
 effect particlegibs_damage_dissolve
-type blood
-count 32
-tex 24 32
-size 5 15
-color 0xA8FFFF 0xA8FFFFF
-sizeincrease 10
-alpha 256 256 328
-bounce -1
-gravity 1
-airfriction 1
-liquidfriction 3
-velocityjitter 56 56 212
-originjitter 5 5 10
-velocitymultiplier 0.5
-staincolor 0x808080 0x808080
-staintex 16 24
-// small bits
+       airfriction 1
+       alpha 256 256 328
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 32
+       gravity 1
+       liquidfriction 3
+       originjitter 5 5 10
+       sizeincrease 10
+       size 5 15
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 56 56 212
+       velocitymultiplier 0.500000
 effect particlegibs_damage_dissolve
-type blood
-count 75
-tex 24 32
-size 1 1
-color 0xA8FFFF 0xA8FFFFF
-sizeincrease 10
-alpha 256 256 328
-gravity 1
-airfriction 1.5
-liquidfriction 3
-originjitter 10 10 25
-velocityjitter 656 656 912
-staincolor 0x808080 0x808080
-staintex 16 24
-
-// fire effect which expands then slows
+       airfriction 1.500000
+       alpha 256 256 328
+       color 0xA8FFFF 0xA8FFFFF
+       count 75
+       gravity 1
+       liquidfriction 3
+       originjitter 10 10 25
+       sizeincrease 10
+       size 1 1
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 656 656 912
 effect onslaught_generator_gib_explode
-notunderwater
-count 17
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 26
-sizeincrease 45
-alpha 128 256 356
-bounce 1.5
-airfriction 5
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 286 286 286
-
-// smoke
+       airfriction 5
+       alpha 128 256 356
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 17
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 45
+       size 20 26
+       tex 48 55
+       type static
+       velocityjitter 286 286 286
 effect onslaught_generator_gib_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 6
-size 1 10
-sizeincrease 90
-gravity -0.3
-alpha 200 500 600
-velocityjitter 244 244 244
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-
-// underwater bubbles
+       airfriction 5
+       alpha 200 500 600
+       bounce 2
+       color 0x000000 0x111111
+       count 6
+       gravity -0.300000
+       notunderwater
+       sizeincrease 90
+       size 1 10
+       tex 0 8
+       type alphastatic
+       velocityjitter 244 244 244
 effect onslaught_generator_gib_explode
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-
-// fire effect which expands then slows
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect onslaught_generator_gib_flame
-notunderwater
-count 15
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 10
-sizeincrease 25
-alpha 128 256 356
-gravity -0.5
-airfriction 5
-liquidfriction 8
-originjitter 3 3 3
-velocityjitter 86 86 86
-// smoke
+       airfriction 5
+       alpha 128 256 356
+       color 0x8f0d00 0xff5a00
+       count 15
+       gravity -0.500000
+       liquidfriction 8
+       notunderwater
+       originjitter 3 3 3
+       sizeincrease 25
+       size 5 10
+       tex 48 55
+       type static
+       velocityjitter 86 86 86
 effect onslaught_generator_gib_flame
-type alphastatic
-notunderwater
-tex 0 8
-count 1
-size 10 20
-sizeincrease 30
-gravity -0.8
-alpha 200 500 600
-velocityjitter 44 44 44
-airfriction 5
-color 0x000000 0x111111
-bounce 2
-
-// underwater bubbles
+       airfriction 5
+       alpha 200 500 600
+       bounce 2
+       color 0x000000 0x111111
+       count 1
+       gravity -0.800000
+       notunderwater
+       sizeincrease 30
+       size 10 20
+       tex 0 8
+       type alphastatic
+       velocityjitter 44 44 44
 effect onslaught_generator_gib_flame
-underwater
-count 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 96 96 96
-
-
-// used nowhere in code
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 16
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 96 96 96
 effect firemine
-trailspacing 2
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 1
-sizeincrease 5
-gravity -0.06
-alpha 50 256 250
-bounce 1.5
-velocityjitter 10 10 2
-airfriction 1.2
-//slowfire
+       airfriction 1.200000
+       alpha 50 256 250
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 5
+       size 1 1
+       tex 48 55
+       trailspacing 2
+       type smoke
+       velocityjitter 10 10 2
 effect firemine
-trailspacing 2
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 1
-sizeincrease 5
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 10 10 10
-airfriction 1.2
-// very slow and small fire
+       airfriction 1.200000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 5
+       size 1 1
+       tex 48 55
+       trailspacing 2
+       type smoke
+       velocityjitter 10 10 10
 effect firemine
-trailspacing 4
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 1
-sizeincrease 2
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 8 8 8
-airfriction 0.3
-//decreasing fire
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 2
+       size 1 1
+       tex 48 55
+       trailspacing 4
+       type smoke
+       velocityjitter 8 8 8
 effect firemine
-trailspacing 4
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 7
-sizeincrease -3
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 3 3 3
-airfriction 0.3
-//smoke
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease -3
+       size 5 7
+       tex 48 55
+       trailspacing 4
+       type smoke
+       velocityjitter 3 3 3
 effect firemine
-trailspacing 8
-count 0.5
-type alphastatic
-tex 0 8
-size 1 4
-sizeincrease 1
-color 0x000000 0x111111
-alpha 256 256 90
-//gravity -0.2
-originjitter 2 2 2
-velocityoffset 0 0 3
-airfriction 1
-//fastfire
+       airfriction 1
+       alpha 256 256 90
+       color 0x000000 0x111111
+       count 0.500000
+       originjitter 2 2 2
+       sizeincrease 1
+       size 1 4
+       tex 0 8
+       trailspacing 8
+       type alphastatic
+       velocityoffset 0 0 3
 effect firemine
-trailspacing 1
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 12 12
-sizeincrease 0
-gravity 0
-alpha 50 256 1600
-bounce 1.5
-velocityjitter 0 0 0
-airfriction 1.2
-// light only
+       airfriction 1.200000
+       alpha 50 256 1600
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       size 12 12
+       tex 48 55
+       trailspacing 1
+       type smoke
 effect firemine
-trailspacing 16
-lightradius 50
-lightradiusfade 50000
-lightcolor 2.7 2.7 0.6
-
-// used nowhere in code
+       lightcolor 2.7 2.7 0.6
+       lightradiusfade 50000
+       lightradius 50
+       trailspacing 16
 effect fireball
-trailspacing 2
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
-gravity -0.06
-alpha 50 256 250
-bounce 1.5
-velocityjitter 40 40 11
-airfriction 1.2
-//slowfire
+       airfriction 1.200000
+       alpha 50 256 250
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       trailspacing 2
+       type smoke
+       velocityjitter 40 40 11
 effect fireball
-trailspacing 2
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 40 40 40
-airfriction 1.2
-// very slow and small fire
+       airfriction 1.200000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       trailspacing 2
+       type smoke
+       velocityjitter 40 40 40
 effect fireball
-trailspacing 4
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 10
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 30 30 30
-airfriction 0.3
-//decreasing fire
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease 10
+       size 5 5
+       tex 48 55
+       trailspacing 4
+       type smoke
+       velocityjitter 30 30 30
 effect fireball
-trailspacing 4
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 30
-sizeincrease -10
-gravity -0.06
-alpha 50 256 200
-bounce 1.5
-velocityjitter 10 10 10
-airfriction 0.3
-//smoke
+       airfriction 0.300000
+       alpha 50 256 200
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       gravity -0.060000
+       sizeincrease -10
+       size 20 30
+       tex 48 55
+       trailspacing 4
+       type smoke
+       velocityjitter 10 10 10
 effect fireball
-trailspacing 8
-count 0.5
-type alphastatic
-tex 0 8
-size 5 15
-sizeincrease 7
-color 0x000000 0x111111
-alpha 256 256 90
-//gravity -0.2
-originjitter 10 10 10
-velocityoffset 0 0 10
-airfriction 1
-//fastfire
+       airfriction 1
+       alpha 256 256 90
+       color 0x000000 0x111111
+       count 0.500000
+       originjitter 10 10 10
+       sizeincrease 7
+       size 5 15
+       tex 0 8
+       trailspacing 8
+       type alphastatic
+       velocityoffset 0 0 10
 effect fireball
-trailspacing 1
-count 0.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 48 48
-sizeincrease 0
-gravity 0
-alpha 50 256 1600
-bounce 1.5
-velocityjitter 0 0 0
-airfriction 1.2
-// light only
+       airfriction 1.200000
+       alpha 50 256 1600
+       bounce 1.500000
+       color 0x8f0d00 0xff5a00
+       count 0.500000
+       size 48 48
+       tex 48 55
+       trailspacing 1
+       type smoke
 effect fireball
-trailspacing 16
-lightradius 300
-lightradiusfade 3000
-lightcolor 2.7 2.7 0.6
-
-// fireball
+       lightcolor 2.7 2.7 0.6
+       lightradiusfade 3000
+       lightradius 300
+       trailspacing 16
 effect fireball_laser
-count 10
-type spark
-color 0x800000 0xFF8020
-alpha 192 256 2560
-size 1 1
-velocityjitter 1 1 1
-velocitymultiplier 10
-stretchfactor 0.7
-
-// rocket explosion (bigger than mortar and hagar)
-// decal
-// used nowhere in code
+       alpha 192 256 2560
+       color 0x800000 0xFF8020
+       count 10
+       size 1 1
+       stretchfactor 0.700000
+       type spark
+       velocityjitter 1 1 1
+       velocitymultiplier 10
 effect fireball_explode
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 56 56 56
-lightradius 500
-lightradiusfade 500
-lightcolor 4 2 0.5
-// flare effect
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 4 2 0.5
+       lightradiusfade 500
+       lightradius 500
+       originjitter 56 56 56
+       size 72 72
+       tex 8 16
+       type decal
 effect fireball_explode
-countabsolute 1
-type static
-tex 35 37
-color 0x404040 0x404040
-size 72 72
-alpha 192 192 64
-// fire effect
+       alpha 192 192 64
+       color 0x404040 0x404040
+       countabsolute 1
+       size 72 72
+       tex 35 37
+       type static
 effect fireball_explode
-notunderwater
-count 128
-type static
-tex 48 55
-color 0x902010 0xFFD080
-size 16 16
-alpha 128 128 256
-bounce 1.5
-airfriction 4
-liquidfriction 4
-originjitter 8 8 8
-velocityjitter 512 512 512
-// underwater bubbles
+       airfriction 4
+       alpha 128 128 256
+       bounce 1.500000
+       color 0x902010 0xFFD080
+       count 128
+       liquidfriction 4
+       notunderwater
+       originjitter 8 8 8
+       size 16 16
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect fireball_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 144 144 144
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect fireball_explode
-notunderwater
-count 64
-type spark
-color 0x903010 0xFFD030
-size 2 2
-alpha 256 256 384
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 384 384 384
-
+       airfriction 0.200000
+       alpha 256 256 384
+       bounce 1.500000
+       color 0x903010 0xFFD030
+       count 64
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 2 2
+       type spark
+       velocityjitter 384 384 384
+       velocityoffset 0 0 80
 effect fireball_muzzleflash
-count 2
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 2
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect fireball_muzzleflash
-count 15
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
+       airfriction 12
+       alpha 0 128 1024
+       color 0xFFFDD9 0xFFFDD9
+       count 15
+       originjitter 1 1 1
+       size 3 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect fireball_preattack_muzzleflash
-count 2
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 2
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect fireball_preattack_muzzleflash
-count 15
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
+       airfriction 12
+       alpha 0 128 1024
+       color 0xFFFDD9 0xFFFDD9
+       count 15
+       originjitter 1 1 1
+       size 3 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect fireball_bfgdamage
-count 2
-type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 2 1.5 0.2
+       alpha 256 256 512
+       color 0x202020 0x404040
+       count 2
+       lightcolor 2 1.5 0.2
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       size 5 5
+       tex 0 8
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect fireball_bfgdamage
-count 15
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
-
-//EF_FLAME
-//fire
-// used nowhere in code
+       airfriction 12
+       alpha 0 128 1024
+       color 0xFFFDD9 0xFFFDD9
+       count 15
+       originjitter 1 1 1
+       size 3 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect EF_FLAME
-//notunderwater
-count 100
-type smoke
-tex 48 55
-size 5 21
-alpha 200 356 512
-gravity -0.5
-color 0x8f0d00 0xff5a00
-bounce 2
-sizeincrease -1
-originoffset 0 0 10
-originjitter 12 12 34
-velocityjitter 22 22 50
-// smoke
+       alpha 200 356 512
+       bounce 2
+       color 0x8f0d00 0xff5a00
+       count 100
+       gravity -0.500000
+       originjitter 12 12 34
+       originoffset 0 0 10
+       sizeincrease -1
+       size 5 21
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect EF_FLAME
-type alphastatic
-count 50
-tex 0 8
-size 11 15
-sizeincrease 6
-alpha 200 256 200
-color 0x000000 0x111111
-gravity -0.3
-originoffset 0 0 10
-originjitter 12 12 34
-velocityjitter 11 11 50
-bounce 2
+       alpha 200 256 200
+       bounce 2
+       color 0x000000 0x111111
+       count 50
+       gravity -0.300000
+       originjitter 12 12 34
+       originoffset 0 0 10
+       sizeincrease 6
+       size 11 15
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect EF_FLAME
-count 0.5
-lightradius 200
-lightradiusfade 10000
-lightcolor 0.9 0.9 0.2
-
-// rifle bullet trail (somewhat like a tracer)
-// used in qcsrc/server/w_common.qc:                           zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("tr_bullet"), from, to)
+       count 0.500000
+       lightcolor 0.9 0.9 0.2
+       lightradiusfade 10000
+       lightradius 200
 effect tr_rifle
-trailspacing 128
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 2560
-size 1.5 1.5
-stretchfactor 1
-velocitymultiplier 0.7
+       alpha 256 256 2560
+       color 0x800000 0xFF8020
+       size 1.500000 1.500000
+       stretchfactor 1
+       trailspacing 128
+       type spark
+       velocitymultiplier 0.700000
 effect tr_rifle
-notunderwater
-tex 0 8
-trailspacing 8
-type static
-color 0x202020 0x404040
-size 4 4
-sizeincrease 0.4
-alpha 256 256 256
-airfriction -4
-velocityjitter 4 4 4
-type smoke
+       airfriction -4
+       alpha 256 256 256
+       color 0x202020 0x404040
+       notunderwater
+       sizeincrease 0.400000
+       size 4 4
+       tex 0 8
+       trailspacing 8
+       type smoke
+       velocityjitter 4 4 4
 effect tr_rifle
-underwater
-trailspacing 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 2 2
-alpha 256 256 128
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-// rocket guiding start
-// underwater bubbles
+       alpha 256 256 128
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 2 2
+       tex 62 62
+       trailspacing 32
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect rocket_guide
-underwater
-count 2
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1.5 1.5
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 8 8 8
-velocityjitter 48 48 48
-velocitymultiplier -0.1
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 2
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 8 8 8
+       size 1.500000 1.500000
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 48 48 48
+       velocitymultiplier -0.100000
 effect rocket_guide
-notunderwater
-count 8
-type spark
-color 0x903010 0xFFD030
-size 0.3 0.7
-tex 40 40
-alpha 256 256 984
-gravity 1
-airfriction 0.2
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 80
-velocityjitter 156 156 156
-velocitymultiplier -0.3
-stretchfactor 0.4
+       airfriction 0.200000
+       alpha 256 256 984
+       bounce 1.500000
+       color 0x903010 0xFFD030
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       size 0.300000 0.700000
+       stretchfactor 0.400000
+       tex 40 40
+       type spark
+       velocityjitter 156 156 156
+       velocitymultiplier -0.300000
+       velocityoffset 0 0 80
 effect rocket_guide
-countabsolute 1
-type smoke
-tex 65 65
-color 0x903010 0xFFD030
-size 10 10
-sizeincrease 300
-alpha 100 100 500
-
-
-// gauntlet laser
-// based off morphed's cl_gentle
-// used in qcsrc/server/w_laser.qc
+       alpha 100 100 500
+       color 0x903010 0xFFD030
+       countabsolute 1
+       sizeincrease 300
+       size 10 10
+       tex 65 65
+       type smoke
 effect laser_gauntlet
-count 3
-type spark
-color 0xb44215 0x880000
-tex 43 43
-size 7 10
-alpha 128 512 6280
-airfriction 10
-originjitter 2 2 2
-velocityjitter 150 150 150
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2.3
-rotate -180 180 4000 -4000
-
+       airfriction 10
+       alpha 128 512 6280
+       color 0xb44215 0x880000
+       count 3
+       originjitter 2 2 2
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 7 10
+       stretchfactor 2.300000
+       tex 43 43
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.200000
 effect laser_gauntlet
-count 6
-type spark
-color 0xff4200 0xff0000
-tex 8 15
-size 7 9
-alpha 256 512 6280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 100 100 100
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2
-
-
-// muzzle flash
+       airfriction 12
+       alpha 256 512 6280
+       color 0xff4200 0xff0000
+       count 6
+       originjitter 2 2 2
+       sizeincrease -100
+       size 7 9
+       stretchfactor 2
+       tex 8 15
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 0.200000
 effect laser_gauntletmuzzleflash
-// glow and light
-countabsolute 1
-type smoke
-color 0x220000 0x880000
-tex 65 65
-size 10 15
-alpha 256 512 6280
-airfriction 10
-sizeincrease -100
-stretchfactor 2
-lightradius 150
-lightradiusfade 500
-lightcolor 3 0.1 0.1
-// electricity
+       airfriction 10
+       alpha 256 512 6280
+       color 0x220000 0x880000
+       countabsolute 1
+       lightcolor 3 0.1 0.1
+       lightradiusfade 500
+       lightradius 150
+       sizeincrease -100
+       size 10 15
+       stretchfactor 2
+       tex 65 65
+       type smoke
 effect laser_gauntletmuzzleflash
-count 3
-type spark
-color 0xb44215 0x880000
-tex 43 43
-size 7 10
-alpha 128 512 6280
-airfriction 10
-originjitter 2 2 2
-velocityjitter 150 150 150
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2.3
-rotate -180 180 4000 -4000
-
-
-// fire
+       airfriction 10
+       alpha 128 512 6280
+       color 0xb44215 0x880000
+       count 3
+       originjitter 2 2 2
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 7 10
+       stretchfactor 2.300000
+       tex 43 43
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.200000
 effect laser_gauntletmuzzleflash
-count 6
-type spark
-color 0xff4200 0xff0000
-tex 8 15
-size 7 9
-alpha 256 512 6280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 100 100 100
-velocitymultiplier 0.2
-sizeincrease -100
-stretchfactor 2
-
-//torch flame, spawn it as fast as you can  20 times per second or more, supports direction but not required
-//fast fire
-// used nowhere in code, meant for maps
+       airfriction 12
+       alpha 256 512 6280
+       color 0xff4200 0xff0000
+       count 6
+       originjitter 2 2 2
+       sizeincrease -100
+       size 7 9
+       stretchfactor 2
+       tex 8 15
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier 0.200000
 effect torchflame
-count 3
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
- gravity -0.06
-alpha 50 256 250
-velocityjitter 40 40 11
-velocitymultiplier 30
-airfriction 1.2
-//slowfire
+       airfriction 1.200000
+       alpha 50 256 250
+       color 0x8f0d00 0xff5a00
+       count 3
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 40 40 11
+       velocitymultiplier 30
 effect torchflame
-count 2.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 20
- gravity -0.06
-alpha 50 256 200
-velocityjitter 40 40 40
-velocitymultiplier 20
-airfriction 1.2
-// very slow and small fire
+       airfriction 1.200000
+       alpha 50 256 200
+       color 0x8f0d00 0xff5a00
+       count 2.500000
+       gravity -0.060000
+       sizeincrease 20
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 40 40 40
+       velocitymultiplier 20
 effect torchflame
-count 1.5
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 5
-sizeincrease 10
- gravity -0.06
-alpha 50 256 200
-velocityjitter 30 30 30
-velocitymultiplier 10
-airfriction 0.3
-//decreasing fire
+       airfriction 0.300000
+       alpha 50 256 200
+       color 0x8f0d00 0xff5a00
+       count 1.500000
+       gravity -0.060000
+       sizeincrease 10
+       size 5 5
+       tex 48 55
+       type smoke
+       velocityjitter 30 30 30
+       velocitymultiplier 10
 effect torchflame
-count 2
-type smoke
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 20 30
-sizeincrease -10
- gravity -0.06
-alpha 50 256 200
-velocityjitter 10 10 10
-velocitymultiplier 15
-airfriction 0.3
-//smoke
+       airfriction 0.300000
+       alpha 50 256 200
+       color 0x8f0d00 0xff5a00
+       count 2
+       gravity -0.060000
+       sizeincrease -10
+       size 20 30
+       tex 48 55
+       type smoke
+       velocityjitter 10 10 10
+       velocitymultiplier 15
 effect torchflame
-count 0.5
-type alphastatic
-tex 0 8
-size 5 15
-sizeincrease 7
-color 0x000000 0x111111
-alpha 256 256 90
-//gravity -0.2
-originjitter 10 10 10
-velocitymultiplier 20
-velocityoffset 0 0 10
-airfriction 1
-
-//happy death fx for cl_gentle
+       airfriction 1
+       alpha 256 256 90
+       color 0x000000 0x111111
+       count 0.500000
+       originjitter 10 10 10
+       sizeincrease 7
+       size 5 15
+       tex 0 8
+       type alphastatic
+       velocitymultiplier 20
+       velocityoffset 0 0 10
 effect happy_damage_dissolve
-tex 69 69
-count 15
-type alphastatic
-color 0x00FFFF 0xFF00FF
-size 32 32
-sizeincrease -10
-alpha 256 256 228
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 312 312 312
+       airfriction 3
+       alpha 256 256 228
+       bounce 1.500000
+       color 0x00FFFF 0xFF00FF
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -10
+       size 32 32
+       tex 69 69
+       type alphastatic
+       velocityjitter 312 312 312
 effect happy_damage_dissolve
-tex 69 69
-count 15
-type alphastatic
-color 0xFF00FF 0xFFFF00
-size 32 32
-sizeincrease -10
-alpha 256 256 228
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 312 312 312
+       airfriction 3
+       alpha 256 256 228
+       bounce 1.500000
+       color 0xFF00FF 0xFFFF00
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -10
+       size 32 32
+       tex 69 69
+       type alphastatic
+       velocityjitter 312 312 312
 effect happy_damage_dissolve
-tex 69 69
-count 15
-type alphastatic
-color 0xFFFF00 0x00FFFF
-size 32 32
-sizeincrease -10
-alpha 256 256 228
-gravity -0.4
-bounce 1.5
-airfriction 3
-liquidfriction 6
-velocityjitter 312 312 312
-
-
-//happy damage fx for cl_gentle
+       airfriction 3
+       alpha 256 256 228
+       bounce 1.500000
+       color 0xFFFF00 0x00FFFF
+       count 15
+       gravity -0.400000
+       liquidfriction 6
+       sizeincrease -10
+       size 32 32
+       tex 69 69
+       type alphastatic
+       velocityjitter 312 312 312
 effect happy_damage_hit
-tex 69 69
-count 0.1
-type alphastatic
-color 0x00FFFF 0xFF00FF
-size 26 26
-sizeincrease -28
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 156 156 156
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0x00FFFF 0xFF00FF
+       count 0.100000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -28
+       size 26 26
+       tex 69 69
+       type alphastatic
+       velocityjitter 156 156 156
 effect happy_damage_hit
-tex 69 69
-count 0.1
-type alphastatic
-color 0xFF00FF 0xFFFF00
-size 26 26
-sizeincrease -28
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 156 156 156
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0xFF00FF 0xFFFF00
+       count 0.100000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -28
+       size 26 26
+       tex 69 69
+       type alphastatic
+       velocityjitter 156 156 156
 effect happy_damage_hit
-tex 69 69
-count 0.1
-type alphastatic
-color 0xFFFF00 0x00FFFF
-size 26 26
-sizeincrease -28
-alpha 128 128 192
-gravity -0.4
-bounce 1.5
-airfriction 5
-liquidfriction 10
-velocityjitter 156 156 156
-
-
-
-// used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
-// used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 5
+       alpha 128 128 192
+       bounce 1.500000
+       color 0xFFFF00 0x00FFFF
+       count 0.100000
+       gravity -0.400000
+       liquidfriction 10
+       sizeincrease -28
+       size 26 26
+       tex 69 69
+       type alphastatic
+       velocityjitter 156 156 156
 effect electro_lightning
-countabsolute 1
-type decal
-tex 59 59
-size 16 16
-alpha 256 256 0
-originjitter 2 2 2
-lightradius 50
-lightradiusfade 500
-lightcolor 3.125 4.375 10
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 3.1 4.4 10
+       lightradiusfade 500
+       lightradius 50
+       originjitter 2 2 2
+       size 16 16
+       tex 59 59
+       type decal
 effect electro_lightning
-count 300
-type spark
-// color 0x501860 0x501860 // 0x202020 0x404040
-color 0x2030FF 0x80C0FF
-tex 65 65
-size 6 6
-alpha 100 206 1724
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-sizeincrease 10
-velocitymultiplier 2000
+       alpha 100 206 1724
+       color 0x2030FF 0x80C0FF
+       count 300
+       originjitter 1.5 1.5 1.5
+       sizeincrease 10
+       size 6 6
+       tex 65 65
+       type spark
+       velocityjitter 6 6 6
+       velocitymultiplier 2000
 effect electro_lightning
-count 30
-type spark
-tex 8 15
-color 0xDDFDFF 0xFDFDFF
-size 2 5
-alpha 110 170 1500
-originjitter 1 1 1
-velocityjitter 150 150 150
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 1.5
+       airfriction 2
+       alpha 110 170 1500
+       color 0xDDFDFF 0xFDFDFF
+       count 30
+       originjitter 1 1 1
+       size 2 5
+       stretchfactor 1.500000
+       tex 8 15
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.500000
 effect electro_lightning
-count 50
-type spark
-tex 41 41
-color 0xFDFDFF 0xF9FDFF
-size 2 3
-alpha 110 170 1500
-originjitter 1 1 1
-velocityjitter 350 350 350
-velocitymultiplier 2.5
-airfriction 8
-gravity 1.3
-stretchfactor 0.1
-
-// used in qcsrc/server/w_gauntlet.qc: pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
+       airfriction 8
+       alpha 110 170 1500
+       color 0xFDFDFF 0xF9FDFF
+       count 50
+       gravity 1.300000
+       originjitter 1 1 1
+       size 2 3
+       stretchfactor 0.100000
+       tex 41 41
+       type spark
+       velocityjitter 350 350 350
+       velocitymultiplier 2.500000
 effect gauntlet_lightning
-count 300
-type spark
-color 0x280000 0x280000 // 0x202020 0x404040
-tex 65 65
-size 3 3
-alpha 256 256 1024
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-sizeincrease 15
-velocitymultiplier 2000
+       alpha 256 256 1024
+       color 0x280000 0x280000
+       count 300
+       originjitter 1.5 1.5 1.5
+       sizeincrease 15
+       size 3 3
+       tex 65 65
+       type spark
+       velocityjitter 6 6 6
+       velocitymultiplier 2000
 effect gauntlet_lightning
-count 30
-type spark
-tex 8 15
-color 0xDD0000 0xFD0000
-size 2 5
-alpha 110 228 1024
-originjitter 1 1 1
-velocityjitter 150 150 150
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 1.5
+       airfriction 2
+       alpha 110 228 1024
+       color 0xDD0000 0xFD0000
+       count 30
+       originjitter 1 1 1
+       size 2 5
+       stretchfactor 1.500000
+       tex 8 15
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.500000
 effect gauntlet_lightning
-count 50
-type spark
-tex 41 41
-color 0xFD0000 0xF90000
-size 2 3
-alpha 110 228 600
-originjitter 1 1 1
-velocityjitter 350 350 350
-velocitymultiplier 2.5
-airfriction 8
-gravity 1.3
-stretchfactor 0.1
-
-
-// crylink joinexplode effect
-// decal
-// used in qcsrc/client/damage.qc:                                     pointparticles(particleeffectnum("crylink_joinexplode"), org2, '0 0 0', 1)
+       airfriction 8
+       alpha 110 228 600
+       color 0xFD0000 0xF90000
+       count 50
+       gravity 1.300000
+       originjitter 1 1 1
+       size 2 3
+       stretchfactor 0.100000
+       tex 41 41
+       type spark
+       velocityjitter 350 350 350
+       velocitymultiplier 2.500000
 effect crylink_joinexplode
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 12 12 12
-//lightradius 200
-//lightradiusfade 800
-//lightcolor 3.2 0.4 4
-// purple flare effect
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 12 12 12
+       size 24 24
+       tex 47 47
+       type decal
 effect crylink_joinexplode
-countabsolute 1
-type static
-tex 39 39
-color 0x504060 0x504060
-size 24 24
-alpha 256 256 512
-// purple sparks
+       alpha 256 256 512
+       color 0x504060 0x504060
+       countabsolute 1
+       size 24 24
+       tex 39 39
+       type static
 effect crylink_joinexplode
-count 40
-type spark
-tex 41 41
-color 0xA040C0 0xA040C0
-bounce 2
-size 6 6
-alpha 256 256 1024
-velocityjitter 512 512 512
-// purple splash
+       alpha 256 256 1024
+       bounce 2
+       color 0xA040C0 0xA040C0
+       count 40
+       size 6 6
+       tex 41 41
+       type spark
+       velocityjitter 512 512 512
 effect crylink_joinexplode
-count 1.5
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 512
-velocityjitter 32 32 32
-// purple splash
+       alpha 256 256 512
+       color 0xE070FF 0xE070FF
+       count 1.500000
+       size 16 16
+       type static
+       velocityjitter 32 32 32
 effect crylink_joinexplode
-count 3
-type static
-color 0xE070FF 0xE070FF
-size 16 16
-alpha 256 256 1024
-velocityjitter 256 256 256
-
-//sparks for keepaway ball touch
-// used nowhere in code
+       alpha 256 256 1024
+       color 0xE070FF 0xE070FF
+       count 3
+       size 16 16
+       type static
+       velocityjitter 256 256 256
 effect kaball_sparks
-count 35
-type spark
-tex 40 40
-color 0xa9cacf 0x0054ff
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-
-// weak rifle bullet trail (somewhat like a tracer)
-// used in qcsrc/server/w_common.qc:                           zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("tr_bullet"), from, to)
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0xa9cacf 0x0054ff
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect tr_rifle_weak
-trailspacing 128
-type spark
-color 0x800000 0xFF8020
-alpha 256 256 2560
-size 1.5 1.5
-stretchfactor 1
-velocitymultiplier 0.7
+       alpha 256 256 2560
+       color 0x800000 0xFF8020
+       size 1.500000 1.500000
+       stretchfactor 1
+       trailspacing 128
+       type spark
+       velocitymultiplier 0.700000
 effect tr_rifle_weak
-notunderwater
-tex 0 8
-trailspacing 48
-type static
-color 0x202020 0x404040
-size 4 4
-sizeincrease 0.4
-alpha 256 256 256
-airfriction -4
-velocityjitter 4 4 4
-type smoke
+       airfriction -4
+       alpha 256 256 256
+       color 0x202020 0x404040
+       notunderwater
+       sizeincrease 0.400000
+       size 4 4
+       tex 0 8
+       trailspacing 48
+       type smoke
+       velocityjitter 4 4 4
 effect tr_rifle_weak
-underwater
-trailspacing 192
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 2 2
-alpha 256 256 128
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-// red smoke emiter
-// used nowhere in code
+       alpha 256 256 128
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 2 2
+       tex 62 62
+       trailspacing 192
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect red_smoke
-count 2
-type smoke
-tex 0 8
-color 0xff8866 0x331100
-size 60 120
-sizeincrease 0
-alpha 32 64 32
-gravity -0.007
-originjitter 0 0 0
-velocityjitter 0 0 0
-velocitymultiplier 5
-airfriction -1
-rotate 0 360 -30 30
-
-// pipe smoke emiter
-// used nowhere in code
+       airfriction -1
+       alpha 32 64 32
+       color 0xff8866 0x331100
+       count 2
+       gravity -0.007000
+       rotate 0 360 -30 30
+       size 60 120
+       tex 0 8
+       type smoke
+       velocitymultiplier 5
 effect pipe_smoke
-count 2
-type smoke
-tex 0 8
-color 0x999999 0x555555
-size 5 10
-sizeincrease 35
-alpha 32 64 48
-gravity -0.015
-originjitter 0 0 0
-velocityjitter 0 0 5
-velocitymultiplier 15
-airfriction -1
-rotate 0 360 -180 180
-
-// seeker missile trail
+       airfriction -1
+       alpha 32 64 48
+       color 0x999999 0x555555
+       count 2
+       gravity -0.015000
+       rotate 0 360 -180 180
+       sizeincrease 35
+       size 5 10
+       tex 0 8
+       type smoke
+       velocityjitter 0 0 5
+       velocitymultiplier 15
 effect TR_SEEKER
-trailspacing 10
-type smoke
-notunderwater
-color 0x000000 0x666666
-tex 0 8
-size 2 2
-bounce 1
-sizeincrease 11
-alpha 200 300 200
-lightradius 100
-lighttime 0
-lightcolor 6 3 1
-originjitter 2 2 2
-velocityjitter 3 3 3
-velocitymultiplier -0.02
-rotate -180 180 -30 30
-//gravity -0.11
-// fire
+       alpha 200 300 200
+       bounce 1
+       color 0x000000 0x666666
+       lightcolor 6 3 1
+       lightradius 100
+       notunderwater
+       originjitter 2 2 2
+       rotate -180 180 -30 30
+       sizeincrease 11
+       size 2 2
+       tex 0 8
+       trailspacing 10
+       type smoke
+       velocityjitter 3 3 3
+       velocitymultiplier -0.020000
 effect TR_SEEKER
-trailspacing 4
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 5 5
-sizeincrease -30
-alpha 100 144 588
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.5
-// bubbles
+       airfriction 8
+       alpha 100 144 588
+       color 0xffdf72 0x811200
+       sizeincrease -30
+       size 5 5
+       tex 48 55
+       trailspacing 4
+       type static
+       velocityjitter 32 32 32
+       velocitymultiplier -1.500000
 effect TR_SEEKER
-type bubble
-underwater
-trailspacing 16
-tex 62 62
-size 1 2
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-velocitymultiplier -0.31
-rotate 0 0 0 0
-// sparks
+       alpha 256 256 256
+       bounce 1.500000
+       gravity -0.125000
+       liquidfriction 4
+       size 1 2
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
+       velocitymultiplier -0.310000
 effect TR_SEEKER
-notunderwater
-trailspacing 20
-type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 0.5 0.5
-alpha 444 512 1866
-stretchfactor 0.3
-//gravity 1
-bounce 1
-//velocityoffset 0 0 15
-airfriction 5
-originjitter 1 1 1
-velocityjitter 100 100 100
-velocitymultiplier -0.31
-
-// --------------- vehicles
-
+       airfriction 5
+       alpha 444 512 1866
+       bounce 1
+       color 0xFFFDD9 0xFFFDD9
+       notunderwater
+       originjitter 1 1 1
+       size 0.500000 0.500000
+       stretchfactor 0.300000
+       tex 40 40
+       trailspacing 20
+       type spark
+       velocityjitter 100 100 100
+       velocitymultiplier -0.310000
 effect spiderbot_minigun_trail
-notunderwater
-trailspacing 10
-type smoke
-color 0xd0d0a0 0xffffff
-tex 0 8
-size 1 2
-alpha 20 50 100
-sizeincrease 2
-velocityjitter 5 5 5
-gravity -0.03
-airfriction 1
-
+       airfriction 1
+       alpha 20 50 100
+       color 0xd0d0a0 0xffffff
+       gravity -0.030000
+       notunderwater
+       sizeincrease 2
+       size 1 2
+       tex 0 8
+       trailspacing 10
+       type smoke
+       velocityjitter 5 5 5
 effect spiderbot_minigun_muzzleflash
-count 3
-type spark
-color 0xff9c00 0xff8400
-tex 48 55
-size 10 15
-alpha 256 512 6280
-airfriction 10
-originjitter 2 2 2
-velocityjitter 150 150 150
-velocitymultiplier 0.35
-sizeincrease -100
-stretchfactor 1.3
-rotate -180 180 4000 -4000
-// fire
+       airfriction 10
+       alpha 256 512 6280
+       color 0xff9c00 0xff8400
+       count 3
+       originjitter 2 2 2
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 10 15
+       stretchfactor 1.300000
+       tex 48 55
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.350000
 effect spiderbot_minigun_muzzleflash
-count 6
-type spark
-color 0xff9c00 0xff8400
-tex 8 15
-size 5 7
-alpha 256 512 6280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 200 200 200
-velocitymultiplier 0.2
-sizeincrease -10
-stretchfactor 0.8
+       airfriction 12
+       alpha 256 512 6280
+       color 0xff9c00 0xff8400
+       count 6
+       originjitter 2 2 2
+       sizeincrease -10
+       size 5 7
+       stretchfactor 0.800000
+       tex 8 15
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.200000
 effect spiderbot_minigun_muzzleflash
-countabsolute 2
-type static
-tex 48 55
-color 0xff9c00 0xff8400
-size 32 32
-alpha 256 512 6680
-sizeincrease -100
-stretchfactor 0.1
-rotate -180 180 4000 -4000
-lightradius 120
-lightradiusfade 8000
-lightcolor 3 3 0
-
+       alpha 256 512 6680
+       color 0xff9c00 0xff8400
+       countabsolute 2
+       lightcolor 3 3 0
+       lightradiusfade 8000
+       lightradius 120
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 32 32
+       stretchfactor 0.100000
+       tex 48 55
+       type static
 effect spiderbot_minigun_impact
-countabsolute 1
-type static
-tex 65 65
-color 0xff9c00 0xf6ff00
-size 52 52
-alpha 50 100 1680
-sizeincrease -100
-stretchfactor 0.1
-rotate -180 180 4000 -4000
-// fire
+       alpha 50 100 1680
+       color 0xff9c00 0xf6ff00
+       countabsolute 1
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 52 52
+       stretchfactor 0.100000
+       tex 65 65
+       type static
 effect spiderbot_minigun_impact
-count 7
-type spark
-color 0xff9c00 0xff8400
-tex 48 55
-size 9 15
-alpha 256 512 6280
-airfriction 10
-originjitter 2 2 2
-velocityjitter 250 250 150
-velocitymultiplier 0.2
-sizeincrease 100
-stretchfactor 3
-airfriction 6
-rotate -180 180 4000 -4000
-// smoke 
+       airfriction 6
+       alpha 256 512 6280
+       color 0xff9c00 0xff8400
+       count 7
+       originjitter 2 2 2
+       rotate -180 180 4000 -4000
+       sizeincrease 100
+       size 9 15
+       stretchfactor 3
+       tex 48 55
+       type spark
+       velocityjitter 250 250 150
+       velocitymultiplier 0.200000
 effect spiderbot_minigun_impact
-count 6
-type smoke
-color 0xd0d0a0 0xffffff
-tex 0 8
-size 10 20
-alpha 50 50 190
-sizeincrease 80
-velocityjitter 100 100 250
-velocitymultiplier 0.49
-gravity 1.3
-airfriction 10
-rotate -180 180 0 0
-// smoke 2
+       airfriction 10
+       alpha 50 50 190
+       color 0xd0d0a0 0xffffff
+       count 6
+       gravity 1.300000
+       rotate -180 180 0 0
+       sizeincrease 80
+       size 10 20
+       tex 0 8
+       type smoke
+       velocityjitter 100 100 250
+       velocitymultiplier 0.490000
 effect spiderbot_minigun_impact
-count 7
-type spark
-color 0xd0d0a0 0xffffff
-tex 0 8
-size 15 19
-alpha 25 51 128
-airfriction 6
-originjitter 2 2 2
-velocityjitter 250 250 150
-velocitymultiplier 0.2
-sizeincrease 100
-stretchfactor 7.6
-// debris
+       airfriction 6
+       alpha 25 51 128
+       color 0xd0d0a0 0xffffff
+       count 7
+       originjitter 2 2 2
+       sizeincrease 100
+       size 15 19
+       stretchfactor 7.600000
+       tex 0 8
+       type spark
+       velocityjitter 250 250 150
+       velocitymultiplier 0.200000
 effect spiderbot_minigun_impact
-notunderwater
-count 3
-type alphastatic
-tex 66 68
-color 0x99977D 0xFFFFFF
-size 6 8
-alpha 644 756 1484
-gravity 1.1
-airfriction 0.4
-sizeincrease -10
-velocitymultiplier 0.15
-originjitter 16 16 16
-velocityjitter 124 124 224
-rotate -180 180 -1000 1000
-// decal
+       airfriction 0.400000
+       alpha 644 756 1484
+       color 0x99977D 0xFFFFFF
+       count 3
+       gravity 1.100000
+       notunderwater
+       originjitter 16 16 16
+       rotate -180 180 -1000 1000
+       sizeincrease -10
+       size 6 8
+       tex 66 68
+       type alphastatic
+       velocityjitter 124 124 224
+       velocitymultiplier 0.150000
 effect spiderbot_minigun_impact
-countabsolute 1
-type decal
-tex 56 59
-size 20 25
-alpha 256 256 0
-originjitter 16 16 16
-rotate -180 180 0 0
-
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 16 16 16
+       rotate -180 180 0 0
+       size 20 25
+       tex 56 59
+       type decal
 effect spiderbot_rocket_explode
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 23 23 23
-lightradius 300
-lightradiusfade 1750
-lightcolor 8 4 0
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 0
+       lightradiusfade 1750
+       lightradius 300
+       originjitter 23 23 23
+       size 72 72
+       tex 8 16
+       type decal
 effect spiderbot_rocket_explode
-countabsolute 1
-type static
-tex 33 33 
-size 22 22
-alpha 56 56 230
-color 0x8f0d00 0xff5a00
-sizeincrease 2400
-// glow
+       alpha 56 56 230
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 2400
+       size 22 22
+       tex 33 33
+       type static
 effect spiderbot_rocket_explode
-countabsolute 1
-type static
-tex 64 64
-size 120 120
-alpha 156 156 830
-color 0x8f0d00 0xff5a00
-sizeincrease 240
-// fire effect
+       alpha 156 156 830
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 240
+       size 120 120
+       tex 64 64
+       type static
 effect spiderbot_rocket_explode
-notunderwater
-count 32
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 12 21
-sizeincrease 495
-alpha 200 256 812
-airfriction 8
-liquidfriction 8
-originjitter 100 100 100
-velocityjitter 512 512 512
-rotate -180 180 -50 50
-// fire effect 2
+       airfriction 8
+       alpha 200 256 812
+       color 0x8f0d00 0xff5a00
+       count 32
+       liquidfriction 8
+       notunderwater
+       originjitter 100 100 100
+       rotate -180 180 -50 50
+       sizeincrease 495
+       size 12 21
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect spiderbot_rocket_explode
-notunderwater
-count 16
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 3 3
-sizeincrease 120
-alpha 200 256 912
-airfriction -2
-liquidfriction 8
-velocityjitter 412 412 412
-rotate -180 180 -150 150
-stretchfactor 10
-// fire rays
+       airfriction -2
+       alpha 200 256 912
+       color 0x8f0d00 0xff5a00
+       count 16
+       liquidfriction 8
+       notunderwater
+       rotate -180 180 -150 150
+       sizeincrease 120
+       size 3 3
+       stretchfactor 10
+       tex 48 55
+       type spark
+       velocityjitter 412 412 412
 effect spiderbot_rocket_explode
-notunderwater
-count 10
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 13 54
-sizeincrease 120
-alpha 200 256 1600
-airfriction -3
-liquidfriction 8
-originjitter 40 40 40
-velocityjitter 712 712 712
-stretchfactor 10
-// smoke
+       airfriction -3
+       alpha 200 256 1600
+       color 0x8f0d00 0xff5a00
+       count 10
+       liquidfriction 8
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 120
+       size 13 54
+       stretchfactor 10
+       tex 48 55
+       type spark
+       velocityjitter 712 712 712
 effect spiderbot_rocket_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 10
-size 10 15
-sizeincrease 280
-alpha 300 650 756
-originjitter 100 100 100
-velocityjitter 200 200 200
-airfriction 3
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-// smoke2
+       airfriction 3
+       alpha 300 650 756
+       color 0x4F4B46 0x000000
+       count 10
+       notunderwater
+       originjitter 100 100 100
+       rotate -180 180 -20 20
+       sizeincrease 280
+       size 10 15
+       tex 0 8
+       type alphastatic
+       velocityjitter 200 200 200
 effect spiderbot_rocket_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 3
-size 100 150
-sizeincrease 30
-alpha 300 650 556
-originjitter 10 10 10
-velocityjitter 200 200 200
-airfriction 2
-gravity -0.5
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-// underwater bubbles
+       airfriction 2
+       alpha 300 650 556
+       color 0x4F4B46 0x000000
+       count 3
+       gravity -0.500000
+       notunderwater
+       originjitter 10 10 10
+       rotate -180 180 -20 20
+       sizeincrease 30
+       size 100 150
+       tex 0 8
+       type alphastatic
+       velocityjitter 200 200 200
 effect spiderbot_rocket_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 160 160 160
-velocityjitter 144 144 144
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 160 160 160
+       size 1 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect spiderbot_rocket_explode
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 1200
-alpha 40 40 300
-
-
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 1200
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
 effect spiderbot_rocket_thrust
-notunderwater
-count 3
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 5 10
-sizeincrease -40
-alpha 200 256 1600
-velocityjitter 20 20 20
-velocitymultiplier -1.4
-stretchfactor 0.9
+       alpha 200 256 1600
+       color 0x8f0d00 0xff5a00
+       count 3
+       notunderwater
+       sizeincrease -40
+       size 5 10
+       stretchfactor 0.900000
+       tex 48 55
+       type spark
+       velocityjitter 20 20 20
+       velocitymultiplier -1.400000
 effect spiderbot_rocket_thrust
-notunderwater
-count 4
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 25 25
-sizeincrease -3000
-alpha 200 200 9000
-velocityjitter 60 60 60
-velocitymultiplier -1.4
-stretchfactor 1
-rotate -180 180 -500 500
-
-
-
-// long lasting smoke
+       alpha 200 200 9000
+       color 0x8f0d00 0xff5a00
+       count 4
+       notunderwater
+       rotate -180 180 -500 500
+       sizeincrease -3000
+       size 25 25
+       stretchfactor 1
+       tex 48 55
+       type static
+       velocityjitter 60 60 60
+       velocitymultiplier -1.400000
 effect spiderbot_rocket_launch
-notunderwater
-count 8
-type smoke
-tex 0 8
-color 0xFFFFFF 0xD9C4B0
-size 30 30
-sizeincrease 20
-alpha 100 156 60
-velocityjitter 60 60 60
-velocitymultiplier -0.1
-airfriction 0.3
-gravity -0.01
-// fast smoke
+       airfriction 0.300000
+       alpha 100 156 60
+       color 0xFFFFFF 0xD9C4B0
+       count 8
+       gravity -0.010000
+       notunderwater
+       sizeincrease 20
+       size 30 30
+       tex 0 8
+       type smoke
+       velocityjitter 60 60 60
+       velocitymultiplier -0.100000
 effect spiderbot_rocket_launch
-notunderwater
-count 14
-type smoke
-tex 0 8
-color 0xFFFFFF 0xD9C4B0
-size 30 30
-sizeincrease 20
-alpha 100 156 260
-gravity -0.3
-velocityjitter 160 160 60
-airfriction 0.3
-// fire
+       airfriction 0.300000
+       alpha 100 156 260
+       color 0xFFFFFF 0xD9C4B0
+       count 14
+       gravity -0.300000
+       notunderwater
+       sizeincrease 20
+       size 30 30
+       tex 0 8
+       type smoke
+       velocityjitter 160 160 60
 effect spiderbot_rocket_launch
-notunderwater
-count 14
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 30 30
-sizeincrease 40
-velocitymultiplier 0.5
-alpha 200 256 1960
-velocityjitter 60 60 60
-airfriction 0.3
-stretchfactor 3
-airfriction 0.3
-//sparks
+       airfriction 0.300000
+       alpha 200 256 1960
+       color 0x8f0d00 0xff5a00
+       count 14
+       notunderwater
+       sizeincrease 40
+       size 30 30
+       stretchfactor 3
+       tex 48 55
+       type spark
+       velocityjitter 60 60 60
+       velocitymultiplier 0.500000
 effect spiderbot_rocket_launch
-notunderwater
-count 10
-type spark
-tex 40 40
-color 0xFFFFFF 0xD9C4B0
-size 1 4
-alpha 200 256 1000
-velocityjitter 160 160 160
-velocitymultiplier -0.5
-
+       alpha 200 256 1000
+       color 0xFFFFFF 0xD9C4B0
+       count 10
+       notunderwater
+       size 1 4
+       tex 40 40
+       type spark
+       velocityjitter 160 160 160
+       velocitymultiplier -0.500000
 effect wakizashi_gun_impact
-count 15
-type spark
-color 0xff0000 0xc03535
-tex 41 41
-size 4 7
-alpha 256 512 1180
-airfriction 4
-gravity 3
-originjitter 40 40 10
-velocityjitter 350 350 550
-velocityoffset 0 0 700
-stretchfactor 0.9
+       airfriction 4
+       alpha 256 512 1180
+       color 0xff0000 0xc03535
+       count 15
+       gravity 3
+       originjitter 40 40 10
+       size 4 7
+       stretchfactor 0.900000
+       tex 41 41
+       type spark
+       velocityjitter 350 350 550
+       velocityoffset 0 0 700
 effect wakizashi_gun_impact
-type smoke
-count 24
-color 0xd0d0a0 0xc03535
-tex 0 8
-size 10 20
-alpha 50 90 150
-sizeincrease 80
-velocityjitter 250 250 450
-velocityoffset 0 0 600
-originjitter 40 40 10
-airfriction 4
-sizeincrease 80
-rotate -180 180 0 0
+       airfriction 4
+       alpha 50 90 150
+       color 0xd0d0a0 0xc03535
+       count 24
+       originjitter 40 40 10
+       rotate -180 180 0 0
+       sizeincrease 80
+       size 10 20
+       tex 0 8
+       type smoke
+       velocityjitter 250 250 450
+       velocityoffset 0 0 600
 effect wakizashi_gun_impact
-countabsolute 1
-type smoke
-tex 65 65
-color 0xff0000 0xc03535
-size 82 82
-alpha 250 300 680
-sizeincrease -180
+       alpha 250 300 680
+       color 0xff0000 0xc03535
+       countabsolute 1
+       sizeincrease -180
+       size 82 82
+       tex 65 65
+       type smoke
 effect wakizashi_gun_impact
-countabsolute 1
-type smoke
-tex 33 33
-color 0xff0000 0xc03535
-size 40 40
-alpha 50 100 620
-sizeincrease 900
-rotate -180 180 400 -400
+       alpha 50 100 620
+       color 0xff0000 0xc03535
+       countabsolute 1
+       rotate -180 180 400 -400
+       sizeincrease 900
+       size 40 40
+       tex 33 33
+       type smoke
 effect wakizashi_gun_impact
-countabsolute 1
-type decal
-tex 59 59
-size 14 14
-alpha 256 256 0
-originjitter 16 16 16
-rotate -180 180 0 0
-
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 16 16 16
+       rotate -180 180 0 0
+       size 14 14
+       tex 59 59
+       type decal
 effect wakizashi_gun_muzzleflash
-count 16
-type spark
-color 0xff0000 0xc03535
-tex 8 15
-size 5 7
-alpha 256 512 6280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 200 200 200
-velocitymultiplier 0.2
-sizeincrease -10
-stretchfactor 0.7
-
+       airfriction 12
+       alpha 256 512 6280
+       color 0xff0000 0xc03535
+       count 16
+       originjitter 2 2 2
+       sizeincrease -10
+       size 5 7
+       stretchfactor 0.700000
+       tex 8 15
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.200000
 effect wakizashi_rocket_explode
-countabsolute 1
-type decal
-tex 8 16
-size 72 72
-alpha 256 256 0
-originjitter 23 23 23
-lightradius 300
-lightradiusfade 1750
-lightcolor 8 4 0
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 0
+       lightradiusfade 1750
+       lightradius 300
+       originjitter 23 23 23
+       size 72 72
+       tex 8 16
+       type decal
 effect wakizashi_rocket_explode
-countabsolute 1
-type static
-tex 33 33 
-size 22 22
-alpha 56 56 230
-color 0x8f0d00 0xff5a00
-sizeincrease 2400
-// glow
+       alpha 56 56 230
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 2400
+       size 22 22
+       tex 33 33
+       type static
 effect wakizashi_rocket_explode
-countabsolute 1
-type static
-tex 64 64
-size 120 120
-alpha 156 156 830
-color 0x8f0d00 0xff5a00
-sizeincrease 240
-// fire effect
+       alpha 156 156 830
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 240
+       size 120 120
+       tex 64 64
+       type static
 effect wakizashi_rocket_explode
-notunderwater
-count 64
-type static
-tex 48 55
-color 0xFFAE00 0xff5a00
-size 12 21
-sizeincrease 195
-alpha 200 256 512
-airfriction 2
-liquidfriction 8
-originjitter 10 10 10
-velocityjitter 512 512 512
-rotate -180 180 -50 50
-// fire rays
+       airfriction 2
+       alpha 200 256 512
+       color 0xFFAE00 0xff5a00
+       count 64
+       liquidfriction 8
+       notunderwater
+       originjitter 10 10 10
+       rotate -180 180 -50 50
+       sizeincrease 195
+       size 12 21
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect wakizashi_rocket_explode
-notunderwater
-count 10
-type spark
-tex 48 55
-color 0xFFEA00 0xff5a00
-size 43 54
-sizeincrease 120
-alpha 200 256 1600
-airfriction -3
-liquidfriction 8
-originjitter 40 40 40
-velocityjitter 512 512 512
-stretchfactor 10
-// smoke
+       airfriction -3
+       alpha 200 256 1600
+       color 0xFFEA00 0xff5a00
+       count 10
+       liquidfriction 8
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 120
+       size 43 54
+       stretchfactor 10
+       tex 48 55
+       type spark
+       velocityjitter 512 512 512
 effect wakizashi_rocket_explode
-type alphastatic
-notunderwater
-tex 0 8
-count 32
-size 10 15
-sizeincrease 230
-alpha 300 450 556
-originjitter 100 100 100
-velocityjitter 200 200 200
-airfriction 3
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-// bouncing sparks
+       airfriction 3
+       alpha 300 450 556
+       color 0x4F4B46 0x000000
+       count 32
+       notunderwater
+       originjitter 100 100 100
+       rotate -180 180 -20 20
+       sizeincrease 230
+       size 10 15
+       tex 0 8
+       type alphastatic
+       velocityjitter 200 200 200
 effect wakizashi_rocket_explode
-notunderwater
-count 14
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 1 2
-alpha 644 956 884
-gravity 1
-airfriction 1
-liquidfriction 0.8
-velocityoffset 0 0 170
-originjitter 60 60 60
-velocityjitter 524 524 524
-// underwater bubbles
+       airfriction 1
+       alpha 644 956 884
+       color 0xffa35b 0xfff2be
+       count 14
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 60 60 60
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 524 524 524
+       velocityoffset 0 0 170
 effect wakizashi_rocket_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 160 160 160
-velocityjitter 144 144 144
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 160 160 160
+       size 1 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect wakizashi_rocket_explode
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 1200
-alpha 40 40 300
-
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 1200
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
 effect wakizashi_rocket_thrust
-notunderwater
-countabsolute 3
-type spark
-tex 48 55
-color 0x00FFDD 0x6200FF
-size 14 19
-sizeincrease -2
-alpha 200 256 1600
-velocityjitter 60 60 60
-velocitymultiplier -1.1
-stretchfactor 1
+       alpha 200 256 1600
+       color 0x00FFDD 0x6200FF
+       countabsolute 3
+       notunderwater
+       sizeincrease -2
+       size 14 19
+       stretchfactor 1
+       tex 48 55
+       type spark
+       velocityjitter 60 60 60
+       velocitymultiplier -1.100000
 effect wakizashi_rocket_thrust
-notunderwater
-countabsolute 2
-type spark
-tex 48 55
-color 0xFFFF33 0xFFEE00
-size 5 10
-sizeincrease -2
-alpha 200 256 1900
-velocityjitter 60 60 60
-velocitymultiplier -0.3
-stretchfactor 3
-
-// long lasting smoke
+       alpha 200 256 1900
+       color 0xFFFF33 0xFFEE00
+       countabsolute 2
+       notunderwater
+       sizeincrease -2
+       size 5 10
+       stretchfactor 3
+       tex 48 55
+       type spark
+       velocityjitter 60 60 60
+       velocitymultiplier -0.300000
 effect wakizashi_rocket_launch
-notunderwater
-count 8
-type smoke
-tex 0 8
-color 0xFFFFFF 0xD9C4B0
-size 3 30
-sizeincrease 20
-alpha 100 156 60
-velocityjitter 160 160 60
-velocitymultiplier -0.1
-airfriction 0.3
-// fast smoke
+       airfriction 0.300000
+       alpha 100 156 60
+       color 0xFFFFFF 0xD9C4B0
+       count 8
+       notunderwater
+       sizeincrease 20
+       size 3 30
+       tex 0 8
+       type smoke
+       velocityjitter 160 160 60
+       velocitymultiplier -0.100000
 effect wakizashi_rocket_launch
-notunderwater
-count 14
-type smoke
-tex 0 8
-color 0xFFFFFF 0xD9C4B0
-size 30 30
-sizeincrease 20
-alpha 100 156 260
-velocityjitter 160 160 60
-velocitymultiplier 0.4
-airfriction 0.3
-//sparks
+       airfriction 0.300000
+       alpha 100 156 260
+       color 0xFFFFFF 0xD9C4B0
+       count 14
+       notunderwater
+       sizeincrease 20
+       size 30 30
+       tex 0 8
+       type smoke
+       velocityjitter 160 160 60
+       velocitymultiplier 0.400000
 effect wakizashi_rocket_launch
-notunderwater
-count 10
-type spark
-tex 40 40
-color 0xFFFFFF 0xD9C4B0
-size 1 4
-alpha 200 256 1000
-velocityjitter 60 60 60
-velocitymultiplier -1.5
-
+       alpha 200 256 1000
+       color 0xFFFFFF 0xD9C4B0
+       count 10
+       notunderwater
+       size 1 4
+       tex 40 40
+       type spark
+       velocityjitter 60 60 60
+       velocitymultiplier -1.500000
 effect wakizashi_booster_smoke
-type alphastatic
-notunderwater
-tex 0 8
-count 3
-size 60 100
-sizeincrease 10
-gravity -0.1
-alpha 200 750 200
-velocityjitter 40 40 40
-originjitter 60 60 60
-airfriction 2
-color 0xA69A80 0xB3B39F
-rotate -180 180 -20 20
-
-// decal
+       airfriction 2
+       alpha 200 750 200
+       color 0xA69A80 0xB3B39F
+       count 3
+       gravity -0.100000
+       notunderwater
+       originjitter 60 60 60
+       rotate -180 180 -20 20
+       sizeincrease 10
+       size 60 100
+       tex 0 8
+       type alphastatic
+       velocityjitter 40 40 40
 effect raptor_cannon_impact
-countabsolute 1
-type decal
-tex 47 47
-size 24 24
-alpha 256 256 0
-originjitter 16 16 16
-rotate -180 180 0 0
-//spark
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 16 16 16
+       rotate -180 180 0 0
+       size 24 24
+       tex 47 47
+       type decal
 effect raptor_cannon_impact
-notunderwater
-count 6
-type spark
-tex 40 40
-color 0xD400FF 0x571863
-size 1 1
-alpha 644 956 784
-gravity 1
-airfriction 0.2
-velocityoffset 0 0 150
-originjitter 16 16 16
-velocityjitter 124 124 524
-// smoke
+       airfriction 0.200000
+       alpha 644 956 784
+       color 0xD400FF 0x571863
+       count 6
+       gravity 1
+       notunderwater
+       originjitter 16 16 16
+       size 1 1
+       tex 40 40
+       type spark
+       velocityjitter 124 124 524
+       velocityoffset 0 0 150
 effect raptor_cannon_impact
-count 4
-type alphastatic
-tex 0 7
-size 50 50
-color 0x646364 0x151515
-alpha 428 428 600
-rotate -180 180 0 0
-velocityjitter 200 200 300
-velocityoffset 0 0 340
-gravity 0.7
-airfriction 2
-// fire
+       airfriction 2
+       alpha 428 428 600
+       color 0x646364 0x151515
+       count 4
+       gravity 0.700000
+       rotate -180 180 0 0
+       size 50 50
+       tex 0 7
+       type alphastatic
+       velocityjitter 200 200 300
+       velocityoffset 0 0 340
 effect raptor_cannon_impact
-notunderwater
-count 10
-type static
-tex 48 55
-color 0xD400FF 0x571863
-size 33 44
-sizeincrease 25
-alpha 200 256 812
-bounce 1.5
-airfriction 8
-liquidfriction 8
-originjitter 8 8 8
-velocityjitter 312 312 312
-
-
+       airfriction 8
+       alpha 200 256 812
+       bounce 1.500000
+       color 0xD400FF 0x571863
+       count 10
+       liquidfriction 8
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease 25
+       size 33 44
+       tex 48 55
+       type static
+       velocityjitter 312 312 312
 effect raptor_cannon_muzzleflash
-count 16
-type spark
-color 0xD400FF 0x571863
-tex 8 15
-size 10 17
-alpha 1256 1512 56280
-airfriction 12
-originjitter 2 2 2
-velocityjitter 200 200 200
-velocitymultiplier 0.2
-sizeincrease -10
-stretchfactor 0.6
+       airfriction 12
+       alpha 1256 1512 56280
+       color 0xD400FF 0x571863
+       count 16
+       originjitter 2 2 2
+       sizeincrease -10
+       size 10 17
+       stretchfactor 0.600000
+       tex 8 15
+       type spark
+       velocityjitter 200 200 200
+       velocitymultiplier 0.200000
 effect raptor_cannon_muzzleflash
-countabsolute 1
-type static
-tex 48 55
-color 0xD400FF 0x571863
-size 32 32
-alpha 6056 20112 406280
-sizeincrease -100
-stretchfactor 0.1
-rotate -180 180 4000 -4000
-lightradius 150
-lightradiusfade 6000
-lightcolor 3 0 6
-
-// decal
+       alpha 6056 20112 406280
+       color 0xD400FF 0x571863
+       countabsolute 1
+       lightcolor 3 0 6
+       lightradiusfade 6000
+       lightradius 150
+       rotate -180 180 4000 -4000
+       sizeincrease -100
+       size 32 32
+       stretchfactor 0.100000
+       tex 48 55
+       type static
 effect raptor_bomb_impact
-countabsolute 1
-type decal
-tex 8 16
-size 84 84
-alpha 256 256 0
-originjitter 16 16 16
-rotate -180 180 0 0
-
-//spark vertical
+       alpha 256 256 0
+       countabsolute 1
+       originjitter 16 16 16
+       rotate -180 180 0 0
+       size 84 84
+       tex 8 16
+       type decal
 effect raptor_bomb_impact
-count 3
-type spark
-color 0xff9c00 0xff3c00
-tex 48 55
-size 20 40
-alpha 300 300 600
-originjitter 10 10 10
-velocityjitter 40 40 120
-stretchfactor 210
-sizeincrease 50
-
-//fire
+       alpha 300 300 600
+       color 0xff9c00 0xff3c00
+       count 3
+       originjitter 10 10 10
+       sizeincrease 50
+       size 20 40
+       stretchfactor 210
+       tex 48 55
+       type spark
+       velocityjitter 40 40 120
 effect raptor_bomb_impact
-count 4
-type static 
-color 0xff9c00 0xff3c00
-tex 48 55
-size 30 120
-alpha 300 300 500
-originjitter 10 10 10
-velocityjitter 950 950 0
-sizeincrease 230
-airfriction 2
-
-//smoke
+       airfriction 2
+       alpha 300 300 500
+       color 0xff9c00 0xff3c00
+       count 4
+       originjitter 10 10 10
+       sizeincrease 230
+       size 30 120
+       tex 48 55
+       type static
+       velocityjitter 950 950 0
 effect raptor_bomb_impact
-count 4
-type spark
-blend alpha
-tex 0 7
-size 120 180
-color 0x646364 0x151515
-alpha 428 428 600
-rotate -180 180 0 0
-velocityjitter 200 200 280
-velocityoffset 0 0 280
-originjitter 30 30 10
-stretchfactor 10
-
-//smoke 2
+       alpha 428 428 600
+       blend alpha
+       color 0x646364 0x151515
+       count 4
+       originjitter 30 30 10
+       rotate -180 180 0 0
+       size 120 180
+       stretchfactor 10
+       tex 0 7
+       type spark
+       velocityjitter 200 200 280
+       velocityoffset 0 0 280
 effect raptor_bomb_impact
-count 4
-//type alphastatic
-type spark
-blend alpha
-tex 0 7
-size 40 100
-color 0x646364 0x151515
-alpha 328 328 350
-rotate -180 180 0 0
-velocityjitter 200 200 300
-velocityoffset 0 0 580
-originjitter 30 30 10
-sizeincrease 60
-airfriction 0.6
-gravity 2
-
-// sparks
+       airfriction 0.600000
+       alpha 328 328 350
+       blend alpha
+       color 0x646364 0x151515
+       count 4
+       gravity 2
+       originjitter 30 30 10
+       rotate -180 180 0 0
+       sizeincrease 60
+       size 40 100
+       tex 0 7
+       type spark
+       velocityjitter 200 200 300
+       velocityoffset 0 0 580
 effect raptor_bomb_impact
-notunderwater
-count 5
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 3 5
-alpha 644 956 984
-gravity 1
-airfriction 0.3
-velocityoffset 0 0 350
-originjitter 16 16 16
-velocityjitter 174 174 924
-stretchfactor 2
-
+       airfriction 0.300000
+       alpha 644 956 984
+       color 0xffa35b 0xfff2be
+       count 5
+       gravity 1
+       notunderwater
+       originjitter 16 16 16
+       size 3 5
+       stretchfactor 2
+       tex 40 40
+       type spark
+       velocityjitter 174 174 924
+       velocityoffset 0 0 350
 effect raptor_bomb_spread
-notunderwater
-count 34
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 1 2
-alpha 644 956 1284
-gravity 1
-airfriction 1
-liquidfriction 0.8
-originjitter 110 110 110
-velocityjitter 324 324 324
-
-
-// generic explosion size:big (biggest explosion ever)
+       airfriction 1
+       alpha 644 956 1284
+       color 0xffa35b 0xfff2be
+       count 34
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 110 110 110
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 324 324 324
 effect explosion_big
-countabsolute 1
-type decal
-tex 8 16
-size 172 172
-alpha 256 256 0
-originjitter 23 23 23
-lightradius 600
-lightradiusfade 1750
-lightcolor 8 4 0
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 8 4 0
+       lightradiusfade 1750
+       lightradius 600
+       originjitter 23 23 23
+       size 172 172
+       tex 8 16
+       type decal
 effect explosion_big
-countabsolute 1
-type static
-tex 33 33 
-size 72 72
-alpha 56 56 330
-color 0x8f0d00 0xff5a00
-sizeincrease 4400
-// fire effect
+       alpha 56 56 330
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 4400
+       size 72 72
+       tex 33 33
+       type static
 effect explosion_big
-notunderwater
-count 64
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 133 144
-sizeincrease 45
-alpha 200 256 712
-airfriction 8
-liquidfriction 8
-originjitter 80 80 80
-velocityjitter 2512 2512 2512
-// fire rays
+       airfriction 8
+       alpha 200 256 712
+       color 0x8f0d00 0xff5a00
+       count 64
+       liquidfriction 8
+       notunderwater
+       originjitter 80 80 80
+       sizeincrease 45
+       size 133 144
+       tex 48 55
+       type static
+       velocityjitter 2512 2512 2512
 effect explosion_big
-notunderwater
-count 64
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 133 144
-sizeincrease 45
-alpha 200 256 800
-airfriction -5
-liquidfriction 8
-originjitter 40 40 40
-velocityjitter 512 512 512
-stretchfactor 10
-// smoke
+       airfriction -5
+       alpha 200 256 800
+       color 0x8f0d00 0xff5a00
+       count 64
+       liquidfriction 8
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 45
+       size 133 144
+       stretchfactor 10
+       tex 48 55
+       type spark
+       velocityjitter 512 512 512
 effect explosion_big
-type alphastatic
-notunderwater
-tex 0 8
-count 32
-size 50 100
-sizeincrease 244
-alpha 300 650 456
-velocityjitter 3444 3444 3444
-airfriction 8
-color 0x4F4B46 0x000000
-// bouncing sparks
+       airfriction 8
+       alpha 300 650 456
+       color 0x4F4B46 0x000000
+       count 32
+       notunderwater
+       sizeincrease 244
+       size 50 100
+       tex 0 8
+       type alphastatic
+       velocityjitter 3444 3444 3444
 effect explosion_big
-notunderwater
-count 34
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 3 4
-alpha 644 956 1284
-gravity 1
-airfriction 1
-liquidfriction 0.8
-velocityoffset 0 0 370
-originjitter 160 160 160
-velocityjitter 924 924 924
-stretchfactor 0.7
-// debris
+       airfriction 1
+       alpha 644 956 1284
+       color 0xffa35b 0xfff2be
+       count 34
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 160 160 160
+       size 3 4
+       stretchfactor 0.700000
+       tex 40 40
+       type spark
+       velocityjitter 924 924 924
+       velocityoffset 0 0 370
 effect explosion_big
-notunderwater
-count 16
-type alphastatic
-tex 66 68
-color 0xFFFFFF 0xcac5b4
-size 10 16
-alpha 444 1356 1184
-gravity 2.3
-airfriction 0.5
-velocityjitter 1800 1800 1800
-velocityoffset 0 0 970
-sizeincrease -5
-rotate -180 180 -1000 1000
-// underwater bubbles
+       airfriction 0.500000
+       alpha 444 1356 1184
+       color 0xFFFFFF 0xcac5b4
+       count 16
+       gravity 2.300000
+       notunderwater
+       rotate -180 180 -1000 1000
+       sizeincrease -5
+       size 10 16
+       tex 66 68
+       type alphastatic
+       velocityjitter 1800 1800 1800
+       velocityoffset 0 0 970
 effect explosion_big
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 160 160 160
-velocityjitter 444 444 444
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 160 160 160
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 444 444 444
 effect explosion_big
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 2900
-alpha 40 40 300
-velocitymultiplier 0.3
-
-
-// generic explosion size:medium (it leaves rising smoke for a longer time)
-// shockwave
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 2900
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
+       velocitymultiplier 0.300000
 effect explosion_medium
-countabsolute 1
-type static
-tex 33 33 
-size 72 72
-alpha 56 56 330
-color 0x8f0d00 0xff5a00
-sizeincrease 2400
-// fire effect
+       alpha 56 56 330
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 2400
+       size 72 72
+       tex 33 33
+       type static
 effect explosion_medium
-notunderwater
-count 32
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 133 144
-sizeincrease 45
-alpha 200 256 712
-airfriction 8
-liquidfriction 8
-originjitter 30 30 30
-velocityjitter 1512 1512 1512
-rotate -180 180 -500 500
-// fire effect 2
+       airfriction 8
+       alpha 200 256 712
+       color 0x8f0d00 0xff5a00
+       count 32
+       liquidfriction 8
+       notunderwater
+       originjitter 30 30 30
+       rotate -180 180 -500 500
+       sizeincrease 45
+       size 133 144
+       tex 48 55
+       type static
+       velocityjitter 1512 1512 1512
 effect explosion_medium
-notunderwater
-count 32
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 73 94
-sizeincrease 40
-gravity -2
-alpha 200 256 612
-airfriction 8
-liquidfriction 8
-originjitter 30 30 30
-velocityjitter 1512 1512 1512
-rotate -180 180 -150 150
-// fire rays
+       airfriction 8
+       alpha 200 256 612
+       color 0x8f0d00 0xff5a00
+       count 32
+       gravity -2
+       liquidfriction 8
+       notunderwater
+       originjitter 30 30 30
+       rotate -180 180 -150 150
+       sizeincrease 40
+       size 73 94
+       tex 48 55
+       type static
+       velocityjitter 1512 1512 1512
 effect explosion_medium
-notunderwater
-count 14
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 43 74
-sizeincrease 40
-alpha 200 256 800
-airfriction -3
-liquidfriction 8
-originjitter 40 40 40
-velocityjitter 512 512 512
-stretchfactor 8
-// smoke 
+       airfriction -3
+       alpha 200 256 800
+       color 0x8f0d00 0xff5a00
+       count 14
+       liquidfriction 8
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 40
+       size 43 74
+       stretchfactor 8
+       tex 48 55
+       type spark
+       velocityjitter 512 512 512
 effect explosion_medium
-type alphastatic
-notunderwater
-tex 0 8
-count 5
-size 250 300
-sizeincrease -30
-alpha 300 650 756
-originjitter 100 100 100
-velocityjitter 200 200 200
-airfriction 3
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-// smoke 2
+       airfriction 3
+       alpha 300 650 756
+       color 0x4F4B46 0x000000
+       count 5
+       notunderwater
+       originjitter 100 100 100
+       rotate -180 180 -20 20
+       sizeincrease -30
+       size 250 300
+       tex 0 8
+       type alphastatic
+       velocityjitter 200 200 200
 effect explosion_medium
-type alphastatic
-notunderwater
-tex 0 8
-count 10
-size 50 100
-sizeincrease 50
-gravity -0.3
-alpha 300 650 256
-originjitter 100 100 100
-velocityjitter 500 500 500
-velocityoffset 0 0 200
-airfriction 3
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-// smoke rays
+       airfriction 3
+       alpha 300 650 256
+       color 0x4F4B46 0x000000
+       count 10
+       gravity -0.300000
+       notunderwater
+       originjitter 100 100 100
+       rotate -180 180 -20 20
+       sizeincrease 50
+       size 50 100
+       tex 0 8
+       type alphastatic
+       velocityjitter 500 500 500
+       velocityoffset 0 0 200
 effect explosion_medium
-type spark
-notunderwater
-tex 0 8
-count 13
-size 150 200
-sizeincrease 100
-alpha 140 255 350
-velocityjitter 250 250 250
-originjitter 40 40 40
-color 0x4F4B46 0x000000
-stretchfactor 50
-// bouncing sparks
+       alpha 140 255 350
+       color 0x4F4B46 0x000000
+       count 13
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 100
+       size 150 200
+       stretchfactor 50
+       tex 0 8
+       type spark
+       velocityjitter 250 250 250
 effect explosion_medium
-notunderwater
-count 14
-type spark
-tex 40 40
-color 0xffa35b 0xfff2be
-size 2 3
-alpha 644 956 984
-gravity 1
-airfriction 1
-liquidfriction 0.8
-velocityoffset 0 0 370
-originjitter 100 100 100
-velocityjitter 624 624 624
-stretchfactor 0.7
-// underwater bubbles
+       airfriction 1
+       alpha 644 956 984
+       color 0xffa35b 0xfff2be
+       count 14
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 100 100 100
+       size 2 3
+       stretchfactor 0.700000
+       tex 40 40
+       type spark
+       velocityjitter 624 624 624
+       velocityoffset 0 0 370
 effect explosion_medium
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 160 160 160
-velocityjitter 444 444 444
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 160 160 160
+       size 3 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 444 444 444
 effect explosion_medium
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 2900
-alpha 40 40 300
-velocitymultiplier 0.3
-
-// generic explosion size:small (its fire only, made to support other explosions)
-// shockwave
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 2900
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
+       velocitymultiplier 0.300000
 effect explosion_small
-countabsolute 1
-type static
-tex 33 33 
-size 22 22
-alpha 56 56 330
-color 0x8f0d00 0xff5a00
-sizeincrease 2400
-// fire effect
+       alpha 56 56 330
+       color 0x8f0d00 0xff5a00
+       countabsolute 1
+       sizeincrease 2400
+       size 22 22
+       tex 33 33
+       type static
 effect explosion_small
-notunderwater
-count 16
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 1 44
-sizeincrease 45
-alpha 200 256 1212
-airfriction 5
-liquidfriction 8
-velocityjitter 512 512 512
-rotate -180 180 -500 500
-// fire effect 2
+       airfriction 5
+       alpha 200 256 1212
+       color 0x8f0d00 0xff5a00
+       count 16
+       liquidfriction 8
+       notunderwater
+       rotate -180 180 -500 500
+       sizeincrease 45
+       size 1 44
+       tex 48 55
+       type static
+       velocityjitter 512 512 512
 effect explosion_small
-notunderwater
-count 16
-type static
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 73 94
-sizeincrease 40
-alpha 200 256 812
-airfriction 8
-liquidfriction 8
-velocityjitter 912 912 912
-rotate -180 180 -150 150
-// fire rays
+       airfriction 8
+       alpha 200 256 812
+       color 0x8f0d00 0xff5a00
+       count 16
+       liquidfriction 8
+       notunderwater
+       rotate -180 180 -150 150
+       sizeincrease 40
+       size 73 94
+       tex 48 55
+       type static
+       velocityjitter 912 912 912
 effect explosion_small
-notunderwater
-count 14
-type spark
-tex 48 55
-color 0x8f0d00 0xff5a00
-size 13 54
-sizeincrease 30
-alpha 200 256 1300
-airfriction -3
-liquidfriction 8
-originjitter 40 40 40
-velocityjitter 512 512 512
-stretchfactor 8
-// underwater bubbles
+       airfriction -3
+       alpha 200 256 1300
+       color 0x8f0d00 0xff5a00
+       count 14
+       liquidfriction 8
+       notunderwater
+       originjitter 40 40 40
+       sizeincrease 30
+       size 13 54
+       stretchfactor 8
+       tex 48 55
+       type spark
+       velocityjitter 512 512 512
 effect explosion_small
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 3
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 160 160 160
-velocityjitter 144 144 144
-// underwatershockwave
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 160 160 160
+       size 1 3
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 144 144 144
 effect explosion_small
-underwater
-type smoke
-countabsolute 1
-tex 33 33
-size 30 30
-sizeincrease 1200
-alpha 40 40 300
-
-// big smoke ( for spamming on damaged stuff )
+       alpha 40 40 300
+       countabsolute 1
+       sizeincrease 1200
+       size 30 30
+       tex 33 33
+       type smoke
+       underwater
 effect smoke_big
-type alphastatic
-notunderwater
-tex 0 8
-count 3
-size 30 60
-sizeincrease 15
-gravity -0.5
-alpha 200 750 200
-originjitter 55 55 55
-velocityjitter 140 140 200
-velocityoffset 0 0 200
-airfriction 4
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-
-// small smoke ( more precise than big one, for spamming on damaged parts like raptors spinner )
+       airfriction 4
+       alpha 200 750 200
+       color 0x4F4B46 0x000000
+       count 3
+       gravity -0.500000
+       notunderwater
+       originjitter 55 55 55
+       rotate -180 180 -20 20
+       sizeincrease 15
+       size 30 60
+       tex 0 8
+       type alphastatic
+       velocityjitter 140 140 200
+       velocityoffset 0 0 200
 effect smoke_small
-type alphastatic
-notunderwater
-tex 0 8
-count 3
-size 60 100
-sizeincrease -10
-gravity -0.5
-alpha 200 750 200
-velocityjitter 40 40 400
-velocityoffset 0 0 200
-airfriction 4
-color 0x4F4B46 0x000000
-rotate -180 180 -20 20
-
-// metal impact effect
-// used in qcsrc/server/mutators/sandbox.qc:   pointparticles(particleeffectnum("impact_metal"), self.origin, '0 0 0', 1);
+       airfriction 4
+       alpha 200 750 200
+       color 0x4F4B46 0x000000
+       count 3
+       gravity -0.500000
+       notunderwater
+       rotate -180 180 -20 20
+       sizeincrease -10
+       size 60 100
+       tex 0 8
+       type alphastatic
+       velocityjitter 40 40 400
+       velocityoffset 0 0 200
 effect impact_metal
-count 1
-type alphastatic
-tex 0 8
-size 3 6
-sizeincrease 10
-alpha 25 64 50
-gravity -0.01
-color 0x000000 0x886666
-originjitter 20 20 5
-// sparks
+       alpha 25 64 50
+       color 0x000000 0x886666
+       count 1
+       gravity -0.010000
+       originjitter 20 20 5
+       sizeincrease 10
+       size 3 6
+       tex 0 8
+       type alphastatic
 effect impact_metal
-count 2
-type spark
-tex 41 41
-color 0xFFCC22 0xFF4422
-size 2 2
-alpha 255 255 112
-bounce 1.8
-stretchfactor 0.5
-velocityjitter 200 200 300
-velocitymultiplier 2
-airfriction 2
-gravity 1
-
-// stone impact effect
-// used in qcsrc/server/mutators/sandbox.qc:   pointparticles(particleeffectnum("impact_stone"), self.origin, '0 0 0', 1);
+       airfriction 2
+       alpha 255 255 112
+       bounce 1.800000
+       color 0xFFCC22 0xFF4422
+       count 2
+       gravity 1
+       size 2 2
+       stretchfactor 0.500000
+       tex 41 41
+       type spark
+       velocityjitter 200 200 300
+       velocitymultiplier 2
 effect impact_stone
-count 1
-type alphastatic
-tex 0 8
-size 3 6
-sizeincrease 15
-alpha 50 128 75
-gravity -0.01
-color 0x000000 0xcc9966
-originjitter 20 20 5
-// debris
+       alpha 50 128 75
+       color 0x000000 0xcc9966
+       count 1
+       gravity -0.010000
+       originjitter 20 20 5
+       sizeincrease 15
+       size 3 6
+       tex 0 8
+       type alphastatic
 effect impact_stone
-notunderwater
-count 1
-type alphastatic
-tex 66 68
-color 0x000000 0x886644
-size 1 2
-alpha 450 750 300
-gravity 1.3
-airfriction 0.5
-bounce 1.2
-velocityjitter 124 124 324
-rotate -180 180 -1000 1000
-
-// wood impact effect
-// used in qcsrc/server/mutators/sandbox.qc:   pointparticles(particleeffectnum("impact_wood"), self.origin, '0 0 0', 1);
+       airfriction 0.500000
+       alpha 450 750 300
+       bounce 1.200000
+       color 0x000000 0x886644
+       count 1
+       gravity 1.300000
+       notunderwater
+       rotate -180 180 -1000 1000
+       size 1 2
+       tex 66 68
+       type alphastatic
+       velocityjitter 124 124 324
 effect impact_wood
-count 1
-type alphastatic
-tex 0 8
-size 3 6
-sizeincrease 10
-alpha 50 128 75
-gravity -0.01
-color 0x000000 0xcc9966
-originjitter 20 20 5
-// sparks
+       alpha 50 128 75
+       color 0x000000 0xcc9966
+       count 1
+       gravity -0.010000
+       originjitter 20 20 5
+       sizeincrease 10
+       size 3 6
+       tex 0 8
+       type alphastatic
 effect impact_wood
-count 2
-type spark
-tex 41 41
-color 0x221100 0x221100
-size 1 8
-alpha 255 255 75
-bounce 1.5
-velocityjitter 180 180 260
-velocitymultiplier 2
-airfriction 2
-gravity 1
-
-// flesh impact effect
-// used in qcsrc/server/mutators/sandbox.qc:   pointparticles(particleeffectnum("impact_flesh"), self.origin, '0 0 0', 1);
+       airfriction 2
+       alpha 255 255 75
+       bounce 1.500000
+       color 0x221100 0x221100
+       count 2
+       gravity 1
+       size 1 8
+       tex 41 41
+       type spark
+       velocityjitter 180 180 260
+       velocitymultiplier 2
 effect impact_flesh
-count 0.5
-type alphastatic
-tex 0 8
-size 8 12
-alpha 100 256 400
-color 0x000000 0x420000
-originjitter 11 11 11
-// blood splash
+       alpha 100 256 400
+       color 0x000000 0x420000
+       count 0.500000
+       originjitter 11 11 11
+       size 8 12
+       tex 0 8
+       type alphastatic
 effect impact_flesh
-count 0.3
-type blood
-tex 24 32
-size 2 6
-alpha 256 256 64
-color 0xA8FFFF 0xA8FFFFF
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 96 96 96
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-
-// hagar trail
-// smoke
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.300000
+       liquidfriction 4
+       size 2 6
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 96 96 96
+       velocitymultiplier 5
 effect tr_hagar
-trailspacing 4
-type smoke
-color 0x101010 0x000000
-tex 0 8
-size 3 2
-bounce 1
-sizeincrease 10
-alpha 300 400 780
-originjitter 1 1 1
-velocityjitter 1 1 1
-velocitymultiplier -0.02
-//gravity -0.11
-// fire
+       alpha 300 400 780
+       bounce 1
+       color 0x101010 0x000000
+       originjitter 1 1 1
+       sizeincrease 10
+       size 3 2
+       tex 0 8
+       trailspacing 4
+       type smoke
+       velocityjitter 1 1 1
+       velocitymultiplier -0.020000
 effect tr_hagar
-notunderwater
-trailspacing 4
-type static
-color 0xffdf72 0x811200
-tex 48 55
-size 5 2
-sizeincrease -15
-alpha 100 144 988
-airfriction 8
-velocityjitter 32 32 32
-velocitymultiplier -1.0
-// bubbles
+       airfriction 8
+       alpha 100 144 988
+       color 0xffdf72 0x811200
+       notunderwater
+       sizeincrease -15
+       size 5 2
+       tex 48 55
+       trailspacing 4
+       type static
+       velocityjitter 32 32 32
+       velocitymultiplier -1
 effect tr_hagar
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
-// laser damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x404040 0x808080
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect damage_laser
-notunderwater
-count 3
-type smoke
-tex 0 8
-color 0x880000 0xff4400
-size 2 4
-sizeincrease 8
-alpha 128 16 128
-gravity 0
-originjitter 2 2 2
-velocityjitter 0.4 0.4 0.6
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-
-// shotgun damage effect, normal blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction -0.350000
+       alpha 128 16 128
+       color 0x880000 0xff4400
+       count 3
+       notunderwater
+       originjitter 2 2 2
+       rotate 0 180 -30 30
+       sizeincrease 8
+       size 2 4
+       tex 0 8
+       type smoke
+       velocityjitter 0.4 0.4 0.6
 effect damage_shotgun
-count 0.6
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xA8FFFF 0xA8FFFFF
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.600000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 5
 effect damage_shotgun
-count 1
-type alphastatic
-tex 0 8
-size 8 16
-alpha 100 256 400
-color 0x000000 0x420000
-originjitter 1 1 1
-
-// shotgun damage effect, alien blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x420000
+       count 1
+       originjitter 1 1 1
+       size 8 16
+       tex 0 8
+       type alphastatic
 effect damage_shotgun_alien
-count 0.6
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xDC9BCD 0xDC9BCD
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xDC9BCD 0xDC9BCD
+       count 0.600000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 5
 effect damage_shotgun_alien
-count 1
-type alphastatic
-tex 0 8
-size 8 16
-alpha 100 256 400
-color 0x000000 0x204010
-originjitter 1 1 1
-
-// shotgun damage effect, robot blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x204010
+       count 1
+       originjitter 1 1 1
+       size 8 16
+       tex 0 8
+       type alphastatic
 effect damage_shotgun_robot
-count 0.6
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xC0D890 0xC0D890
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 64 64 64
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xC0D890 0xC0D890
+       count 0.600000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 64 64 64
+       velocitymultiplier 5
 effect damage_shotgun_robot
-count 1
-type alphastatic
-tex 0 8
-size 8 16
-alpha 100 256 400
-color 0x000000 0x301860
-originjitter 1 1 1
-
-// uzi damage effect, normal blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x301860
+       count 1
+       originjitter 1 1 1
+       size 8 16
+       tex 0 8
+       type alphastatic
 effect damage_uzi
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xA8FFFF 0xA8FFFFF
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_uzi
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x420000
-originjitter 0 0 0
-
-// uzi damage effect, alien blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x420000
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_uzi_alien
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xDC9BCD 0xDC9BCD
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xDC9BCD 0xDC9BCD
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_uzi_alien
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x204010
-originjitter 0 0 0
-
-// uzi damage effect, robot blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x204010
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_uzi_robot
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xC0D890 0xC0D890
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xC0D890 0xC0D890
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_uzi_robot
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x301860
-originjitter 0 0 0
-
-// minelayer damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x301860
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_minelayer
-notunderwater
-count 3
-type smoke
-tex 48 55
-size 4 8
-alpha 512 64 1024
-gravity -0.5
-color 0x8f0d00 0xff5a00
-sizeincrease -15
-originjitter 2 2 2
-velocityjitter 22 22 50
-// smoke
+       alpha 512 64 1024
+       color 0x8f0d00 0xff5a00
+       count 3
+       gravity -0.500000
+       notunderwater
+       originjitter 2 2 2
+       sizeincrease -15
+       size 4 8
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect damage_minelayer
-notunderwater
-type alphastatic
-count 2
-tex 0 8
-size 4 8
-sizeincrease 5
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 4 4 4
-velocityjitter 11 11 50
-// light
-/*effect damage_minelayer
-notunderwater
-trailspacing 8
-lightradius 60
-lightradiusfade 280
-lightcolor 0.7 0.4 0.2*/
-
-// grenadelauncher damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 2
+       gravity -0.300000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease 5
+       size 4 8
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect damage_grenadelauncher
-notunderwater
-count 3
-type smoke
-tex 48 55
-size 4 8
-alpha 512 64 1024
-gravity -0.5
-color 0x8f0d00 0xff5a00
-sizeincrease -15
-originjitter 2 2 2
-velocityjitter 22 22 50
-// smoke
+       alpha 512 64 1024
+       color 0x8f0d00 0xff5a00
+       count 3
+       gravity -0.500000
+       notunderwater
+       originjitter 2 2 2
+       sizeincrease -15
+       size 4 8
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect damage_grenadelauncher
-notunderwater
-type alphastatic
-count 2
-tex 0 8
-size 4 8
-sizeincrease 5
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 4 4 4
-velocityjitter 11 11 50
-// light
-/*effect damage_grenadelauncher
-notunderwater
-trailspacing 8
-lightradius 60
-lightradiusfade 280
-lightcolor 0.7 0.4 0.2*/
-
-// electro damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 2
+       gravity -0.300000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease 5
+       size 4 8
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect damage_electro
-notunderwater
-count 2
-type static
-tex 47 47
-color 0x66ffff 0x2288ff
-size 6 10
-sizeincrease -14
-alpha 48 8 48
-gravity -0.0001
-airfriction 0.2
-liquidfriction 0.8
-originjitter 3 3 3
-velocityjitter 8 8 16
-velocitymultiplier 0
-airfriction -0.5
-rotate 180 360 -30 30
-// plasma smoke
+       airfriction -0.500000
+       alpha 48 8 48
+       color 0x66ffff 0x2288ff
+       count 2
+       gravity -0.000100
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 3 3 3
+       rotate 180 360 -30 30
+       sizeincrease -14
+       size 6 10
+       tex 47 47
+       type static
+       velocityjitter 8 8 16
 effect damage_electro
-notunderwater
-count 4
-type smoke
-tex 0 8
-color 0x2244ff 0x002266
-size 4 8
-sizeincrease 10
-alpha 64 16 64
-gravity 0
-originjitter 4 4 4
-velocityjitter 0.4 0.4 0.6
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-// bouncing sparks
+       airfriction -0.350000
+       alpha 64 16 64
+       color 0x2244ff 0x002266
+       count 4
+       notunderwater
+       originjitter 4 4 4
+       rotate 0 180 -30 30
+       sizeincrease 10
+       size 4 8
+       tex 0 8
+       type smoke
+       velocityjitter 0.4 0.4 0.6
 effect damage_electro
-count 0.5
-type spark
-tex 66 68
-color 0x003090 0x00CCFF
-size 1 1
-alpha 768 64 256
-gravity 0.2
-airfriction 1
-bounce 1.5
-liquidfriction 0.8
-velocityoffset 0 0 0
-velocityjitter 32 32 32
-// light
-/*effect damage_electro
-notunderwater
-trailspacing 8
-lightradius 50
-lightradiusfade 220
-lightcolor 0.2 0.6 0.8*/
-
-// crylink damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction 1
+       alpha 768 64 256
+       bounce 1.500000
+       color 0x003090 0x00CCFF
+       count 0.500000
+       gravity 0.200000
+       liquidfriction 0.800000
+       size 1 1
+       tex 66 68
+       type spark
+       velocityjitter 32 32 32
 effect damage_crylink
-notunderwater
-count 2
-type static
-tex 38 38
-color 0xff44ff 0x9966ff
-size 0.5 1
-sizeincrease -8
-alpha 48 16 48
-gravity -0.0001
-airfriction 0.6
-liquidfriction 0.8
-originjitter 3 3 3
-velocityjitter 10 10 20
-velocitymultiplier 0
-airfriction -0.5
-rotate 180 360 -30 30
-// plasma smoke
+       airfriction -0.500000
+       alpha 48 16 48
+       color 0xff44ff 0x9966ff
+       count 2
+       gravity -0.000100
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 3 3 3
+       rotate 180 360 -30 30
+       sizeincrease -8
+       size 0.500000 1
+       tex 38 38
+       type static
+       velocityjitter 10 10 20
 effect damage_crylink
-notunderwater
-count 4
-type smoke
-tex 0 8
-color 0x8844ff 0x662244
-size 5 10
-sizeincrease 6
-alpha 64 16 64
-gravity 0.001
-originjitter 4 4 4
-velocityjitter 0.4 0.4 0.6
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-// floating sparks
+       airfriction -0.350000
+       alpha 64 16 64
+       color 0x8844ff 0x662244
+       count 4
+       gravity 0.001000
+       notunderwater
+       originjitter 4 4 4
+       rotate 0 180 -30 30
+       sizeincrease 6
+       size 5 10
+       tex 0 8
+       type smoke
+       velocityjitter 0.4 0.4 0.6
 effect damage_crylink
-count 0.3
-type spark
-color 0x903090 0xFFD0FF
-size 0.5 0.5
-sizeincrease -5
-alpha 192 192 128
-gravity 0
-airfriction 0.2
-liquidfriction 0.8
-velocityoffset 0 0 0
-velocityjitter 12 12 12
-// light
-/*effect damage_crylink
-notunderwater
-trailspacing 8
-lightradius 50
-lightradiusfade 240
-lightcolor 0.6 0.2 0.8*/
-
-// hlac damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 192 192 128
+       color 0x903090 0xFFD0FF
+       count 0.300000
+       liquidfriction 0.800000
+       sizeincrease -5
+       size 0.500000 0.500000
+       type spark
+       velocityjitter 12 12 12
 effect damage_hlac
-notunderwater
-count 3
-type smoke
-tex 0 8
-color 0x880000 0xff4400
-size 2 4
-sizeincrease 10
-alpha 128 16 128
-gravity 0
-originjitter 4 4 4
-velocityjitter 0.4 0.4 0.6
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-
-// nex damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction -0.350000
+       alpha 128 16 128
+       color 0x880000 0xff4400
+       count 3
+       notunderwater
+       originjitter 4 4 4
+       rotate 0 180 -30 30
+       sizeincrease 10
+       size 2 4
+       tex 0 8
+       type smoke
+       velocityjitter 0.4 0.4 0.6
 effect damage_nex
-count 1
-type static
-tex 47 47
-color 0xffffff 0x88ffff
-size 5 10
-sizeincrease -14
-alpha 64 8 64
-gravity -0.0001
-airfriction 0.1
-liquidfriction 0.6
-originjitter 4 4 4
-velocityjitter 8 8 16
-velocitymultiplier 0
-airfriction -0.5
-rotate 180 360 -30 30
-// plasma smoke
+       airfriction -0.500000
+       alpha 64 8 64
+       color 0xffffff 0x88ffff
+       count 1
+       gravity -0.000100
+       liquidfriction 0.600000
+       originjitter 4 4 4
+       rotate 180 360 -30 30
+       sizeincrease -14
+       size 5 10
+       tex 47 47
+       type static
+       velocityjitter 8 8 16
 effect damage_nex
-count 2
-type smoke
-tex 0 8
-color 0x6688ff 0x226688
-size 4 8
-sizeincrease 8
-alpha 64 16 64
-gravity 0
-originjitter 2 2 2
-velocityjitter 0.5 0.5 0.8
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-// bouncing sparks
+       airfriction -0.350000
+       alpha 64 16 64
+       color 0x6688ff 0x226688
+       count 2
+       originjitter 2 2 2
+       rotate 0 180 -30 30
+       sizeincrease 8
+       size 4 8
+       tex 0 8
+       type smoke
+       velocityjitter 0.5 0.5 0.8
 effect damage_nex
-count 0.2
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 1 1
-alpha 255 255 112
-bounce 1.6
-stretchfactor 0.7
-velocityjitter 100 100 300
-velocitymultiplier 3
-airfriction 2
-gravity 1
-// light
-/*effect damage_nex
-trailspacing 8
-lightradius 60
-lightradiusfade 280
-lightcolor 0.6 0.8 0.8*/
-
-// minstanex damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction 2
+       alpha 255 255 112
+       bounce 1.600000
+       color 0xD9FDFF 0xD9FDFF
+       count 0.200000
+       gravity 1
+       size 1 1
+       stretchfactor 0.700000
+       tex 41 41
+       type spark
+       velocityjitter 100 100 300
+       velocitymultiplier 3
 effect damage_minstanex
-count 2
-type static
-tex 47 47
-color 0xffffff 0x88ffff
-size 5 10
-sizeincrease -14
-alpha 64 8 64
-gravity -0.0001
-airfriction 0.1
-liquidfriction 0.6
-originjitter 4 4 4
-velocityjitter 8 8 16
-velocitymultiplier 0
-airfriction -0.5
-rotate 180 360 -30 30
-// plasma smoke
+       airfriction -0.500000
+       alpha 64 8 64
+       color 0xffffff 0x88ffff
+       count 2
+       gravity -0.000100
+       liquidfriction 0.600000
+       originjitter 4 4 4
+       rotate 180 360 -30 30
+       sizeincrease -14
+       size 5 10
+       tex 47 47
+       type static
+       velocityjitter 8 8 16
 effect damage_minstanex
-count 4
-type smoke
-tex 0 8
-color 0x6688ff 0x226688
-size 4 8
-sizeincrease 8
-alpha 64 16 64
-gravity 0
-originjitter 2 2 2
-velocityjitter 0.5 0.5 0.8
-velocitymultiplier 0
-airfriction -0.35
-rotate 0 180 -30 30
-// bouncing sparks
+       airfriction -0.350000
+       alpha 64 16 64
+       color 0x6688ff 0x226688
+       count 4
+       originjitter 2 2 2
+       rotate 0 180 -30 30
+       sizeincrease 8
+       size 4 8
+       tex 0 8
+       type smoke
+       velocityjitter 0.5 0.5 0.8
 effect damage_minstanex
-count 0.2
-type spark
-tex 41 41
-color 0xD9FDFF 0xD9FDFF
-size 1 1
-alpha 255 255 112
-bounce 1.6
-stretchfactor 0.7
-velocityjitter 100 100 300
-velocitymultiplier 3
-airfriction 2
-gravity 1
-// light
-/*effect damage_minstanex
-trailspacing 8
-lightradius 60
-lightradiusfade 240
-lightcolor 0.6 0.8 0.8*/
-
-// sniperrifle damage effect, normal blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       airfriction 2
+       alpha 255 255 112
+       bounce 1.600000
+       color 0xD9FDFF 0xD9FDFF
+       count 0.200000
+       gravity 1
+       size 1 1
+       stretchfactor 0.700000
+       tex 41 41
+       type spark
+       velocityjitter 100 100 300
+       velocitymultiplier 3
 effect damage_rifle
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xA8FFFF 0xA8FFFFF
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xA8FFFF 0xA8FFFFF
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_rifle
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x420000
-originjitter 0 0 0
-
-// sniperrifle damage effect, alien blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x420000
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_rifle_alien
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xDC9BCD 0xDC9BCD
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xDC9BCD 0xDC9BCD
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_rifle_alien
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x204010
-originjitter 0 0 0
-
-// sniperrifle damage effect, robot blood
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x204010
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_rifle_robot
-count 0.3
-type blood
-tex 24 32
-size 2 4
-alpha 256 256 64
-color 0xC0D890 0xC0D890
-bounce -1
-airfriction 1
-liquidfriction 4
-velocityjitter 32 32 32
-velocitymultiplier 5
-staincolor 0x808080 0x808080
-staintex 16 24
-//blood mist
+       airfriction 1
+       alpha 256 256 64
+       bounce -1
+       color 0xC0D890 0xC0D890
+       count 0.300000
+       liquidfriction 4
+       size 2 4
+       staincolor 0x808080 0x808080
+       staintex 16 24
+       tex 24 32
+       type blood
+       velocityjitter 32 32 32
+       velocitymultiplier 5
 effect damage_rifle_robot
-count 1
-type alphastatic
-tex 0 8
-size 6 12
-alpha 100 256 400
-color 0x000000 0x301860
-originjitter 0 0 0
-
-// seeker damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 100 256 400
+       color 0x000000 0x301860
+       count 1
+       size 6 12
+       tex 0 8
+       type alphastatic
 effect damage_seeker
-notunderwater
-count 3
-type smoke
-tex 48 55
-size 4 8
-alpha 512 32 1024
-gravity -0.3
-color 0x8f0c00 0xff2200
-sizeincrease -10
-originjitter 2 2 2
-velocityjitter 22 22 50
-// smoke
+       alpha 512 32 1024
+       color 0x8f0c00 0xff2200
+       count 3
+       gravity -0.300000
+       notunderwater
+       originjitter 2 2 2
+       sizeincrease -10
+       size 4 8
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect damage_seeker
-notunderwater
-type alphastatic
-count 2
-tex 0 8
-size 2 4
-sizeincrease 10
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 4 4 4
-velocityjitter 11 11 50
-// light
-/*effect damage_seeker
-notunderwater
-trailspacing 8
-lightradius 65
-lightradiusfade 280
-lightcolor 0.7 0.5 0.1*/
-
-// hagar damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 2
+       gravity -0.300000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease 10
+       size 2 4
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect damage_hagar
-notunderwater
-count 3
-type smoke
-tex 48 55
-size 4 8
-alpha 512 32 1024
-gravity -0.3
-color 0x8f0c00 0xff3a00
-sizeincrease -10
-originjitter 2 2 2
-velocityjitter 22 22 50
-// smoke
+       alpha 512 32 1024
+       color 0x8f0c00 0xff3a00
+       count 3
+       gravity -0.300000
+       notunderwater
+       originjitter 2 2 2
+       sizeincrease -10
+       size 4 8
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect damage_hagar
-notunderwater
-type alphastatic
-count 2
-tex 0 8
-size 2 4
-sizeincrease 10
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 4 4 4
-velocityjitter 11 11 50
-// light
-/*effect damage_hagar
-notunderwater
-trailspacing 8
-lightradius 65
-lightradiusfade 280
-lightcolor 0.7 0.5 0.1*/
-
-// fireball damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 2
+       gravity -0.300000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease 10
+       size 2 4
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect damage_fireball
-notunderwater
-count 4
-type smoke
-tex 48 55
-size 5 10
-alpha 256 16 512
-gravity -0.5
-color 0x8f0d00 0xff5a00
-sizeincrease -10
-originjitter 8 8 8
-velocityjitter 22 22 50
-// smoke
+       alpha 256 16 512
+       color 0x8f0d00 0xff5a00
+       count 4
+       gravity -0.500000
+       notunderwater
+       originjitter 8 8 8
+       sizeincrease -10
+       size 5 10
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 50
 effect damage_fireball
-notunderwater
-type alphastatic
-count 4
-tex 0 8
-size 4 8
-sizeincrease 10
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 6 6 6
-velocityjitter 11 11 50
-// light
-/*effect damage_fireball
-notunderwater
-trailspacing 8
-lightradius 65
-lightradiusfade 280
-lightcolor 1.0 0.8 0.4*/
-
-// rocketlauncher damage effect
-// used in qcsrc/client/damage.qc:                     pointparticles(self.team, org, '0 0 0', 1);
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 4
+       gravity -0.300000
+       notunderwater
+       originjitter 6 6 6
+       sizeincrease 10
+       size 4 8
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect damage_rocketlauncher
-notunderwater
-count 3
-type smoke
-tex 48 55
-size 5 10
-alpha 512 64 1024
-gravity -0.7
-color 0x8f0c00 0xff2a00
-sizeincrease -10
-originjitter 4 4 4
-velocityjitter 22 22 30
-// smoke
+       alpha 512 64 1024
+       color 0x8f0c00 0xff2a00
+       count 3
+       gravity -0.700000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease -10
+       size 5 10
+       tex 48 55
+       type smoke
+       velocityjitter 22 22 30
 effect damage_rocketlauncher
-notunderwater
-type alphastatic
-count 3
-tex 0 8
-size 4 8
-sizeincrease 10
-alpha 128 32 128
-color 0x000000 0x111111
-gravity -0.3
-originjitter 4 4 4
-velocityjitter 11 11 50
-// light
-/*effect damage_rocketlauncher
-notunderwater
-trailspacing 8
-lightradius 60
-lightradiusfade 280
-lightcolor 0.8 0.6 0.2*/
-
-// fireflies
-// used nowhere in code
+       alpha 128 32 128
+       color 0x000000 0x111111
+       count 3
+       gravity -0.300000
+       notunderwater
+       originjitter 4 4 4
+       sizeincrease 10
+       size 4 8
+       tex 0 8
+       type alphastatic
+       velocityjitter 11 11 50
 effect fireflies
-count 1
-bounce -1
-airfriction 5
-time 1 2
-type static
-tex 38 38
-color 0xff9600 0xffefb8
-size 2 3
-sizeincrease -0.3
-alpha 256 256 70
-gravity 0
-originoffset 8 8 8
-originjitter 32 32 32
-velocityoffset 2 2 2
-velocityjitter 64 64 64
-//lightradius 50
-//lightradiusfade 50
-//lightcolor 1 0.9 0.7
-//lightshadow 1
-
-// heal ray muzzleflash
+       airfriction 5
+       alpha 256 256 70
+       bounce -1
+       color 0xff9600 0xffefb8
+       count 1
+       originjitter 32 32 32
+       originoffset 8 8 8
+       sizeincrease -0.300000
+       size 2 3
+       tex 38 38
+       time 1 2
+       type static
+       velocityjitter 64 64 64
+       velocityoffset 2 2 2
 effect healray_muzzleflash
-countabsolute 1
-type smoke
-color 0x283880 0x283880 // 0x202020 0x404040
-tex 65 65
-size 20 20
-alpha 256 256 512
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-sizeincrease -10
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 1.5 3 6
-
+       alpha 256 256 512
+       color 0x283880 0x283880
+       countabsolute 1
+       lightcolor 1.5 3 6
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       sizeincrease -10
+       size 20 20
+       tex 65 65
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect healray_muzzleflash
-count 22
-type spark
-tex 71 73
-color 0xD9FDFF 0x00f0ff
-size 1 15
-sizeincrease 3
-alpha 50 150 1924
-originjitter 1 1 1
-velocityjitter 150 150 150
-velocitymultiplier 0.4
-airfriction 5
-stretchfactor 3.9
-
+       airfriction 5
+       alpha 50 150 1924
+       color 0xD9FDFF 0x00f0ff
+       count 22
+       originjitter 1 1 1
+       sizeincrease 3
+       size 1 15
+       stretchfactor 3.900000
+       tex 71 73
+       type spark
+       velocityjitter 150 150 150
+       velocitymultiplier 0.400000
 effect healray_muzzleflash
-count 4
-type spark
-tex 70 70
-color 0xD9FDFF 0x00f0ff
-size 1 1
-alpha 110 228 4024
-originjitter 1 1 1
-velocityjitter 650 650 650
-velocitymultiplier 1.1
-stretchfactor 0.2
-
-
-
-//healray impact
-
+       alpha 110 228 4024
+       color 0xD9FDFF 0x00f0ff
+       count 4
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.200000
+       tex 70 70
+       type spark
+       velocityjitter 650 650 650
+       velocitymultiplier 1.100000
 effect healray_impact
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-color 0xd800ff 0xd800ff
-originjitter 17 17 17
-lightradius 125
-lightradiusfade 450
-lightcolor 0 4.375 0
-// shockwave
+       alpha 256 256 0
+       color 0xd800ff 0xd800ff
+       countabsolute 1
+       lightcolor 0 4.4 0
+       lightradiusfade 450
+       lightradius 125
+       originjitter 17 17 17
+       size 32 32
+       tex 59 59
+       type decal
 effect healray_impact
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 1400
-color 0x00ff00 0x84c52f
-alpha 40 40 350
-velocitymultiplier 44
-// cloud of bouncing sparks
+       alpha 40 40 350
+       color 0x00ff00 0x84c52f
+       countabsolute 1
+       sizeincrease 1400
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect healray_impact
-count 30
-type spark
-tex 70 70
-color 0x00ff00 0x84c52f
-size 1 2
-alpha 156 300 1024
-gravity 2
-airfriction 6
-originjitter 1 1 1
-velocityjitter 1112 1112 1112
-// inner cloud of smoke
+       airfriction 6
+       alpha 156 300 1024
+       color 0x00ff00 0x84c52f
+       count 30
+       gravity 2
+       originjitter 1 1 1
+       size 1 2
+       tex 70 70
+       type spark
+       velocityjitter 1112 1112 1112
 effect healray_impact
-count 15
-type smoke
-color 0x00ff00 0x84c52f
-tex 40 40
-size 2 3 
-alpha 200 456 512
-airfriction 3
-gravity -2
-velocityjitter 120 120 420
-rotate -180 180 -90 90
-
-
-
-
-// big plasma muzzle flash
-
+       airfriction 3
+       alpha 200 456 512
+       color 0x00ff00 0x84c52f
+       count 15
+       gravity -2
+       rotate -180 180 -90 90
+       size 2 3
+       tex 40 40
+       type smoke
+       velocityjitter 120 120 420
 effect bigplasma_muzzleflash
-countabsolute 1
-type smoke
-color 0x283880 0x283880 // 0x202020 0x404040
-tex 65 65
-size 50 50
-alpha 256 256 812
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-sizeincrease -10
-velocitymultiplier 0.01
-lightradius 200
-lightradiusfade 2000
-lightcolor 1.5 3 6
-
+       alpha 256 256 812
+       color 0x283880 0x283880
+       countabsolute 1
+       lightcolor 1.5 3 6
+       lightradiusfade 2000
+       lightradius 200
+       originjitter 1.5 1.5 1.5
+       sizeincrease -10
+       size 50 50
+       tex 65 65
+       type smoke
+       velocityjitter 6 6 6
+       velocitymultiplier 0.010000
 effect bigplasma_muzzleflash
-countabsolute 1
-type smoke
-color 0x00f0ff 0x00f0ff
-tex 74 74
-size 20 20
-alpha 56 56 1112
-sizeincrease 300
-
+       alpha 56 56 1112
+       color 0x00f0ff 0x00f0ff
+       countabsolute 1
+       sizeincrease 300
+       size 20 20
+       tex 74 74
+       type smoke
 effect bigplasma_muzzleflash
-count 14
-type spark
-tex 51 55
-color 0xD9FDFF 0x00f0ff
-size 5 10
-sizeincrease 135
-alpha 50 150 1924
-originjitter 1 1 1
-velocityjitter 350 350 350
-velocitymultiplier 0.4
-airfriction 5
-stretchfactor 1.9
-
+       airfriction 5
+       alpha 50 150 1924
+       color 0xD9FDFF 0x00f0ff
+       count 14
+       originjitter 1 1 1
+       sizeincrease 135
+       size 5 10
+       stretchfactor 1.900000
+       tex 51 55
+       type spark
+       velocityjitter 350 350 350
+       velocitymultiplier 0.400000
 effect bigplasma_muzzleflash
-count 4
-type spark
-tex 70 70
-color 0xD9FDFF 0x00f0ff
-size 20 20
-alpha 110 228 4024
-originjitter 1 1 1
-velocityjitter 650 650 650
-velocitymultiplier 1.1
-stretchfactor 0.2
-
-
-// big plasma impact
-
+       alpha 110 228 4024
+       color 0xD9FDFF 0x00f0ff
+       count 4
+       originjitter 1 1 1
+       size 20 20
+       stretchfactor 0.200000
+       tex 70 70
+       type spark
+       velocityjitter 650 650 650
+       velocitymultiplier 1.100000
 effect bigplasma_impact
-countabsolute 1
-type decal
-tex 59 59
-size 32 32
-alpha 256 256 0
-originjitter 17 17 17
-lightradius 125
-lightradiusfade 450
-lightcolor 3.125 4.375 10
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 3.1 4.4 10
+       lightradiusfade 450
+       lightradius 125
+       originjitter 17 17 17
+       size 32 32
+       tex 59 59
+       type decal
 effect bigplasma_impact
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 1400
-color 0x80C0FF 0x80C0FF
-alpha 40 40 350
-velocitymultiplier 44
-// cloud of bouncing sparks
+       alpha 40 40 350
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       sizeincrease 1400
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect bigplasma_impact
-count 30
-type spark
-tex 70 70
-color 0x629dff 0x0018ff
-size 1 2
-alpha 156 300 1024
-gravity 2
-airfriction 6
-originjitter 1 1 1
-velocityjitter 1512 1512 1512
-// inner cloud of smoke
+       airfriction 6
+       alpha 156 300 1024
+       color 0x629dff 0x0018ff
+       count 30
+       gravity 2
+       originjitter 1 1 1
+       size 1 2
+       tex 70 70
+       type spark
+       velocityjitter 1512 1512 1512
 effect bigplasma_impact
-count 15
-type smoke
-color 0x629dff 0x0018ff
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 200 456 1512
-airfriction 30
-originjitter 20 20 20
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// smoke
+       airfriction 30
+       alpha 200 456 1512
+       color 0x629dff 0x0018ff
+       count 15
+       originjitter 20 20 20
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect bigplasma_impact
-type smoke
-count 16
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 100 100 200
-velocityoffset 0 0 180
-originjitter 80 80 10
-sizeincrease 30
-airfriction 0.04
-gravity 0.4
-// smoke in the middle
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 16
+       gravity 0.400000
+       originjitter 80 80 10
+       rotate -180 180 2 -2
+       sizeincrease 30
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 100 100 200
+       velocityoffset 0 0 180
 effect bigplasma_impact
-type alphastatic
-count 10
-tex 0 7
-size 60 70
-color 0x222222 0x000000
-alpha 128 328 310
-rotate -180 180 20 -20
-velocityjitter 10 10 10
-originjitter 80 80 80
-sizeincrease -10
-airfriction 0.04
-gravity -0.2
-
-// redflag_touch -- effects for touching the red flag
-// used nowhere in code
+       airfriction 0.040000
+       alpha 128 328 310
+       color 0x222222 0x000000
+       count 10
+       gravity -0.200000
+       originjitter 80 80 80
+       rotate -180 180 20 -20
+       sizeincrease -10
+       size 60 70
+       tex 0 7
+       type alphastatic
+       velocityjitter 10 10 10
 effect redflag_touch
-count 35
-type spark
-tex 40 40
-color 0xFF0000 0x970000
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-// blueflag_touch -- effects for touching the blue flag
-// used nowhere in code
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0xFF0000 0x970000
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect blueflag_touch
-count 35
-type spark
-tex 40 40
-color 0x0000FF 0x000097
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-// red_pass
-// used nowhere in code
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0x0000FF 0x000097
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
+effect yellowflag_touch
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0xFFFF0F 0xFFFF0F
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
+effect pinkflag_touch
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0xFF0FFF 0xFF0FFF
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
+effect neutralflag_touch
+       airfriction 3
+       alpha 0 256 556
+       bounce 1.500000
+       color 0xFFFFFF 0xFFFFFF
+       count 35
+       gravity 1
+       originjitter 1 1 1
+       size 1 3
+       tex 40 40
+       type spark
+       velocityjitter 300 300 300
+       velocitymultiplier 0.500000
 effect red_pass
-trailspacing 64
-color 0xFF0000 0x970000
-size 2 2
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
+       airfriction 5
+       alpha 64 128 64
+       color 0xFF0000 0x970000
+       sizeincrease 2
+       size 2 2
+       tex 32 32
+       trailspacing 64
+       type static
 effect red_pass
-trailspacing 12
-color 0xFF0000 0x970000
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
+       airfriction 9
+       alpha 32 64 32
+       color 0xFF0000 0x970000
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
 effect red_pass
-trailspacing 12
-color 0xFF0000 0x970000
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-
-// blue_pass
-// used nowhere in code
+       alpha 256 256 1280
+       color 0xFF0000 0x970000
+       size 4 4
+       trailspacing 12
+       type static
 effect blue_pass
-trailspacing 64
-color 0x0000FF 0x000097
-size 2 2
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
+       airfriction 5
+       alpha 64 128 64
+       color 0x0000FF 0x000097
+       sizeincrease 2
+       size 2 2
+       tex 32 32
+       trailspacing 64
+       type static
 effect blue_pass
-trailspacing 12
-color 0x0000FF 0x000097
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
+       airfriction 9
+       alpha 32 64 32
+       color 0x0000FF 0x000097
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
 effect blue_pass
-trailspacing 12
-color 0x0000FF 0x000097
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-
-// red_cap -- red team capture effect
+       alpha 256 256 1280
+       color 0x0000FF 0x000097
+       size 4 4
+       trailspacing 12
+       type static
+effect yellow_pass
+       airfriction 5
+       alpha 64 128 64
+       color 0xFFFF0F 0xFFFF0F
+       sizeincrease 2
+       size 2 2
+       tex 32 32
+       trailspacing 64
+       type static
+effect yellow_pass
+       airfriction 9
+       alpha 32 64 32
+       color 0xFFFF0F 0xFFFF0F
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
+effect yellow_pass
+       alpha 256 256 1280
+       color 0xFFFF0F 0xFFFF0F
+       size 4 4
+       trailspacing 12
+       type static
+effect pink_pass
+       airfriction 5
+       alpha 64 128 64
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease 2
+       size 2 2
+       tex 32 32
+       trailspacing 64
+       type static
+effect pink_pass
+       airfriction 9
+       alpha 32 64 32
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
+effect pink_pass
+       alpha 256 256 1280
+       color 0xFFFFFF 0xFFFFFF
+       size 4 4
+       trailspacing 12
+       type static
+effect neutral_pass
+       airfriction 5
+       alpha 64 128 64
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease 2
+       size 2 2
+       tex 32 32
+       trailspacing 64
+       type static
+effect neutral_pass
+       airfriction 9
+       alpha 32 64 32
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease 8
+       size 1 1
+       tex 0 8
+       trailspacing 12
+       type static
+       velocityjitter 64 64 64
+effect neutral_pass
+       alpha 256 256 1280
+       color 0xFFFFFF 0xFFFFFF
+       size 4 4
+       trailspacing 12
+       type static
 effect red_cap
-count 500
-type spark
-tex 64 64
-color 0xFF0000 0x970000
-size 1 1
-alpha 0 256 100
-stretchfactor 2
-//gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1000 1000 1500
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 0.6
+       airfriction 2
+       alpha 0 256 100
+       bounce 1.500000
+       color 0xFF0000 0x970000
+       count 500
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 1000 1000 1500
+       velocitymultiplier 0.500000
 effect red_cap
-countabsolute 1
-type smoke
-tex 65 65
-size 150 150
-alpha 190 190 180
-sizeincrease -80
-color 0xFF0000 0x970000
-
-// blue_cap -- blue team capture effect
+       alpha 190 190 180
+       color 0xFF0000 0x970000
+       countabsolute 1
+       sizeincrease -80
+       size 150 150
+       tex 65 65
+       type smoke
 effect blue_cap
-count 500
-type spark
-tex 64 64
-color 0x0000FF 0x000097
-size 1 1
-alpha 0 256 100
-stretchfactor 2
-//gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1000 1000 1500
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 0.6
+       airfriction 2
+       alpha 0 256 100
+       bounce 1.500000
+       color 0x0000FF 0x000097
+       count 500
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 1000 1000 1500
+       velocitymultiplier 0.500000
 effect blue_cap
-countabsolute 1
-type smoke
-tex 65 65
-size 150 150
-alpha 190 190 180
-sizeincrease -80
-color 0x0000FF 0x000097
-
-// spawn_point_red -- red team idle spawn point effect
+       alpha 190 190 180
+       color 0x0000FF 0x000097
+       countabsolute 1
+       sizeincrease -80
+       size 150 150
+       tex 65 65
+       type smoke
+effect yellow_cap
+       airfriction 2
+       alpha 0 256 100
+       bounce 1.500000
+       color 0xFFFF0F 0xFFFF0F
+       count 500
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 1000 1000 1500
+       velocitymultiplier 0.500000
+effect yellow_cap
+       alpha 190 190 180
+       color 0xFFFF0F 0xFFFF0F
+       countabsolute 1
+       sizeincrease -80
+       size 150 150
+       tex 65 65
+       type smoke
+effect pink_cap
+       airfriction 2
+       alpha 0 256 100
+       bounce 1.500000
+       color 0xFF0FFF 0xFF0FFF
+       count 500
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 1000 1000 1500
+       velocitymultiplier 0.500000
+effect pink_cap
+       alpha 190 190 180
+       color 0xFF0FFF 0xFF0FFF
+       countabsolute 1
+       sizeincrease -80
+       size 150 150
+       tex 65 65
+       type smoke
 effect spawn_point_red
-count 37.5
-type static
-color 0xFF0F0F 0xFF0F0F
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// spawn_point_blue -- blue team idle spawn point effect
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0xFF0F0F 0xFF0F0F
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect spawn_point_blue
-count 37.5
-type static
-color 0x0F0FFF 0x0F0FFF
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// spawn_point_yellow -- yellow team idle spawn point effect
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0x0F0FFF 0x0F0FFF
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect spawn_point_yellow
-count 37.5
-type static
-color 0xFFFF0F 0xFFFF0F
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// spawn_point_pink -- pink team idle spawn point effect
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0xFFFF0F 0xFFFF0F
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect spawn_point_pink
-count 37.5
-type static
-color 0xFF0FFF 0xFF0FFF
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// spawn_point_neutral -- neutral idle spawn point effect
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0xFF0FFF 0xFF0FFF
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect spawn_point_neutral
-count 37.5
-type static
-color 0xFFFFFF 0xFFFFFF
-size 1.0 2.0
-alpha 64 128 128
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 16 16 64
-velocityjitter 32 32 0
-//lightradius 200
-//lighttime 0
-//lightcolor 0.4 0.9 0.9
-
-// spawn_event_red -- red team spawning effect
+       airfriction 0.200000
+       alpha 64 128 128
+       color 0xFFFFFF 0xFFFFFF
+       count 37.500000
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 16 16 64
+       size 1 2
+       type static
+       velocityjitter 32 32 0
 effect spawn_event_red
-count 100
-type spark
-tex 64 64
-color 0xFF0F0F 0xFF0F0F
-size 1 1
-alpha 0 256 256
-stretchfactor 0.6
-//gravity 1
-bounce 1
-originjitter 1 1 1
-velocityjitter 500 500 500
-velocitymultiplier 0.1
-airfriction 2
+       airfriction 2
+       alpha 0 256 256
+       bounce 1
+       color 0xFF0F0F 0xFF0F0F
+       count 100
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 500 500 500
+       velocitymultiplier 0.100000
 effect spawn_event_red
-countabsolute 1
-type smoke
-tex 65 65
-size 100 100
-alpha 190 190 180
-sizeincrease -80
-color 0xFF0F0F 0xFF0F0F
-
-// spawn_event_blue -- blue team spawning effect
+       alpha 190 190 180
+       color 0xFF0F0F 0xFF0F0F
+       countabsolute 1
+       sizeincrease -80
+       size 100 100
+       tex 65 65
+       type smoke
 effect spawn_event_blue
-count 100
-type spark
-tex 64 64
-color 0x0F0FFF 0x0F0FFF
-size 1 1
-alpha 0 256 256
-stretchfactor 0.6
-//gravity 1
-bounce 1
-originjitter 1 1 1
-velocityjitter 500 500 500
-velocitymultiplier 0.1
-airfriction 2
+       airfriction 2
+       alpha 0 256 256
+       bounce 1
+       color 0x0F0FFF 0x0F0FFF
+       count 100
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 500 500 500
+       velocitymultiplier 0.100000
 effect spawn_event_blue
-countabsolute 1
-type smoke
-tex 65 65
-size 100 100
-alpha 190 190 180
-sizeincrease -80
-color 0x0F0FFF 0x0F0FFF
-
-// spawn_event_yellow -- yellow team spawning effect
+       alpha 190 190 180
+       color 0x0F0FFF 0x0F0FFF
+       countabsolute 1
+       sizeincrease -80
+       size 100 100
+       tex 65 65
+       type smoke
 effect spawn_event_yellow
-count 100
-type spark
-tex 64 64
-color 0xFFFF0F 0xFFFF0F
-size 1 1
-alpha 0 256 256
-stretchfactor 0.6
-//gravity 1
-bounce 1
-originjitter 1 1 1
-velocityjitter 500 500 500
-velocitymultiplier 0.1
-airfriction 2
+       airfriction 2
+       alpha 0 256 256
+       bounce 1
+       color 0xFFFF0F 0xFFFF0F
+       count 100
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 500 500 500
+       velocitymultiplier 0.100000
 effect spawn_event_yellow
-countabsolute 1
-type smoke
-tex 65 65
-size 100 100
-alpha 190 190 180
-sizeincrease -80
-color 0xFFFF0F 0xFFFF0F
-
-// spawn_event_pink -- pink team spawning effect
+       alpha 190 190 180
+       color 0xFFFF0F 0xFFFF0F
+       countabsolute 1
+       sizeincrease -80
+       size 100 100
+       tex 65 65
+       type smoke
 effect spawn_event_pink
-count 100
-type spark
-tex 64 64
-color 0xFF0FFF 0xFF0FFF
-size 1 1
-alpha 0 256 256
-stretchfactor 0.6
-//gravity 1
-bounce 1
-originjitter 1 1 1
-velocityjitter 500 500 500
-velocitymultiplier 0.1
-airfriction 2
+       airfriction 2
+       alpha 0 256 256
+       bounce 1
+       color 0xFF0FFF 0xFF0FFF
+       count 100
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 500 500 500
+       velocitymultiplier 0.100000
 effect spawn_event_pink
-countabsolute 1
-type smoke
-tex 65 65
-size 100 100
-alpha 190 190 180
-sizeincrease -80
-color 0xFF0FFF 0xFF0FFF
-
-// spawn_event_neutral -- neutral spawning effect
+       alpha 190 190 180
+       color 0xFF0FFF 0xFF0FFF
+       countabsolute 1
+       sizeincrease -80
+       size 100 100
+       tex 65 65
+       type smoke
 effect spawn_event_neutral
-count 100
-type spark
-tex 64 64
-color 0xFFFFFF 0xFFFFFF
-size 1 1
-alpha 0 256 256
-stretchfactor 0.6
-//gravity 1
-bounce 1
-originjitter 1 1 1
-velocityjitter 500 500 500
-velocitymultiplier 0.1
-airfriction 2
+       airfriction 2
+       alpha 0 256 256
+       bounce 1
+       color 0xFFFFFF 0xFFFFFF
+       count 100
+       originjitter 1 1 1
+       size 1 1
+       stretchfactor 0.600000
+       tex 64 64
+       type spark
+       velocityjitter 500 500 500
+       velocitymultiplier 0.100000
 effect spawn_event_neutral
-countabsolute 1
-type smoke
-tex 65 65
-size 100 100
-alpha 190 190 180
-sizeincrease -80
-color 0xFFFFFF 0xFFFFFF
-
-// nade effects
+       alpha 190 190 180
+       color 0xFFFFFF 0xFFFFFF
+       countabsolute 1
+       sizeincrease -80
+       size 100 100
+       tex 65 65
+       type smoke
 effect nade_blue
-trailspacing 1
-type smoke
-color 0x006cff 0x0600ff
-tex 65 65
-size 3 3
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0x006cff 0x0600ff
+       sizeincrease -1
+       size 3 3
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_blue
-notunderwater
-trailspacing 8
-type smoke
-color 0x0600ff 0x9794ff
-tex 65 65
-size 15 25
-sizeincrease -10
-alpha 30 30 150
-// bubbles
+       alpha 30 30 150
+       color 0x0600ff 0x9794ff
+       notunderwater
+       sizeincrease -10
+       size 15 25
+       tex 65 65
+       trailspacing 8
+       type smoke
 effect nade_blue
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0x006cff 0x0600ff
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x006cff 0x0600ff
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_red
-trailspacing 1
-type smoke
-color 0xff0000 0xff3c00
-tex 65 65
-size 3 3
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xff0000 0xff3c00
+       sizeincrease -1
+       size 3 3
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_red
-notunderwater
-trailspacing 8
-type smoke
-color 0xff0000 0xffa2a2
-tex 65 65
-size 15 25
-sizeincrease -10
-alpha 30 30 150
-// bubbles
+       alpha 30 30 150
+       color 0xff0000 0xffa2a2
+       notunderwater
+       sizeincrease -10
+       size 15 25
+       tex 65 65
+       trailspacing 8
+       type smoke
 effect nade_red
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xff0000 0xff3c00
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xff0000 0xff3c00
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_yellow
-trailspacing 1
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 65 65
-size 3 3
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFFFF0F 0xFFFF0F
+       sizeincrease -1
+       size 3 3
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_yellow
-notunderwater
-trailspacing 8
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 65 65
-size 15 25
-sizeincrease -10
-alpha 30 30 150
-// bubbles
+       alpha 30 30 150
+       color 0xFFFF0F 0xFFFF0F
+       notunderwater
+       sizeincrease -10
+       size 15 25
+       tex 65 65
+       trailspacing 8
+       type smoke
 effect nade_yellow
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFFFF0F 0xFFFF0F
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFFFF0F 0xFFFF0F
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_pink
-trailspacing 1
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 65 65
-size 3 3
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFF0FFF 0xFF0FFF
+       sizeincrease -1
+       size 3 3
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_pink
-notunderwater
-trailspacing 8
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 65 65
-size 15 25
-sizeincrease -10
-alpha 30 30 150
-// bubbles
+       alpha 30 30 150
+       color 0xFF0FFF 0xFF0FFF
+       notunderwater
+       sizeincrease -10
+       size 15 25
+       tex 65 65
+       trailspacing 8
+       type smoke
 effect nade_pink
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFF0FFF 0xFF0FFF
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFF0FFF 0xFF0FFF
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_neutral
-trailspacing 1
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 65 65
-size 3 3
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease -1
+       size 3 3
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_neutral
-notunderwater
-trailspacing 8
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 65 65
-size 15 25
-sizeincrease -10
-alpha 30 30 150
-// bubbles
+       alpha 30 30 150
+       color 0xFFFFFF 0xFFFFFF
+       notunderwater
+       sizeincrease -10
+       size 15 25
+       tex 65 65
+       trailspacing 8
+       type smoke
 effect nade_neutral
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFFFFFF 0xFFFFFF
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
-
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFFFFFF 0xFFFFFF
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_red_burn
-trailspacing 1
-type smoke
-color 0xff0000 0xff3c00
-tex 65 65
-size 5 5
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xff0000 0xff3c00
+       sizeincrease -1
+       size 5 5
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_red_burn
-notunderwater
-trailspacing 64
-type smoke
-color 0xff0000 0xffa2a2
-tex 65 65
-size 45 25
-sizeincrease -30
-alpha 200 200 1000
-// bubbles
+       alpha 200 200 1000
+       color 0xff0000 0xffa2a2
+       notunderwater
+       sizeincrease -30
+       size 45 25
+       tex 65 65
+       trailspacing 64
+       type smoke
 effect nade_red_burn
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xff0000 0xff3c00
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xff0000 0xff3c00
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_red_burn
-trailspacing 16
-type smoke
-color 0xff0000 0xff3c00
-tex 71 73
-size 15 25
-sizeincrease -40
-rotate -180 180 20 -20
-originjitter 2 2 2
-velocityjitter 10 10 10
-alpha 300 900 1500
-
+       alpha 300 900 1500
+       color 0xff0000 0xff3c00
+       originjitter 2 2 2
+       rotate -180 180 20 -20
+       sizeincrease -40
+       size 15 25
+       tex 71 73
+       trailspacing 16
+       type smoke
+       velocityjitter 10 10 10
 effect nade_blue_burn
-trailspacing 1
-type smoke
-color 0x006cff 0x0600ff
-tex 65 65
-size 5 5
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0x006cff 0x0600ff
+       sizeincrease -1
+       size 5 5
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_blue_burn
-notunderwater
-trailspacing 64
-type smoke
-color 0x0600ff 0x9794ff
-tex 65 65
-size 45 25
-sizeincrease -30
-alpha 200 200 1000
-// bubbles
+       alpha 200 200 1000
+       color 0x0600ff 0x9794ff
+       notunderwater
+       sizeincrease -30
+       size 45 25
+       tex 65 65
+       trailspacing 64
+       type smoke
 effect nade_blue_burn
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0x006cff 0x0600ff
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
+       alpha 256 256 256
+       bounce 1.500000
+       color 0x006cff 0x0600ff
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_blue_burn
-trailspacing 16
-type smoke
-color 0x006cff 0x0600ff
-tex 33 33
-size 25 25
-sizeincrease -30
-
+       alpha 300 900 1500
+       color 0x006cff 0x0600ff
+       originjitter 2 2 2
+       rotate -180 180 20 -20
+       sizeincrease -40
+       size 15 25
+       tex 71 73
+       trailspacing 16
+       type smoke
+       velocityjitter 10 10 10
 effect nade_yellow_burn
-trailspacing 1
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 65 65
-size 5 5
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFFFF0F 0xFFFF0F
+       sizeincrease -1
+       size 5 5
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_yellow_burn
-notunderwater
-trailspacing 64
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 65 65
-size 45 25
-sizeincrease -30
-alpha 200 200 1000
-// bubbles
+       alpha 200 200 1000
+       color 0xFFFF0F 0xFFFF0F
+       notunderwater
+       sizeincrease -30
+       size 45 25
+       tex 65 65
+       trailspacing 64
+       type smoke
 effect nade_yellow_burn
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFFFF0F 0xFFFF0F
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFFFF0F 0xFFFF0F
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_yellow_burn
-trailspacing 16
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 33 33
-size 25 25
-sizeincrease -30
-
+       alpha 300 900 1500
+       color 0xFFFF0F 0xFFFF0F
+       originjitter 2 2 2
+       rotate -180 180 20 -20
+       sizeincrease -40
+       size 15 25
+       tex 71 73
+       trailspacing 16
+       type smoke
+       velocityjitter 10 10 10
 effect nade_pink_burn
-trailspacing 1
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 65 65
-size 5 5
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFF0FFF 0xFF0FFF
+       sizeincrease -1
+       size 5 5
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_pink_burn
-notunderwater
-trailspacing 64
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 65 65
-size 45 25
-sizeincrease -30
-alpha 200 200 1000
-// bubbles
+       alpha 200 200 1000
+       color 0xFF0FFF 0xFF0FFF
+       notunderwater
+       sizeincrease -30
+       size 45 25
+       tex 65 65
+       trailspacing 64
+       type smoke
 effect nade_pink_burn
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFF0FFF 0xFF0FFF
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFF0FFF 0xFF0FFF
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_pink_burn
-trailspacing 16
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 33 33
-size 25 25
-sizeincrease -30
-
+       alpha 300 900 1500
+       color 0xFF0FFF 0xFF0FFF
+       originjitter 2 2 2
+       rotate -180 180 20 -20
+       sizeincrease -40
+       size 15 25
+       tex 71 73
+       trailspacing 16
+       type smoke
+       velocityjitter 10 10 10
 effect nade_neutral_burn
-trailspacing 1
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 65 65
-size 5 5
-sizeincrease -1
-alpha 100 100 250
-//gravity -0.11
-// fire
+       alpha 100 100 250
+       color 0xFFFFFF 0xFFFFFF
+       sizeincrease -1
+       size 5 5
+       tex 65 65
+       trailspacing 1
+       type smoke
 effect nade_neutral_burn
-notunderwater
-trailspacing 64
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 65 65
-size 45 25
-sizeincrease -30
-alpha 200 200 1000
-// bubbles
+       alpha 200 200 1000
+       color 0xFFFFFF 0xFFFFFF
+       notunderwater
+       sizeincrease -30
+       size 45 25
+       tex 65 65
+       trailspacing 64
+       type smoke
 effect nade_neutral_burn
-underwater
-trailspacing 16
-type bubble
-tex 62 62
-color 0xFFFFFF 0xFFFFFF
-size 1 1
-alpha 256 256 256
-gravity -0.125
-bounce 1.5
-liquidfriction 4
-velocityjitter 16 16 16
+       alpha 256 256 256
+       bounce 1.500000
+       color 0xFFFFFF 0xFFFFFF
+       gravity -0.125000
+       liquidfriction 4
+       size 1 1
+       tex 62 62
+       trailspacing 16
+       type bubble
+       underwater
+       velocityjitter 16 16 16
 effect nade_neutral_burn
-trailspacing 16
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 33 33
-size 25 25
-sizeincrease -30
-
+       alpha 300 900 1500
+       color 0xFFFFFF 0xFFFFFF
+       originjitter 2 2 2
+       rotate -180 180 20 -20
+       sizeincrease -40
+       size 15 25
+       tex 71 73
+       trailspacing 16
+       type smoke
+       velocityjitter 10 10 10
 effect nade_blue_explode
-countabsolute 1
-type decal
-tex 8 16
-size 88 88
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 300
-lightradiusfade 1500
-lightcolor 20 20 100
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 20 20 100
+       lightradiusfade 1500
+       lightradius 300
+       originjitter 26 26 26
+       size 88 88
+       tex 8 16
+       type decal
 effect nade_blue_explode
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 1800
-color 0x80C0FF 0x80C0FF
-alpha 80 80 650
-velocitymultiplier 44
-// fire
+       alpha 80 80 650
+       color 0x80C0FF 0x80C0FF
+       countabsolute 1
+       sizeincrease 1800
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect nade_blue_explode
-notunderwater
-count 16
-type smoke
-color 0x629dff 0x0018ff
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 400 656 2000
-airfriction 30
-originjitter 50 50 50
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// fire stretched
+       airfriction 30
+       alpha 400 656 2000
+       color 0x629dff 0x0018ff
+       count 16
+       notunderwater
+       originjitter 50 50 50
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect nade_blue_explode
-count 8
-type spark
-tex 48 55
-color 0x629dff 0x0018ff
-size 60 90
-alpha 1500 3000 13000
-stretchfactor 80
-sizeincrease 40
-velocityjitter 30 30 30
-airfriction -9
-//smoke
+       airfriction -9
+       alpha 1500 3000 13000
+       color 0x629dff 0x0018ff
+       count 8
+       sizeincrease 40
+       size 60 90
+       stretchfactor 80
+       tex 48 55
+       type spark
+       velocityjitter 30 30 30
 effect nade_blue_explode
-type smoke
-count 32
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 200 200 200
-velocityoffset 0 0 180
-originjitter 50 50 10
-sizeincrease 50
-airfriction 0.04
-gravity 0.4
-// underwater bubbles
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 32
+       gravity 0.400000
+       originjitter 50 50 10
+       rotate -180 180 2 -2
+       sizeincrease 50
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 200 200 200
+       velocityoffset 0 0 180
 effect nade_blue_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect nade_blue_explode
-notunderwater
-count 8
-type spark
-tex 40 40
-color 0x006cff 0x0600ff
-size 1 2
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// notbouncing sparks
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0x006cff 0x0600ff
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_blue_explode
-count 16
-type spark
-tex 40 40
-color 0x006cff 0x0600ff
-size 1 2
-alpha 644 956 684
-gravity 0.5
-airfriction 0.7
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 0.700000
+       alpha 644 956 684
+       color 0x006cff 0x0600ff
+       count 16
+       gravity 0.500000
+       liquidfriction 0.800000
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_blue_explode
-notunderwater
-count 12
-type alphastatic
-tex 66 68
-color 0x6a3d25 0xcac5b4
-size 2 6
-alpha 644 956 684
-gravity 1.3
-airfriction 0.5
-bounce 1.6
-velocityjitter 324 324 524
-rotate -180 180 -1000 1000
-
+       alpha 644 956 2500
+       color 0x006cff 0x0600ff
+       count 8
+       notunderwater
+       originjitter 64 64 64
+       rotate -180 180 -100 100
+       size 20 40
+       tex 71 73
+       type smoke
+       velocityjitter 324 324 324
 effect nade_red_explode
-countabsolute 1
-type decal
-tex 8 16
-size 88 88
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 300
-lightradiusfade 1500
-lightcolor 100 20 20
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 100 20 20
+       lightradiusfade 1500
+       lightradius 300
+       originjitter 26 26 26
+       size 88 88
+       tex 8 16
+       type decal
 effect nade_red_explode
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 2200
-color 0xff0000 0xffa2a2
-alpha 80 80 650
-velocitymultiplier 44
-// fire
+       alpha 80 80 650
+       color 0xff0000 0xffa2a2
+       countabsolute 1
+       sizeincrease 1800
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect nade_red_explode
-notunderwater
-count 16
-type smoke
-color 0xff0000 0xff4200
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 400 656 2000
-airfriction 30
-originjitter 50 50 50
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// fire stretched
+       airfriction 30
+       alpha 400 656 2000
+       color 0xff0000 0xff4200
+       count 16
+       notunderwater
+       originjitter 50 50 50
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect nade_red_explode
-count 8
-type spark
-tex 48 55
-color 0xff0000 0xff4200
-size 60 90
-alpha 1500 3000 13000
-stretchfactor 80
-sizeincrease 40
-velocityjitter 30 30 30
-airfriction -9
-//smoke
+       airfriction -9
+       alpha 1500 3000 13000
+       color 0xff0000 0xff4200
+       count 8
+       sizeincrease 40
+       size 60 90
+       stretchfactor 80
+       tex 48 55
+       type spark
+       velocityjitter 30 30 30
 effect nade_red_explode
-type smoke
-count 32
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 200 200 200
-velocityoffset 0 0 180
-originjitter 50 50 10
-sizeincrease 50
-airfriction 0.04
-gravity 0.4
-// underwater bubbles
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 32
+       gravity 0.400000
+       originjitter 50 50 10
+       rotate -180 180 2 -2
+       sizeincrease 50
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 200 200 200
+       velocityoffset 0 0 180
 effect nade_red_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect nade_red_explode
-notunderwater
-count 8
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// notbouncing sparks
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xff0000 0xffa2a2
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_red_explode
-count 16
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 684
-gravity 0.5
-airfriction 0.7
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 0.700000
+       alpha 644 956 684
+       color 0xff0000 0xffa2a2
+       count 16
+       gravity 0.500000
+       liquidfriction 0.800000
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_red_explode
-notunderwater
-count 8
-type smoke
-tex 71 73
-color 0xff0000 0xffa2a2
-size 20 40
-alpha 644 956 2500
-originjitter 64 64 64
-velocityjitter 324 324 324
-rotate -180 180 -100 100
-
+       alpha 644 956 2500
+       color 0xff0000 0xffa2a2
+       count 8
+       notunderwater
+       originjitter 64 64 64
+       rotate -180 180 -100 100
+       size 20 40
+       tex 71 73
+       type smoke
+       velocityjitter 324 324 324
 effect nade_yellow_explode
-countabsolute 1
-type decal
-tex 8 16
-size 88 88
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 300
-lightradiusfade 1500
-lightcolor 100 20 20
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 100 20 20
+       lightradiusfade 1500
+       lightradius 300
+       originjitter 26 26 26
+       size 88 88
+       tex 8 16
+       type decal
 effect nade_yellow_explode
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 2200
-color 0xff0000 0xffa2a2
-alpha 80 80 650
-velocitymultiplier 44
-// fire
+       alpha 80 80 650
+       color 0xff0000 0xffa2a2
+       countabsolute 1
+       sizeincrease 1800
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect nade_yellow_explode
-notunderwater
-count 16
-type smoke
-color 0xFFFF0F 0xFFFF0F
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 400 656 2000
-airfriction 30
-originjitter 50 50 50
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// fire stretched
+       airfriction 30
+       alpha 400 656 2000
+       color 0xFFFF0F 0xFFFF0F
+       count 16
+       notunderwater
+       originjitter 50 50 50
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect nade_yellow_explode
-count 8
-type spark
-tex 48 55
-color 0xFFFF0F 0xFFFF0F
-size 60 90
-alpha 1500 3000 13000
-stretchfactor 80
-sizeincrease 40
-velocityjitter 30 30 30
-airfriction -9
-//smoke
+       airfriction -9
+       alpha 1500 3000 13000
+       color 0xFFFF0F 0xFFFF0F
+       count 8
+       sizeincrease 40
+       size 60 90
+       stretchfactor 80
+       tex 48 55
+       type spark
+       velocityjitter 30 30 30
 effect nade_yellow_explode
-type smoke
-count 32
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 200 200 200
-velocityoffset 0 0 180
-originjitter 50 50 10
-sizeincrease 50
-airfriction 0.04
-gravity 0.4
-// underwater bubbles
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 32
+       gravity 0.400000
+       originjitter 50 50 10
+       rotate -180 180 2 -2
+       sizeincrease 50
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 200 200 200
+       velocityoffset 0 0 180
 effect nade_yellow_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect nade_yellow_explode
-notunderwater
-count 8
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// notbouncing sparks
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xff0000 0xffa2a2
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_yellow_explode
-count 16
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 684
-gravity 0.5
-airfriction 0.7
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 0.700000
+       alpha 644 956 684
+       color 0xff0000 0xffa2a2
+       count 16
+       gravity 0.500000
+       liquidfriction 0.800000
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_yellow_explode
-notunderwater
-count 8
-type smoke
-tex 71 73
-color 0xff0000 0xffa2a2
-size 20 40
-alpha 644 956 2500
-originjitter 64 64 64
-velocityjitter 324 324 324
-rotate -180 180 -100 100
-
+       alpha 644 956 2500
+       color 0xff0000 0xffa2a2
+       count 8
+       notunderwater
+       originjitter 64 64 64
+       rotate -180 180 -100 100
+       size 20 40
+       tex 71 73
+       type smoke
+       velocityjitter 324 324 324
 effect nade_pink_explode
-countabsolute 1
-type decal
-tex 8 16
-size 88 88
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 300
-lightradiusfade 1500
-lightcolor 100 20 20
-// shockwave
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 100 20 20
+       lightradiusfade 1500
+       lightradius 300
+       originjitter 26 26 26
+       size 88 88
+       tex 8 16
+       type decal
 effect nade_pink_explode
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 2200
-color 0xff0000 0xffa2a2
-alpha 80 80 650
-velocitymultiplier 44
-// fire
+       alpha 80 80 650
+       color 0xff0000 0xffa2a2
+       countabsolute 1
+       sizeincrease 1800
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect nade_pink_explode
-notunderwater
-count 16
-type smoke
-color 0xFF0FFF 0xFF0FFF
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 400 656 2000
-airfriction 30
-originjitter 50 50 50
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// fire stretched
+       airfriction 30
+       alpha 400 656 2000
+       color 0xFF0FFF 0xFF0FFF
+       count 16
+       notunderwater
+       originjitter 50 50 50
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect nade_pink_explode
-count 8
-type spark
-tex 48 55
-color 0xFF0FFF 0xFF0FFF
-size 60 90
-alpha 1500 3000 13000
-stretchfactor 80
-sizeincrease 40
-velocityjitter 30 30 30
-airfriction -9
-//smoke
+       airfriction -9
+       alpha 1500 3000 13000
+       color 0xFF0FFF 0xFF0FFF
+       count 8
+       sizeincrease 40
+       size 60 90
+       stretchfactor 80
+       tex 48 55
+       type spark
+       velocityjitter 30 30 30
 effect nade_pink_explode
-type smoke
-count 32
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 200 200 200
-velocityoffset 0 0 180
-originjitter 50 50 10
-sizeincrease 50
-airfriction 0.04
-gravity 0.4
-// underwater bubbles
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 32
+       gravity 0.400000
+       originjitter 50 50 10
+       rotate -180 180 2 -2
+       sizeincrease 50
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 200 200 200
+       velocityoffset 0 0 180
 effect nade_pink_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// bouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect nade_pink_explode
-notunderwater
-count 8
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// notbouncing sparks
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xff0000 0xffa2a2
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_pink_explode
-count 16
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 684
-gravity 0.5
-airfriction 0.7
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 0.700000
+       alpha 644 956 684
+       color 0xff0000 0xffa2a2
+       count 16
+       gravity 0.500000
+       liquidfriction 0.800000
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_pink_explode
-notunderwater
-count 8
-type smoke
-tex 71 73
-color 0xff0000 0xffa2a2
-size 20 40
-alpha 644 956 2500
-originjitter 64 64 64
-velocityjitter 324 324 324
-rotate -180 180 -100 100
-
-effect nade_neutral_explode
-countabsolute 1
-type decal
-tex 8 16
-size 88 88
-alpha 256 256 0
-originjitter 26 26 26
-lightradius 300
-lightradiusfade 1500
-lightcolor 100 20 20
-// shockwave
+       alpha 644 956 2500
+       color 0xff0000 0xffa2a2
+       count 8
+       notunderwater
+       originjitter 64 64 64
+       rotate -180 180 -100 100
+       size 20 40
+       tex 71 73
+       type smoke
+       velocityjitter 324 324 324
 effect nade_neutral_explode
-type smoke
-countabsolute 1
-tex 33 33
-size 32 32
-sizeincrease 2200
-color 0xff0000 0xffa2a2
-alpha 80 80 650
-velocitymultiplier 44
-// fire
+       alpha 256 256 0
+       countabsolute 1
+       lightcolor 100 20 20
+       lightradiusfade 1500
+       lightradius 300
+       originjitter 26 26 26
+       size 88 88
+       tex 8 16
+       type decal
 effect nade_neutral_explode
-notunderwater
-count 16
-type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 48 55
-size 20 24
-sizeincrease 555
-alpha 400 656 2000
-airfriction 30
-originjitter 50 50 50
-velocityjitter 320 320 320
-rotate -180 180 -9 9
-// fire stretched
+       alpha 80 80 650
+       color 0xff0000 0xffa2a2
+       countabsolute 1
+       sizeincrease 1800
+       size 32 32
+       tex 33 33
+       type smoke
+       velocitymultiplier 44
 effect nade_neutral_explode
-count 8
-type spark
-tex 48 55
-color 0xFFFFFF 0xFFFFFF
-size 60 90
-alpha 1500 3000 13000
-stretchfactor 80
-sizeincrease 40
-velocityjitter 30 30 30
-airfriction -9
-//smoke
+       airfriction 30
+       alpha 400 656 2000
+       color 0xFFFFFF 0xFFFFFF
+       count 16
+       notunderwater
+       originjitter 50 50 50
+       rotate -180 180 -9 9
+       sizeincrease 555
+       size 20 24
+       tex 48 55
+       type smoke
+       velocityjitter 320 320 320
 effect nade_neutral_explode
-type smoke
-count 32
-blend alpha
-tex 0 7
-size 60 30
-color 0x222222 0x000000
-alpha 128 328 390
-rotate -180 180 2 -2
-velocityjitter 200 200 200
-velocityoffset 0 0 180
-originjitter 50 50 10
-sizeincrease 50
-airfriction 0.04
-gravity 0.4
-// underwater bubbles
+       airfriction -9
+       alpha 1500 3000 13000
+       color 0xFFFFFF 0xFFFFFF
+       count 8
+       sizeincrease 40
+       size 60 90
+       stretchfactor 80
+       tex 48 55
+       type spark
+       velocityjitter 30 30 30
 effect nade_neutral_explode
-underwater
-count 32
-type bubble
-tex 62 62
-color 0x404040 0x808080
-size 3 6
-alpha 128 256 64
-gravity -0.125
-bounce 1.5
-liquidfriction 0.25
-originjitter 16 16 16
-velocityjitter 196 196 196
-rotate 0 0 0 0
-// bouncing sparks
+       airfriction 0.040000
+       alpha 128 328 390
+       blend alpha
+       color 0x222222 0x000000
+       count 32
+       gravity 0.400000
+       originjitter 50 50 10
+       rotate -180 180 2 -2
+       sizeincrease 50
+       size 60 30
+       tex 0 7
+       type smoke
+       velocityjitter 200 200 200
+       velocityoffset 0 0 180
 effect nade_neutral_explode
-notunderwater
-count 8
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 484
-gravity 1
-airfriction 1
-bounce 1.6
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// notbouncing sparks
+       alpha 128 256 64
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 32
+       gravity -0.125000
+       liquidfriction 0.250000
+       originjitter 16 16 16
+       size 3 6
+       tex 62 62
+       type bubble
+       underwater
+       velocityjitter 196 196 196
 effect nade_neutral_explode
-count 16
-type spark
-tex 40 40
-color 0xff0000 0xffa2a2
-size 1 2
-alpha 644 956 684
-gravity 0.5
-airfriction 0.7
-liquidfriction 0.8
-velocityoffset 0 0 80
-originjitter 16 16 16
-velocityjitter 424 424 624
-// debris
+       airfriction 1
+       alpha 644 956 484
+       bounce 1.600000
+       color 0xff0000 0xffa2a2
+       count 8
+       gravity 1
+       liquidfriction 0.800000
+       notunderwater
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
+       type spark
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
 effect nade_neutral_explode
-notunderwater
-count 8
-type smoke
-tex 71 73
-color 0xff0000 0xffa2a2
-size 20 40
-alpha 644 956 2500
-originjitter 64 64 64
-velocityjitter 324 324 324
-rotate -180 180 -100 100
-
-// shockwave_attack
-// used nowhere in code
-effect shockwave_attack // glow and light
-       //countabsolute 1
-       //type smoke
-       //color 0xcc0000 0xff0000
-       //tex 65 65
-       //size 10 15
-       //alpha 256 512 6280
-       //airfriction 10
-       //sizeincrease 1.5
-       //stretchfactor 2
-       //lightradius 200
-       //lightradiusfade 2000
-       //lightcolor 3 0.1 0.1
-effect shockwave_attack // electricity
-       count 1
+       airfriction 0.700000
+       alpha 644 956 684
+       color 0xff0000 0xffa2a2
+       count 16
+       gravity 0.500000
+       liquidfriction 0.800000
+       originjitter 16 16 16
+       size 1 2
+       tex 40 40
        type spark
-       color 0xb44215 0xff0000
-       tex 43 43
-       size 5 7
-       bounce 0
-       alpha 4096 4096 20000
+       velocityjitter 424 424 624
+       velocityoffset 0 0 80
+effect nade_neutral_explode
+       alpha 644 956 2500
+       color 0xff0000 0xffa2a2
+       count 8
+       notunderwater
+       originjitter 64 64 64
+       rotate -180 180 -100 100
+       size 20 40
+       tex 71 73
+       type smoke
+       velocityjitter 324 324 324
+effect shockwave_attack
        airfriction 1
+       alpha 4096 4096 20000
+       color 0xb44215 0xff0000
+       count 1
        originjitter 2 2 2
-       velocityjitter 10 10 10
-       velocitymultiplier 10
-       sizeincrease 1.5
-       stretchfactor 2.3
        rotate -180 180 4000 -4000
-effect shockwave_attack // fire
-       count 1
+       sizeincrease 1.500000
+       size 5 7
+       stretchfactor 2.300000
+       tex 43 43
        type spark
-       color 0xff4200 0xff0000
-       tex 8 15
-       size 7 9
-       bounce 0
-       alpha 4096 4096 20000
+       velocityjitter 10 10 10
+       velocitymultiplier 10
+effect shockwave_attack
        airfriction 1
+       alpha 4096 4096 20000
+       color 0xff4200 0xff0000
+       count 1
        originjitter 2 2 2
+       sizeincrease 1.500000
+       size 7 9
+       stretchfactor 2
+       tex 8 15
+       type spark
        velocityjitter 10 10 10
        velocitymultiplier 10
-       sizeincrease 1.5
-       stretchfactor 2
-
-// ARC
-// used in qcsrc/server/w_arc.qc
-effect arc_lightning // impact decal
-       countabsolute 1
-       type decal
-       tex 16 32 // fps killer, spamming decals like that
-       size 16 16
+effect arc_lightning
        alpha 32 32 0
-       originjitter 2 2 2
-       lightradius 50
+       countabsolute 1
+       lightcolor 3.1 4.4 10
        lightradiusfade 200
-       lightcolor 3.125 4.375 10
-
-effect arc_lightning // impact sparks
-       type static
+       lightradius 50
+       originjitter 2 2 2
+       size 16 16
+       tex 16 32
+       type decal
+effect arc_lightning
+       airfriction 110
+       alpha 256 256 512
+       color 0xDDFDFF 0xFDFDFF
        count 100
-       tex 71 74
+       originjitter 20 20 20
        rotate 0 360 -36000 36000
-       stretchfactor 1
-       size 0 5
        sizeincrease -5
-       color 0xDDFDFF 0xFDFDFF
-       alpha 256 256 512
-       originjitter 20 20 20
+       size 0 5
+       stretchfactor 1
+       tex 71 74
+       type static
        velocityjitter 250 250 250
        velocitymultiplier 100
-       airfriction 110
-
-effect arc_lightning // impact sparks (underwater)
-       type static
-       underwater
+effect arc_lightning
+       airfriction 5
+       alpha 256 256 512
+       color 0xDDFDFF 0xFDFDFF
        count 100
-       tex 71 74
+       liquidfriction 5
+       orientation spark
+       originjitter 20 20 20
        rotate 0 360 -36000 36000
-       stretchfactor 1
-       size 0 5
        sizeincrease -5
-       color 0xDDFDFF 0xFDFDFF
-       alpha 256 256 512
-       originjitter 20 20 20
+       size 0 5
+       stretchfactor 1
+       tex 71 74
+       type static
+       underwater
        velocityjitter 250 250 250
-       // underwater
-       orientation spark
        velocitymultiplier 20
-       airfriction 5
-       liquidfriction 5
-
-effect arc_beam // sparks on beam
-       type spark
-       stretchfactor 1
-       rotate 0 360 360 1000
-       time 0.05 0.05
-       color 0xfafad2 0xffffff
-       alpha 256 256 16384
+effect arc_beam
        airfriction -10
-       originoffset 0 0 0
-       relativeoriginoffset 10 0 0
+       alpha 256 256 16384
+       color 0xfafad2 0xffffff
        originjitter 3 3 3
-       velocityoffset 0 0 0
-       velocityjitter 100 100 100
-       velocitymultiplier 200
-       //lightcolor 0 0 0
-       trailspacing 10
+       relativeoriginoffset 10 0 0
+       rotate 0 360 360 1000
+       stretchfactor 1
        tex 71 74
-
-effect arc_beam // sparks on beam (underwater)
+       time 0.050000 0.050000
+       trailspacing 10
        type spark
-       underwater
-       stretchfactor 1
-       rotate 0 360 360 1000
-       time 0.001 0.001
-       color 0xfafad2 0xffffff
+       velocityjitter 100 100 100
+       velocitymultiplier 200
+effect arc_beam
        alpha 256 256 16384
+       color 0xfafad2 0xffffff
        liquidfriction -10
-       originoffset 0 0 0
-       relativeoriginoffset 10 0 0
        originjitter 30 30 30
-       velocityoffset 0 0 0
+       relativeoriginoffset 10 0 0
+       rotate 0 360 360 1000
+       stretchfactor 1
+       tex 71 74
+       time 0.001000 0.001000
+       trailspacing 10
+       type spark
+       underwater
        velocityjitter 100 100 100
        velocitymultiplier 200
-       //lightcolor 0 0 0
-       trailspacing 10
-       tex 71 74
-
-// ARC healing effect
-effect arc_beam_heal // bubble this...
-       type static
-       trailspacing 1500
-       tex 74 74
-       color 0x20FF20 0x40FF40
-       size 0.1 0.1
-       sizeincrease 20
-       alpha 2048 2048 256
-       //time 0.8 0.8
+effect arc_beam_heal
        airfriction -20
-       type smoke
+       alpha 2048 2048 256
+       color 0x20FF20 0x40FF40
        relativeoriginoffset 5 0 0
        relativevelocityoffset 100 0 0
+       sizeincrease 20
+       size 0.100000 0.100000
+       tex 74 74
+       trailspacing 1500
+       type smoke
        velocityjitter 3 3 3
        velocitymultiplier 200
-
-effect arc_beam_healimpact // healing "aura"
-       type smoke
-       countabsolute 1
-       tex 33 33
-       size 32 32
-       sizeincrease -1000
-       color 0x00ff00 0x84c52f
+effect arc_beam_healimpact
        alpha 40 40 350
-       velocitymultiplier 44
-       lightradius 20
+       color 0x00ff00 0x84c52f
+       countabsolute 1
+       lightcolor 0 4.4 0
        lightradiusfade 150
-       lightcolor 0 4.375 0
-
-effect arc_beam_healimpact // rising "smoke"
+       lightradius 20
+       sizeincrease -1000
+       size 32 32
+       tex 33 33
        type smoke
-       count 15
-       color 0x00ff00 0x84c52f
-       tex 40 40
-       size 0.5 1
-       alpha 200 456 512
+       velocitymultiplier 44
+effect arc_beam_healimpact
        airfriction 3
+       alpha 200 456 512
+       color 0x00ff00 0x84c52f
+       count 15
        gravity -2
-       velocityjitter 120 120 420
        rotate -180 180 -90 90
-
-effect arc_smoke // arc heat smoke  (notunderwater)
-       notunderwater
-       count 2
+       size 0.500000 1
+       tex 40 40
        type smoke
-       tex 0 8
+       velocityjitter 120 120 420
+effect arc_smoke
+       airfriction 1
+       alpha 32 64 48
        color 0x4c453f 0x2a241f
-       size 5 10
+       count 2
+       gravity -0.125000
+       notunderwater
+       rotate 0 360 -180 180
        sizeincrease 10
-       alpha 32 64 48
-       gravity -0.125
-       originjitter 0 0 0
+       size 5 10
+       tex 0 8
+       type smoke
        velocityjitter 0 0 16
-       airfriction 1
-       rotate 0 360 -180 180
-
-effect arc_smoke // arc heat bubbles  (underwater)
-       underwater
-       count 2
-       type bubble
-       tex 62 62
-       color 0x404040 0x808080
-       size 0.1 1
+effect arc_smoke
        alpha 170 256 64
-       gravity -0.125
-       bounce 1.5
-       liquidfriction 0.25
+       bounce 1.500000
+       color 0x404040 0x808080
+       count 2
+       gravity -0.125000
+       liquidfriction 0.250000
        originjitter 6 6 6
+       size 0.100000 1
+       tex 62 62
+       type bubble
+       underwater
        velocityjitter 16 16 16
-
-effect arc_overheat // arc overheat electric bolts
-       tex 43 43
-       count 24
-       type spark
-       color 0xffffff 0x9271fb
-       size 6 12
-       sizeincrease -24
-       alpha 128 128 292
-       gravity -0.4
+effect arc_overheat
        airfriction 5
+       alpha 128 128 292
+       color 0xffffff 0x9271fb
+       count 24
+       gravity -0.400000
        liquidfriction 10
-       velocityjitter 256 256 256
        originjitter 10 10 10
-       
-effect arc_overheat_fire // arc overheat bouncing sparks
-       count 1
+       sizeincrease -24
+       size 6 12
+       tex 43 43
        type spark
-       color 0x4444ff 0xeeeeff
-       size 0.4 1
+       velocityjitter 256 256 256
+effect arc_overheat_fire
        alpha 0 256 640
+       bounce 1.500000
+       color 0x4444ff 0xeeeeff
+       count 1
        gravity 1
-       bounce 1.5
-       velocityoffset 0 0 80
-       velocityjitter 92 92 92
-       originjitter 6 6 6
        liquidfriction 5
+       originjitter 6 6 6
+       size 0.400000 1
+       type spark
+       velocityjitter 92 92 92
        velocitymultiplier 80
-
-// yellowflag_touch -- effects for touching the yellow flag
-// used nowhere in code
-effect yellowflag_touch
-count 35
-type spark
-tex 40 40
-color 0xFFFF0F 0xFFFF0F
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-// pinkflag_touch -- effects for touching the pink flag
-// used nowhere in code
-effect pinkflag_touch
-count 35
-type spark
-tex 40 40
-color 0xFF0FFF 0xFF0FFF
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-// neutralflag_touch -- effects for touching the neutral flag
-// used nowhere in code
-effect neutralflag_touch
-count 35
-type spark
-tex 40 40
-color 0xFFFFFF 0xFFFFFF
-size 1 3
-alpha 0 256 556
-gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 3
-
-// yellow_pass
-// used nowhere in code
-effect yellow_pass
-trailspacing 64
-color 0xFFFF0F 0xFFFF0F
-size 2 2
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
-effect yellow_pass
-trailspacing 12
-color 0xFFFF0F 0xFFFF0F
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
-effect yellow_pass
-trailspacing 12
-color 0xFFFF0F 0xFFFF0F
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-
-// pink_pass
-// used nowhere in code
-effect pink_pass
-trailspacing 64
-color 0xFFFFFF 0xFFFFFF
-size 2 2
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
-effect pink_pass
-trailspacing 12
-color 0xFFFFFF 0xFFFFFF
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
-effect pink_pass
-trailspacing 12
-color 0xFFFFFF 0xFFFFFF
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-
-// neutral_pass
-// used nowhere in code
-effect neutral_pass
-trailspacing 64
-color 0xFFFFFF 0xFFFFFF
-size 2 2
-tex 32 32
-alpha 64 128 64
-airfriction 5
-sizeincrease 2
-type static
-effect neutral_pass
-trailspacing 12
-color 0xFFFFFF 0xFFFFFF
-size 1 1
-tex 0 8
-alpha 32 64 32
-airfriction 9
-sizeincrease 8
-velocityjitter 64 64 64
-type static
-effect neutral_pass
-trailspacing 12
-color 0xFFFFFF 0xFFFFFF
-size 4 4
-//tex 48 55
-alpha 256 256 1280
-type static
-
-// yellow_cap -- yellow team capture effect
-effect yellow_cap
-count 500
-type spark
-tex 64 64
-color 0xFFFF0F 0xFFFF0F
-size 1 1
-alpha 0 256 100
-stretchfactor 2
-//gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1000 1000 1500
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 0.6
-effect yellow_cap
-countabsolute 1
-type smoke
-tex 65 65
-size 150 150
-alpha 190 190 180
-sizeincrease -80
-color 0xFFFF0F 0xFFFF0F
-
-// pink_cap -- pink team capture effect
-effect pink_cap
-count 500
-type spark
-tex 64 64
-color 0xFF0FFF 0xFF0FFF
-size 1 1
-alpha 0 256 100
-stretchfactor 2
-//gravity 1
-bounce 1.5
-originjitter 1 1 1
-velocityjitter 1000 1000 1500
-velocitymultiplier 0.5
-airfriction 2
-stretchfactor 0.6
-effect pink_cap
-countabsolute 1
-type smoke
-tex 65 65
-size 150 150
-alpha 190 190 180
-sizeincrease -80
-color 0xFF0FFF 0xFF0FFF
-
-// relic_resistance effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       velocityoffset 0 0 80
 effect relic_resistance
-count 20
-type static
-color 0x00ff80 0x00ff80
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_regeneration effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x00ff80 0x00ff80
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_regeneration
-count 1
-type static
-color 0x00ffff 0x00ffff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_vempire effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x00ffff 0x00ffff
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_vampire
-count 20
-type static
-color 0xff00ff 0xff00ff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_ammo effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xff00ff 0xff00ff
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_ammo
-count 1
-type static
-color 0x80ff00 0x80ff00
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_damage effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x80ff00 0x80ff00
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_damage
-count 20
-type static
-color 0xff0000 0xff0000
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_splashdamage effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xff0000 0xff0000
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_ssplashdamage
-count 20
-type static
-color 0xff8000 0xff8000
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_firingspeed effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xff8000 0xff8000
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_firingspeed
-count 20
-type static
-color 0xffff00 0xffff00
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_disability effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xffff00 0xffff00
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_disability
-count 20
-type static
-color 0x0000ff 0x0000ff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_disability_curse effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x0000ff 0x0000ff
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_disability_curse
-count 1
-type static
-color 0x000080 0x000080
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_teamboost effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x000080 0x000080
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_teamboost
-count 20
-type static
-color 0xffffff 0xffffff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_teamboost_boost effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xffffff 0xffffff
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_teamboost_boost
-count 1
-type static
-color 0x808080 0x808080
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_speed effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x808080 0x808080
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_speed
-count 1
-type static
-color 0x80ffff 0x80ffff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_jump effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x80ffff 0x80ffff
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_jump
-count 20
-type static
-color 0xffff80 0xffff80
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_flight effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xffff80 0xffff80
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_flight
-count 1
-type static
-color 0x8080ff 0x8080ff
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_radioactive effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x8080ff 0x8080ff
+       count 1
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_radioactive
-count 20
-type static
-color 0x00ff00 0x00ff00
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_resurrection effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0x00ff00 0x00ff00
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_resurrection
-count 20
-type static
-color 0xff0080 0xff0080
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// relic_vengeance effect, used by the relics mutator
-// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xff0080 0xff0080
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect relic_vengeance
-count 20
-type static
-color 0xff8080 0xff8080
-size 1.5 1.5
-alpha 128 256 256
-gravity -0.1
-airfriction 0.2
-liquidfriction 0.8
-originjitter 8 8 32
-velocityjitter 64 64 32
-
-// rocketminsta laser trail - red
+       airfriction 0.200000
+       alpha 128 256 256
+       color 0xff8080 0xff8080
+       count 20
+       gravity -0.100000
+       liquidfriction 0.800000
+       originjitter 8 8 32
+       size 1.500000 1.500000
+       type static
+       velocityjitter 64 64 32
 effect rocketminsta_laser_red
-trailspacing 2
-type static
-color 0xFF0F0F 0xFF0F0F
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0xFF0F0F 0xFF0F0F
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect rocketminsta_laser_red
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0xFF0F0F 0xFF0F0F
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// rocketminsta laser trail - blue
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0xFF0F0F 0xFF0F0F
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect rocketminsta_laser_blue
-trailspacing 2
-type static
-color 0x0F0FFF 0x0F0FFF
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0x0F0FFF 0x0F0FFF
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect rocketminsta_laser_blue
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0x0F0FFF 0x0F0FFF
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// rocketminsta laser trail - yellow
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0x0F0FFF 0x0F0FFF
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect rocketminsta_laser_yellow
-trailspacing 2
-type static
-color 0xFFFF0F 0xFFFF0F
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0xFFFF0F 0xFFFF0F
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect rocketminsta_laser_yellow
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0xFFFF0F 0xFFFF0F
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// rocketminsta laser trail - pink
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0xFFFF0F 0xFFFF0F
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect rocketminsta_laser_pink
-trailspacing 2
-type static
-color 0xFF0FFF 0xFF0FFF
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0xFF0FFF 0xFF0FFF
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect rocketminsta_laser_pink
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0xFF0FFF 0xFF0FFF
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
-
-// rocketminsta laser trail - neutral
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0xFF0FFF 0xFF0FFF
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
 effect rocketminsta_laser_neutral
-trailspacing 2
-type static
-color 0xFFFFFF 0xFFFFFF
-size 3 3
-tex 38 38
-alpha 256 256 968
-//velocityjitter 16 16 16
-lightradius 90
-lighttime 0
-lightcolor 1.5 3 6
-velocitymultiplier -0.1
-// bright sparks
+       alpha 256 256 968
+       color 0xFFFFFF 0xFFFFFF
+       lightcolor 1.5 3 6
+       lightradius 90
+       size 3 3
+       tex 38 38
+       trailspacing 2
+       type static
+       velocitymultiplier -0.100000
 effect rocketminsta_laser_neutral
-trailspacing 12
-count 1.5
-type snow
-tex 42 42
-color 0xFFFFFF 0xFFFFFF
-size 2 4
-sizeincrease -20
-alpha 444 512 1866
-bounce 1
-velocityoffset 0 0 15
-airfriction 12
-originjitter 1 1 1
-velocityjitter 50 50 50
+       airfriction 12
+       alpha 444 512 1866
+       bounce 1
+       color 0xFFFFFF 0xFFFFFF
+       count 1.500000
+       originjitter 1 1 1
+       sizeincrease -20
+       size 2 4
+       tex 42 42
+       trailspacing 12
+       type snow
+       velocityjitter 50 50 50
+       velocityoffset 0 0 15
diff --git a/gfx/hud/default/checkmark.tga b/gfx/hud/default/checkmark.tga
new file mode 100644 (file)
index 0000000..71cbd68
Binary files /dev/null and b/gfx/hud/default/checkmark.tga differ
diff --git a/gfx/hud/default/minigames/qto/board.jpg b/gfx/hud/default/minigames/qto/board.jpg
deleted file mode 100644 (file)
index cf8fe0a..0000000
Binary files a/gfx/hud/default/minigames/qto/board.jpg and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/board_alpha.jpg b/gfx/hud/default/minigames/qto/board_alpha.jpg
deleted file mode 100644 (file)
index 44a8708..0000000
Binary files a/gfx/hud/default/minigames/qto/board_alpha.jpg and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/icon.jpg b/gfx/hud/default/minigames/qto/icon.jpg
deleted file mode 100644 (file)
index a534f48..0000000
Binary files a/gfx/hud/default/minigames/qto/icon.jpg and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/icon_notif.jpg b/gfx/hud/default/minigames/qto/icon_notif.jpg
deleted file mode 100644 (file)
index 90e0e2e..0000000
Binary files a/gfx/hud/default/minigames/qto/icon_notif.jpg and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/icon_notif_alpha.jpg b/gfx/hud/default/minigames/qto/icon_notif_alpha.jpg
deleted file mode 100644 (file)
index 040990f..0000000
Binary files a/gfx/hud/default/minigames/qto/icon_notif_alpha.jpg and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/piece0.tga b/gfx/hud/default/minigames/qto/piece0.tga
deleted file mode 100644 (file)
index fad7dbd..0000000
Binary files a/gfx/hud/default/minigames/qto/piece0.tga and /dev/null differ
diff --git a/gfx/hud/default/minigames/qto/piece1.tga b/gfx/hud/default/minigames/qto/piece1.tga
deleted file mode 100644 (file)
index 80a34c2..0000000
Binary files a/gfx/hud/default/minigames/qto/piece1.tga and /dev/null differ
diff --git a/gfx/hud/default/minigames/snake/board.jpg b/gfx/hud/default/minigames/snake/board.jpg
new file mode 100644 (file)
index 0000000..dfc5c3c
Binary files /dev/null and b/gfx/hud/default/minigames/snake/board.jpg differ
diff --git a/gfx/hud/default/minigames/snake/board_alpha.jpg b/gfx/hud/default/minigames/snake/board_alpha.jpg
new file mode 100644 (file)
index 0000000..44a8708
Binary files /dev/null and b/gfx/hud/default/minigames/snake/board_alpha.jpg differ
diff --git a/gfx/hud/default/minigames/snake/body.tga b/gfx/hud/default/minigames/snake/body.tga
new file mode 100644 (file)
index 0000000..b8064cc
Binary files /dev/null and b/gfx/hud/default/minigames/snake/body.tga differ
diff --git a/gfx/hud/default/minigames/snake/head.tga b/gfx/hud/default/minigames/snake/head.tga
new file mode 100644 (file)
index 0000000..0679f84
Binary files /dev/null and b/gfx/hud/default/minigames/snake/head.tga differ
diff --git a/gfx/hud/default/minigames/snake/icon.jpg b/gfx/hud/default/minigames/snake/icon.jpg
new file mode 100644 (file)
index 0000000..14252ae
Binary files /dev/null and b/gfx/hud/default/minigames/snake/icon.jpg differ
diff --git a/gfx/hud/default/minigames/snake/icon_notif.jpg b/gfx/hud/default/minigames/snake/icon_notif.jpg
new file mode 100644 (file)
index 0000000..988b6db
Binary files /dev/null and b/gfx/hud/default/minigames/snake/icon_notif.jpg differ
diff --git a/gfx/hud/default/minigames/snake/icon_notif_alpha.jpg b/gfx/hud/default/minigames/snake/icon_notif_alpha.jpg
new file mode 100644 (file)
index 0000000..040990f
Binary files /dev/null and b/gfx/hud/default/minigames/snake/icon_notif_alpha.jpg differ
diff --git a/gfx/hud/default/minigames/snake/mouse.tga b/gfx/hud/default/minigames/snake/mouse.tga
new file mode 100644 (file)
index 0000000..eda8ef7
Binary files /dev/null and b/gfx/hud/default/minigames/snake/mouse.tga differ
diff --git a/gfx/hud/default/minigames/snake/tail.tga b/gfx/hud/default/minigames/snake/tail.tga
new file mode 100644 (file)
index 0000000..71a7901
Binary files /dev/null and b/gfx/hud/default/minigames/snake/tail.tga differ
diff --git a/gfx/hud/default/minigames/snake/tongue.tga b/gfx/hud/default/minigames/snake/tongue.tga
new file mode 100644 (file)
index 0000000..9818d4e
Binary files /dev/null and b/gfx/hud/default/minigames/snake/tongue.tga differ
index 9922d7e5674db21aa80098de1f956eb4f8863791..6dfec5088f886a3b229b0185c35f2e6d24a4ff17 100644 (file)
@@ -11,4 +11,11 @@ set sv_minigames_pong_ball_radius   0.03125 "Ball radius relative to the board s
 set sv_minigames_pong_ball_number   1       "Number of balls to be played at once"
 
 set sv_minigames_pong_ai_thinkspeed 0.1     "Seconds between AI actions"
-set sv_minigames_pong_ai_tolerance  0.33    "Distance of the ball relative to the paddle size"
\ No newline at end of file
+set sv_minigames_pong_ai_tolerance  0.33    "Distance of the ball relative to the paddle size"
+
+
+// Snake? Snake! SNAAAAKE!!
+set sv_minigames_snake_wrap 0 "Wrap around the edges of the screen instead of dying on touch"
+set sv_minigames_snake_delay_initial 0.7 "Initial delay between snake movement"
+set sv_minigames_snake_delay_multiplier 50 "Multiplier of incremental of movement speed (player_score / cvar)"
+set sv_minigames_snake_delay_min 0.1 "Minimum delay between snake movement (at fastest rate)"
index 9d961c0ad636036bfd440a91ecdddbb2f83dc75b..2cb6c3e7d90431937bab6a1246f001f40b05e2e6 100644 (file)
@@ -102,6 +102,7 @@ set g_monsters_spawnshieldtime 2
 set g_monsters_typefrag 1
 set g_monsters_target_range 2000
 set g_monsters_target_infront 0
+set g_monsters_target_infront_range 0.3
 set g_monsters_attack_range 120
 set g_monsters_respawn 1
 set g_monsters_respawn_delay 20
index 6dd476c2d3b9c1cea04b8ad97a37f75d2b551907..51440d4a3c90da83d77f8e57033c7e2287c188d6 100644 (file)
@@ -9,32 +9,34 @@ QCCVERSIONFILE := qccversion.$(shell (cd server && $(QCC) --version) > qccversio
 QCCFLAGS_WTFS ?= \
        -Wno-field-redeclared
 
-QCCFLAGS ?= \
-       -std=gmqcc \
-       -O3 -flno \
-       -Werror -fno-bail-on-werror -Wall \
-       -fftepp -fftepp-predefs -Wcpp -futf8 -frelaxed-switch -freturn-assignments \
-       $(QCCFLAGS_WTFS) \
-       $(QCCFLAGS_FEATURES) \
-       $(QCCFLAGS_EXTRA) $(QCCFLAGS_WATERMARK)
-
 QCCFLAGS_FEATURES ?= \
        -DVEHICLES_ENABLED=1 \
        -DVEHICLES_USE_ODE=0 \
        -DBUILD_MOD=$(BUILD_MOD)
 
+QCCFLAGS ?= \
+       -std=gmqcc \
+       -O3 \
+       -Werror -Wall -Wcpp \
+       $(QCCFLAGS_WTFS) \
+       -fftepp -flno -futf8 -fno-bail-on-werror -fftepp-predefs \
+       -frelaxed-switch -freturn-assignments \
+       $(QCCFLAGS_WATERMARK) \
+       $(QCCFLAGS_FEATURES) \
+       $(QCCFLAGS_EXTRA)
+
 # xonotic build system overrides this by command line argument to turn off the update-cvarcount step
 XON_BUILDSYSTEM =
 
-all: qc
 .PHONY: all
+all: qc
 
 .PHONY: qc
 qc: ../menu.dat ../progs.dat ../csprogs.dat
 
 .PHONY: clean
 clean:
-       rm -f ../progs.dat ../menu.dat ../csprogs.dat server/precache-for-csqc.inc
+       rm -f ../progs.dat ../menu.dat ../csprogs.dat
 
 $(QCCVERSIONFILE):
        $(RM) qccversion.*
@@ -45,11 +47,8 @@ FILES_CSPROGS = $(shell find client lib common warpzonelib csqcmodellib -type f
        @echo make[1]: Entering directory \`$(PWD)/client\'
        cd client && $(QCC) $(QCCFLAGS) -DCSQC
 
-server/precache-for-csqc.inc: $(FILES_CSPROGS)
-       sh collect-precache.sh
-
 FILES_PROGS = $(shell find server lib common warpzonelib csqcmodellib -type f -not -name fteqcc.log -not -name qc.asm)
-../progs.dat: $(FILES_PROGS) $(QCCVERSIONFILE) server/precache-for-csqc.inc
+../progs.dat: $(FILES_PROGS) $(QCCVERSIONFILE)
        @echo make[1]: Entering directory \`$(PWD)/server\'
        cd server && $(QCC) $(QCCFLAGS) -DSVQC
 
index 66fd813143ded40e3c222e4a70c49aefdc558fa9..12dc1b4a3ae6b23dc09ca2af94a5065d2f32fec4 100644 (file)
@@ -9,5 +9,6 @@
 #include "../dpdefs/csprogsdefs.qh"
 
 #include "../common/models/models.qh"
+#include "../common/sounds/sounds.qh"
 
 #endif
index aec000d64c7c069b8c1d342484b977b3232c680a..a83260b1049c7dfcabcb04926e9b6c817fe1dd23 100644 (file)
@@ -4,7 +4,6 @@
 #include "../common/movetypes/movetypes.qh"
 
 .float alpha;
-bool cpicon_precached;
 .int count;
 .float pain_finished;
 
@@ -21,14 +20,6 @@ bool cpicon_precached;
 
 .entity icon_realmodel;
 
-void cpicon_precache()
-{
-       if(cpicon_precached)
-               return; // already precached
-
-       cpicon_precached = true;
-}
-
 void cpicon_draw()
 {SELFPARAM();
        if(time < self.move_time) { return; }
@@ -186,7 +177,6 @@ void ent_cpicon()
                        self.count = (self.health - self.max_health) * frametime;
 
                cpicon_changeteam();
-               cpicon_precache();
                cpicon_construct();
        }
 
index 8469b5226fc36ef3f0efc15310c9732b0f654552..a2ce395917ae7561f4482c36bac921250780b1f8 100644 (file)
@@ -8,6 +8,5 @@ const int CPSF_STATUS = 4;
 const int CPSF_SETUP = 8;
 
 void ent_cpicon();
-void cpicon_precache();
 
 #endif
index 022afd9d11c937ed493fd1df41ea96f6a0140edb..0c25e60064533141963afe43b98f957756279e2f 100644 (file)
@@ -1,4 +1,3 @@
-#include "csqcmodel_hooks.qh"
 #include "_all.qh"
 
 #include "gibs.qh"
@@ -591,7 +590,7 @@ void CSQCModel_Effects_Apply(void)
        {
                if(!self.snd_looping)
                {
-                       sound(self, CH_TRIGGER_SINGLE, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+                       sound(self, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_g_jetpack_attenuation);
                        self.snd_looping = CH_TRIGGER_SINGLE;
                }
        }
@@ -599,17 +598,12 @@ void CSQCModel_Effects_Apply(void)
        {
                if(self.snd_looping)
                {
-                       sound(self, self.snd_looping, "misc/null.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+                       sound(self, self.snd_looping, SND_Null, VOL_BASE, autocvar_g_jetpack_attenuation);
                        self.snd_looping = 0;
                }
        }
 }
 
-void CSQCPlayer_Precache()
-{
-       precache_sound("misc/jetpack_fly.wav");
-}
-
 // general functions
 .int csqcmodel_predraw_run;
 .int anim_frame;
diff --git a/qcsrc/client/csqcmodel_hooks.qh b/qcsrc/client/csqcmodel_hooks.qh
deleted file mode 100644 (file)
index 8995880..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef CSQCMODEL_HOOKS
-#define CSQCMODEL_HOOKS
-
-void CSQCPlayer_Precache();
-
-#endif
index ec6da98428e372d66f15348fc2c50682bec5ac0d..4f25aef13ef2d25bd6c9a1cdf81637f8a104e60c 100644 (file)
@@ -228,35 +228,33 @@ void Ent_DamageInfo(float isNew)
 
                        // spiderbot
                        case DEATH_VH_SPID_MINIGUN:
-                               string _snd;
-                               _snd = W_Sound(strcat("ric", ftos(1 + rint(random() * 2))));
-                               sound(self, CH_SHOTS, _snd, VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_SPIDERBOT_MINIGUN_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_SPID_ROCKET:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_SPIDERBOT_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_SPID_DEATH:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1);
                                break;
 
                        case DEATH_VH_WAKI_GUN:
-                               sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_RACER_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_WAKI_ROCKET:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_RACER_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_WAKI_DEATH:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1);
                                break;
 
                        case DEATH_VH_RAPT_CANNON:
-                               sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_RAPTOR_CANNON_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_RAPT_FRAGMENT:
@@ -268,19 +266,19 @@ void Ent_DamageInfo(float isNew)
                                        ang = vectoangles(vel);
                                        RaptorCBShellfragToss(w_org, vel, ang + '0 0 1' * (120 * i));
                                }
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_RAPTOR_BOMB_SPREAD), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_RAPT_BOMB:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_RAPTOR_BOMB_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_RAPT_DEATH:
-                               sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1);
                                break;
                        case DEATH_VH_BUMB_GUN:
-                               sound(self, CH_SHOTS, W_Sound("fireball_impact2"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_FIREBALL_IMPACT2, VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_BIGPLASMA_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
                }
@@ -289,7 +287,6 @@ void Ent_DamageInfo(float isNew)
 
        if(DEATH_ISTURRET(w_deathtype))
        {
-               string _snd;
                traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
                if(trace_plane_normal != '0 0 0')
                        w_backoff = trace_plane_normal;
@@ -301,38 +298,36 @@ void Ent_DamageInfo(float isNew)
                switch(w_deathtype)
                {
                         case DEATH_TURRET_EWHEEL:
-                               sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
 
                         case DEATH_TURRET_FLAC:
                                pointparticles(particleeffectnum(EFFECT_HAGAR_EXPLODE), w_org, '0 0 0', 1);
-                               _snd = W_Sound(strcat("hagexp", ftos(1 + rint(random() * 2))));
-                               sound(self, CH_SHOTS, _snd, VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_HAGEXP_RANDOM(), VOL_BASE, ATTEN_NORM);
                                break;
 
                         case DEATH_TURRET_MLRS:
                         case DEATH_TURRET_HK:
                         case DEATH_TURRET_WALK_ROCKET:
                         case DEATH_TURRET_HELLION:
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1);
                                break;
 
                         case DEATH_TURRET_MACHINEGUN:
                         case DEATH_TURRET_WALK_GUN:
-                               _snd = W_Sound(strcat("ric", ftos(1 + rint(random() * 2))));
-                               sound(self, CH_SHOTS, _snd, VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTEN_NORM);
                                pointparticles(particleeffectnum(EFFECT_MACHINEGUN_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
 
                         case DEATH_TURRET_PLASMA:
-                               sound(self, CH_SHOTS, W_Sound("electro_impact"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_ELECTRO_IMPACT), self.origin, w_backoff * 1000, 1);
                                break;
 
                         case DEATH_TURRET_WALK_MELEE:
-                               sound(self, CH_SHOTS, W_Sound("ric1"), VOL_BASE, ATTEN_MIN);
+                               sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTEN_MIN);
                                pointparticles(particleeffectnum(EFFECT_TE_SPARK), self.origin, w_backoff * 1000, 1);
                                break;
 
index c9358b6795cea7091efad0056da321f6eb831ec0..148a8f521b0ab3a2991c9f95aa388368ca69c0f6 100644 (file)
@@ -1,22 +1,8 @@
 #include "generator.qh"
 
-bool generator_precached;
 .int count;
 .float max_health;
 
-void generator_precache()
-{
-       if(generator_precached)
-               return; // already precached
-
-       precache_sound("onslaught/shockwave.wav");
-       precache_sound(W_Sound("grenade_impact"));
-       precache_sound(W_Sound("rocket_impact"));
-       precache_sound("onslaught/electricity_explode.wav");
-
-       generator_precached = true;
-}
-
 void ons_generator_ray_draw()
 {SELFPARAM();
        if(time < self.move_time)
@@ -68,7 +54,7 @@ void generator_draw()
                if(random() < 0.01)
                {
                        pointparticles(particleeffectnum(EFFECT_ELECTRO_BALLEXPLODE), self.origin + randompos('-50 -50 -20', '50 50 50'), '0 0 0', 1);
-                       sound(self, CH_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_TRIGGER, SND_ONS_ELECTRICITY_EXPLODE, VOL_BASE, ATTEN_NORM);
                }
                else
                        pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_DAMAGED), self.origin + randompos('-60 -60 -20', '60 60 60'), '0 0 0', 1);
@@ -87,7 +73,7 @@ void generator_draw()
        // White shockwave
        if(self.count==40||self.count==20)
        {
-               sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ONS_SHOCKWAVE, VOL_BASE, ATTEN_NORM);
                pointparticles(particleeffectnum(EFFECT_ELECTRO_COMBO), self.origin, '0 0 0', 6);
        }
 
@@ -108,7 +94,7 @@ void generator_draw()
        if(random() < 0.25)
        {
                te_explosion(self.origin);
-               sound(self, CH_TRIGGER, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM);
        }
 
        // Particles
@@ -121,7 +107,7 @@ void generator_draw()
                org = self.origin;
                te_explosion(org);
                pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_EXPLODE2), org, '0 0 0', 1);
-               sound(self, CH_TRIGGER, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        }
 
        self.move_time = time + 0.05;
@@ -213,7 +199,6 @@ void ent_generator()
                        self.count = 40;
 
                generator_changeteam();
-               generator_precache();
                generator_construct();
        }
 
index e4e1611f31273ca1d7dda2173f72405d733ab3c4..744bc5589f47a39edba81e1bf1fe78dbc215d617 100644 (file)
@@ -7,5 +7,4 @@ const int GSF_STATUS = 4;
 const int GSF_SETUP = 8;
 
 void ent_generator();
-void generator_precache();
 #endif
index 0302f184150f81525487e63b5ca272c9052be29e..5c4c338f155c5e91ad7272c5556de0c80f10c486 100644 (file)
@@ -85,7 +85,7 @@ void Gib_Touch()
        }
 
        if(!self.silent)
-               sound(self, CH_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_PAIN, SND_GIB_SPLAT_RANDOM(), VOL_BASE, ATTEN_NORM);
        pointparticles(_particleeffectnum(strcat(species_prefix(self.cnt), "blood")), self.origin + '0 0 1', '0 0 30', 10);
 
        Gib_Delete();
@@ -218,7 +218,7 @@ void Ent_GibSplash(bool isNew)
        {
                case 0x01:
                        if(!issilent)
-                               sound (self, CH_PAIN, "misc/gib.wav", VOL_BASE, ATTEN_NORM);
+                               sound (self, CH_PAIN, SND_GIB, VOL_BASE, ATTEN_NORM);
 
                        if(prandom() < amount)
                                TossGib ("models/gibs/eye.md3", org, org, vel, prandomvec() * 150, specnum, 0, issilent);
@@ -272,12 +272,3 @@ void Ent_GibSplash(bool isNew)
                        break;
        }
 }
-
-void GibSplash_Precache()
-{
-       precache_sound ("misc/gib.wav");
-    precache_sound ("misc/gib_splat01.wav");
-    precache_sound ("misc/gib_splat02.wav");
-    precache_sound ("misc/gib_splat03.wav");
-    precache_sound ("misc/gib_splat04.wav");
-}
index b33a1a5e061bf1416e11085bd812a899a0ca2e88..5b8b16bfd8c11cbac3caba4fd709716dfd8b07a6 100644 (file)
@@ -23,5 +23,4 @@ void TossGib (string mdlname, vector safeorg, vector org, vector vconst, vector
 
 void Ent_GibSplash(bool isNew);
 
-void GibSplash_Precache();
 #endif
index 528646979e987606f70fc3f9c939f9cd15aebbd8..dd70c760c34534a1456165647e1fcc019b10754a 100644 (file)
@@ -44,7 +44,7 @@ void Draw_GrapplingHook()
        if(self.teleport_time)
        if(time > self.teleport_time)
        {
-               sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM); // safeguard
+               sound (self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM); // safeguard
                self.teleport_time = 0;
        }
 
@@ -168,7 +168,7 @@ void Draw_GrapplingHook()
 
 void Remove_GrapplingHook()
 {SELFPARAM();
-       sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
+       sound (self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
 }
 
 void Ent_ReadHook(float bIsNew, float type)
@@ -228,7 +228,7 @@ void Ent_ReadHook(float bIsNew, float type)
                                self.drawmask = MASK_NORMAL;
                                break;
                        case ENT_CLIENT_ARC_BEAM:
-                               sound (self, CH_SHOTS_SINGLE, W_Sound("lgbeam_fly"), VOL_BASE, ATTEN_NORM);
+                               sound (self, CH_SHOTS_SINGLE, SND_LGBEAM_FLY, VOL_BASE, ATTEN_NORM);
                                break;
                }
        }
@@ -236,9 +236,4 @@ void Ent_ReadHook(float bIsNew, float type)
        self.teleport_time = time + 10;
 }
 
-void Hook_Precache()
-{
-       precache_sound(W_Sound("lgbeam_fly"));
-}
-
 // TODO: hook: temporarily transform self.origin for drawing the model along warpzones!
index 8401dce049a43cd1c90accf3c6e3c30471da7946..e513ed6afa4451ee0271a1bc33d15716b869edfc 100644 (file)
@@ -2,7 +2,6 @@
 #define HOOK_H
 
 void Draw_CylindricLine(vector from, vector to, float thickness, string texture, float aspect, float shift, vector rgb, float theAlpha, float drawflag, vector vieworg);
-void Hook_Precache();
 
 void Ent_ReadHook(float bIsNew, float type);
 
index c534cc7a5db46dc3362a9b511b551e7bb4861f86..ca31f32f71bf7b5afb82bb487a650653d1da108d 100644 (file)
@@ -2,7 +2,6 @@
 #include "_all.qh"
 
 #include "controlpoint.qh"
-#include "csqcmodel_hooks.qh"
 #include "damage.qh"
 #include "effects.qh"
 #include "generator.qh"
@@ -49,7 +48,6 @@
 #include "../common/triggers/include.qh"
 
 #include "../common/turrets/cl_turrets.qh"
-#include "../common/turrets/turrets.qh"
 
 #include "../warpzonelib/client.qh"
 
@@ -153,18 +151,10 @@ void CSQC_Init(void)
        CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes);
        CALL_ACCUMULATED_FUNCTION(RegisterHUD_Panels);
 
-       initialize_minigames();
-
        // precaches
-       precache_sound("misc/hit.wav");
-       precache_sound("misc/typehit.wav");
 
-       generator_precache();
        Projectile_Precache();
-       Hook_Precache();
-       GibSplash_Precache();
        Tuba_Precache();
-       CSQCPlayer_Precache();
 
        if(autocvar_cl_reticle)
        {
@@ -778,7 +768,7 @@ void Ent_ReadSpawnEvent(float is_new)
                        }
                        if(autocvar_cl_spawn_event_sound)
                        {
-                               sound(self, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_TRIGGER, SND_SPAWN, VOL_BASE, ATTEN_NORM);
                        }
                }
        }
@@ -935,7 +925,7 @@ void Ent_Remove()
 
        if(self.snd_looping > 0)
        {
-               sound(self, self.snd_looping, "misc/null.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+               sound(self, self.snd_looping, SND_Null, VOL_BASE, autocvar_g_jetpack_attenuation);
                self.snd_looping = 0;
        }
 
index 3511c743f05b7478a6436c884775742962532b72..945f312ab29a29592806145c248229b94c1fcf92 100644 (file)
@@ -630,8 +630,6 @@ void GameTypeVote_ReadOption(int i)
 
 void MapVote_Init()
 {
-       precache_sound ("misc/invshot.wav");
-
        mv_active = 1;
        if(autocvar_hud_cursormode) { setcursormode(1); }
        else { mv_mousepos = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; }
index b985e36f6763e2561d1c7398af44c0dae43d4a28..3d742a624588ce6de0fc83ae2fef10896ea172ea 100644 (file)
@@ -38,6 +38,7 @@
 #include "../common/animdecide.qc"
 #include "../common/buffs.qc"
 #include "../common/effects/effects.qc"
+#include "../common/effects/effectinfo.qc"
 #include "../common/mapinfo.qc"
 #include "../common/movetypes/include.qc"
 #include "../common/nades.qc"
@@ -59,7 +60,7 @@
 #include "../common/weapons/all.qc"
 
 #include "../common/turrets/cl_turrets.qc"
-#include "../common/turrets/turrets.qc"
+#include "../common/turrets/all.qc"
 
 #include "../common/triggers/include.qc"
 
index 1acfbd7eb7b1aee14fc43e40dd8507bfe7379fe2..91ccbba5c853e7d1d7367e1da60c0f404cefefca 100644 (file)
@@ -65,7 +65,7 @@ void tubasound(entity e, bool restart)
                if (restart) {
                        snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
                }
-               sound(e, CH_TUBA_SINGLE, snd1, e.tuba_volume, e.tuba_attenuate * autocvar_g_balance_tuba_attenuation);
+               _sound(e, CH_TUBA_SINGLE, snd1, e.tuba_volume, e.tuba_attenuate * autocvar_g_balance_tuba_attenuation);
        }
 }
 
@@ -79,9 +79,9 @@ void Ent_TubaNote_Think()
        }
        self.nextthink = time;
        if (self.tuba_volume <= 0) {
-               sound(self, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
+               sound(self, CH_TUBA_SINGLE, SND_Null, 0, 0);
                if (self.enemy) {
-                       sound(self.enemy, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
+                       sound(self.enemy, CH_TUBA_SINGLE, SND_Null, 0, 0);
                        remove(self.enemy);
                }
                remove(self);
index 146d322fcce134b6d23df2e915c98df2d4f9c749..26089f9158e764ff2d1d47b41f2661b8494c5c46 100644 (file)
@@ -517,7 +517,7 @@ void UpdateHitsound()
                        // todo: avoid very long and very short sounds from wave stretching using different sound files? seems unnecessary
                        // todo: normalize sound pressure levels? seems unnecessary
 
-                       sound7(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE, pitch_shift * 100, 0);
+                       sound7(world, CH_INFO, SND(HIT), VOL_BASE, ATTN_NONE, pitch_shift * 100, 0);
                }
                unaccounted_damage = 0;
                hitsound_time_prev = time;
@@ -527,7 +527,7 @@ void UpdateHitsound()
        float typehit_time = getstatf(STAT_TYPEHIT_TIME);
        if (COMPARE_INCREASING(typehit_time, typehit_time_prev) > autocvar_cl_hitsound_antispam_time)
        {
-               sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+               sound(world, CH_INFO, SND_TYPEHIT, VOL_BASE, ATTN_NONE);
                typehit_time_prev = typehit_time;
        }
 }
index 1be6f8974b77bb5034279b82afb0e9ecae104b55..07228885db781391164839d875dc489315ce52bf 100644 (file)
@@ -170,7 +170,7 @@ void loopsound(entity e, int ch, string samp, float vol, float attn)
        if(self.silent)
                return;
 
-       sound(e, ch, samp, vol, attn);
+       _sound(e, ch, samp, vol, attn);
        e.snd_looping = ch;
 }
 
@@ -270,9 +270,6 @@ void Ent_Projectile()
 
        if(f & 2)
        {
-               string rm_suffix = strcat("rocketminsta_laser_", Static_Team_ColorName_Lower(self.team));
-               if(_particleeffectnum(rm_suffix) < 0 || Team_TeamToNumber(self.team) == -1) { rm_suffix = "TR_NEXUIZPLASMA"; }
-
                self.cnt = ReadByte();
 
                self.silent = (self.cnt & 0x80);
@@ -320,7 +317,7 @@ void Ent_Projectile()
 
                        CASE(RPC)                self.traileffect = particleeffectnum(EFFECT_TR_ROCKET); break;
 
-                       CASE(ROCKETMINSTA_LASER) self.traileffect = _particleeffectnum(rm_suffix); break;
+                       CASE(ROCKETMINSTA_LASER) self.traileffect = particleeffectnum(EFFECT_ROCKETMINSTA_LASER(self.team)); break;
 #undef CASE
                        default:
                                if(MUTATOR_CALLHOOK(Ent_Projectile, self))
@@ -347,7 +344,7 @@ void Ent_Projectile()
                {
                        case PROJECTILE_ELECTRO:
                                // only new engines support sound moving with object
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("electro_fly"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(ELECTRO_FLY), VOL_BASE, ATTEN_NORM);
                                self.mins = '0 0 -4';
                                self.maxs = '0 0 -4';
                                self.move_movetype = MOVETYPE_BOUNCE;
@@ -357,7 +354,7 @@ void Ent_Projectile()
                                break;
                        case PROJECTILE_RPC:
                        case PROJECTILE_ROCKET:
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("rocket_fly"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(ROCKET_FLY), VOL_BASE, ATTEN_NORM);
                                self.mins = '-3 -3 -3';
                                self.maxs = '3 3 3';
                                break;
@@ -405,12 +402,12 @@ void Ent_Projectile()
                                break;
                        case PROJECTILE_NAPALM_FOUNTAIN:
                        case PROJECTILE_FIREBALL:
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("fireball_fly2"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(FIREBALL_FLY2), VOL_BASE, ATTEN_NORM);
                                self.mins = '-16 -16 -16';
                                self.maxs = '16 16 16';
                                break;
                        case PROJECTILE_FIREMINE:
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("fireball_fly"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(FIREBALL_FLY), VOL_BASE, ATTEN_NORM);
                                self.move_movetype = MOVETYPE_BOUNCE;
                                self.move_touch = func_null;
                                self.mins = '-4 -4 -4';
@@ -425,7 +422,7 @@ void Ent_Projectile()
                                self.maxs = '2 2 2';
                                break;
                        case PROJECTILE_SEEKER:
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("tag_rocket_fly"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(TAG_ROCKET_FLY), VOL_BASE, ATTEN_NORM);
                                self.mins = '-4 -4 -4';
                                self.maxs = '4 4 4';
                                break;
@@ -438,17 +435,17 @@ void Ent_Projectile()
             case PROJECTILE_RAPTORCANNON:
                                break;
             case PROJECTILE_SPIDERROCKET:
-                loopsound(self, CH_SHOTS_SINGLE, W_Sound("tag_rocket_fly"), VOL_BASE, ATTEN_NORM);
+                loopsound(self, CH_SHOTS_SINGLE, SND(TAG_ROCKET_FLY), VOL_BASE, ATTEN_NORM);
                                break;
             case PROJECTILE_WAKIROCKET:
-                loopsound(self, CH_SHOTS_SINGLE, W_Sound("tag_rocket_fly"), VOL_BASE, ATTEN_NORM);
+                loopsound(self, CH_SHOTS_SINGLE, SND(TAG_ROCKET_FLY), VOL_BASE, ATTEN_NORM);
                                break;
             /*
             case PROJECTILE_WAKICANNON:
                                break;
                        case PROJECTILE_BUMBLE_GUN:
                                // only new engines support sound moving with object
-                               loopsound(self, CH_SHOTS_SINGLE, W_Sound("electro_fly"), VOL_BASE, ATTEN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, SND(ELECTRO_FLY), VOL_BASE, ATTEN_NORM);
                                self.mins = '0 0 -4';
                                self.maxs = '0 0 -4';
                                self.move_movetype = MOVETYPE_BOUNCE;
@@ -508,11 +505,5 @@ void Ent_Projectile()
 
 void Projectile_Precache()
 {
-       precache_sound(W_Sound("electro_fly"));
-       precache_sound(W_Sound("rocket_fly"));
-       precache_sound(W_Sound("fireball_fly"));
-       precache_sound(W_Sound("fireball_fly2"));
-       precache_sound(W_Sound("tag_rocket_fly"));
-
        MUTATOR_CALLHOOK(PrecacheProjectiles);
 }
diff --git a/qcsrc/collect-precache.sh b/qcsrc/collect-precache.sh
deleted file mode 100755 (executable)
index 302220c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-{
-       grep -h '\<precache_model *( *"' client/* | grep -v "//NO_SV_PRECACHE"
-       grep -h '\<precache_sound *( *"' client/* | grep -v "//NO_SV_PRECACHE"
-} > server/precache-for-csqc.inc
-
index 3eff9e26b8e39d3298000b3c77106a4525a3b2f4..31654ebf8095a9a9267eedd682b73b8b82314e5a 100644 (file)
@@ -145,8 +145,7 @@ REGISTER_BUFF(MAGNET) {
 void buff_Init(entity ent);
 void buff_Init_Compat(entity ent, entity replacement);
 
-#define BUFF_SPAWNFUNC(e, b, t) void spawnfunc_item_buff_##e() { \
-       SELFPARAM(); \
+#define BUFF_SPAWNFUNC(e, b, t) spawnfunc(item_buff_##e) { \
        self.buffs = b.m_itemid; \
        self.team = t; \
        buff_Init(self); \
@@ -157,7 +156,7 @@ void buff_Init_Compat(entity ent, entity replacement);
                BUFF_SPAWNFUNC(e##_team2,   b,  NUM_TEAM_2) \
                BUFF_SPAWNFUNC(e##_team3,   b,  NUM_TEAM_3) \
                BUFF_SPAWNFUNC(e##_team4,   b,  NUM_TEAM_4)
-#define BUFF_SPAWNFUNC_Q3TA_COMPAT(o, r) void spawnfunc_item_##o() { SELFPARAM(); buff_Init_Compat(self, r); }
+#define BUFF_SPAWNFUNC_Q3TA_COMPAT(o, r) spawnfunc(item_##o) { buff_Init_Compat(self, r); }
 
 BUFF_SPAWNFUNCS(resistance,            BUFF_RESISTANCE)
 BUFF_SPAWNFUNCS(ammo,                  BUFF_AMMO)
index 0c8f85816f124f2668255db78a3872a8bb81b033..20826f64e21f74853743cd7e757da8a3f4031552 100644 (file)
@@ -240,6 +240,49 @@ void GenericCommand_dumpcommands(float request)
        }
 }
 
+#ifndef MENUQC
+void effectinfo_dump(int fh, bool alsoprint);
+#endif
+void GenericCommand_dumpeffectinfo(float request)
+{
+    switch (request) {
+        case CMD_REQUEST_COMMAND: {
+            #ifndef MENUQC
+            string filename = argv(1);
+                       bool alsoprint = false;
+            if (filename == "") {
+                filename = "effectinfo_dump.txt";
+                alsoprint = false;
+            } else if (filename == "-") {
+                filename = "effectinfo_dump.txt";
+                alsoprint = true;
+            }
+            int fh = fopen(filename, FILE_WRITE);
+            if (fh >= 0) {
+               effectinfo_dump(fh, alsoprint);
+                LOG_INFOF("Dumping effectinfo... File located at ^2data/data/%s^7.\n", filename);
+                               LOG_INFOF("Reload with ^2cl_particles_reloadeffects data/%s^7.\n", filename);
+                fclose(fh);
+            } else {
+                LOG_WARNINGF("Could not open file '%s'!\n", filename);
+            }
+            #else
+            LOG_INFO(_("Effectinfo dump command only works with cl_cmd and sv_cmd.\n"));
+            #endif
+            return;
+        }
+        default:
+        case CMD_REQUEST_USAGE: {
+            LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpeffectinfo [filename]"));
+            LOG_INFO("  Where 'filename' is the file to write (default is effectinfo_dump.txt),\n");
+            LOG_INFO("  if supplied with '-' output to console as well as default,\n");
+            LOG_INFO("  if left blank, it will only write to default.\n");
+            return;
+        }
+    }
+}
+STATIC_INIT(dumpeffectinfo) { localcmd("alias dumpeffectinfo \"qc_cmd_svcl dumpeffectinfo ${* ?}\"\n"); }
+
 void GenericCommand_dumpitems(float request)
 {
        switch(request)
@@ -722,6 +765,7 @@ void GenericCommand_(float request)
 #define GENERIC_COMMANDS(request,arguments,command) \
        GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \
        GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \
+       GENERIC_COMMAND("dumpeffectinfo", GenericCommand_dumpeffectinfo(request), "Dump all effectinfo to effectinfo_dump.txt") \
        GENERIC_COMMAND("dumpitems", GenericCommand_dumpitems(request), "Dump all items to the console") \
        GENERIC_COMMAND("dumpnotifs", GenericCommand_dumpnotifs(request), "Dump all notifications into notifications_dump.txt") \
        GENERIC_COMMAND("dumpturrets", GenericCommand_dumpturrets(request), "Dump all turrets into turrets_dump.txt") \
diff --git a/qcsrc/common/effects/effectinfo.inc b/qcsrc/common/effects/effectinfo.inc
new file mode 100644 (file)
index 0000000..adac07b
--- /dev/null
@@ -0,0 +1,8733 @@
+// item respawn effect
+DEF(TE_WIZSPIKE);
+// flare particle and light
+SUB(TE_WIZSPIKE) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0x63f2EA";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '0.4 0.9 0.9';
+       MY(lightradiusfade) = 200;
+       MY(lightradius) = 200;
+       MY(size_min) = 20;
+       MY(size_max) = 20;
+       MY(type) = "static";
+}
+// cloud of particles which expand rapidly and then slow to form a ball
+SUB(TE_WIZSPIKE) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0x63f2EA";
+       MY(count) = 50;
+       MY(liquidfriction) = 2;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+
+// laser impact
+DEF(TE_KNIGHTSPIKE);
+// decal
+SUB(TE_KNIGHTSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 0.2 0.2';
+       MY(lightradiusfade) = 1000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_KNIGHTSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xFF2010";
+       MY(color_max) = "0xFF2010";
+       MY(countabsolute) = 1;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+SUB(TE_KNIGHTSPIKE) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(count) = 128;
+       MY(liquidfriction) = 6;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+// machinegun bullet impact
+DEF(TE_SPIKE);
+// bullet impact decal
+SUB(TE_SPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(TE_SPIKE) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x101010";
+       MY(count) = 4;
+       MY(sizeincrease) = 3;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+// dust/smoke staying at the impact
+SUB(TE_SPIKE) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x505050";
+       MY(color_max) = "0x505050";
+       MY(count) = 0.500000;
+       MY(sizeincrease) = 4;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+}
+// bouncing sparks
+SUB(TE_SPIKE) {
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 10;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// electro combo explosion
+DEF(TE_SPIKEQUAD);
+// decal
+SUB(TE_SPIKEQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '2.0 2.5 3.0';
+       MY(lightradiusfade) = 200;
+       MY(lightradius) = 400;
+       MY(originjitter) = '34.0 34.0 34.0';
+       MY(size_min) = 64;
+       MY(size_max) = 64;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_SPIKEQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// large sparks
+SUB(TE_SPIKEQUAD) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x2030FF";
+       MY(color_max) = "0x80C0FF";
+       MY(count) = 10;
+       MY(liquidfriction) = 16;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+
+// quake effect
+DEF(TE_SUPERSPIKE);
+// decal
+SUB(TE_SUPERSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(TE_SUPERSPIKE) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x101010";
+       MY(count) = 4;
+       MY(sizeincrease) = 3;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+// dust/smoke staying at the impact
+SUB(TE_SUPERSPIKE) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x505050";
+       MY(color_max) = "0x505050";
+       MY(count) = 0.500000;
+       MY(sizeincrease) = 4;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+}
+// sparks that disappear on impact
+SUB(TE_SUPERSPIKE) {
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 15;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// quake effect
+DEF(TE_SUPERSPIKEQUAD);
+// decal
+SUB(TE_SUPERSPIKEQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '0.2 0.2 1.5';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 100;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(TE_SUPERSPIKEQUAD) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x101010";
+       MY(count) = 4;
+       MY(sizeincrease) = 3;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+// dust/smoke staying at the impact
+SUB(TE_SUPERSPIKEQUAD) {
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x505050";
+       MY(color_max) = "0x505050";
+       MY(count) = 0.500000;
+       MY(sizeincrease) = 4;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+}
+// sparks that disappear on impact
+SUB(TE_SUPERSPIKEQUAD) {
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 15;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// shotgun pellet impact
+DEF(TE_GUNSHOT);
+// decal
+SUB(TE_GUNSHOT) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(TE_GUNSHOT) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x101010";
+       MY(count) = 0.800000;
+       MY(sizeincrease) = 3;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+// dust/smoke staying at the impact
+SUB(TE_GUNSHOT) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x505050";
+       MY(color_max) = "0x505050";
+       MY(count) = 0.200000;
+       MY(sizeincrease) = 4;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+}
+// bouncing sparks
+SUB(TE_GUNSHOT) {
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 2.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// crylink impact effect
+DEF(TE_GUNSHOTQUAD);
+// decal
+SUB(TE_GUNSHOTQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '12.0 12.0 12.0';
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// purple flare effect
+SUB(TE_GUNSHOTQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x504060";
+       MY(color_max) = "0x504060";
+       MY(countabsolute) = 1;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// purple sparks
+SUB(TE_GUNSHOTQUAD) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xA040C0";
+       MY(color_max) = "0xFFFFFF";
+       MY(count) = 6;
+       MY(gravity) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(type) = "spark";
+       MY(velocityjitter) = '128.0 128.0 128.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// mortar/hagar explosion (smaller than rocket)
+DEF(TE_EXPLOSION);
+// decal
+SUB(TE_EXPLOSION) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 2.0 0.5';
+       MY(lightradiusfade) = 300;
+       MY(lightradius) = 150;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_EXPLOSION) {
+       MY(alpha_min) = 192;
+       MY(alpha_max) = 192;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x404040";
+       MY(countabsolute) = 1;
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 35;
+       MY(tex_max) = 37;
+       MY(type) = "static";
+}
+// fire effect which expands then slows
+SUB(TE_EXPLOSION) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x902010";
+       MY(color_max) = "0xFFD080";
+       MY(count) = 64;
+       MY(liquidfriction) = 4;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+// underwater bubbles
+SUB(TE_EXPLOSION) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 16;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '96.0 96.0 96.0';
+}
+// bouncing sparks
+SUB(TE_EXPLOSION) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 16;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// quake effect
+DEF(TE_EXPLOSIONQUAD);
+// decal
+SUB(TE_EXPLOSIONQUAD) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 2.0 8.0';
+       MY(lightradiusfade) = 700;
+       MY(lightradius) = 350;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// smoke cloud
+SUB(TE_EXPLOSIONQUAD) {
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 16;
+       MY(notunderwater) = true;
+       MY(size_min) = 12;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '48.0 48.0 48.0';
+}
+// underwater bubbles
+SUB(TE_EXPLOSIONQUAD) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 16;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '96.0 96.0 96.0';
+}
+// sparks which go through walls
+SUB(TE_EXPLOSIONQUAD) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 64;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// quake effect
+DEF(TE_TAREXPLOSION);
+// decal
+SUB(TE_TAREXPLOSION) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '1.6 0.8 2.0';
+       MY(lightradiusfade) = 1200;
+       MY(lightradius) = 600;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// smoke cloud
+SUB(TE_TAREXPLOSION) {
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 16;
+       MY(notunderwater) = true;
+       MY(size_min) = 12;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '48.0 48.0 48.0';
+}
+// underwater bubbles
+SUB(TE_TAREXPLOSION) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 16;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '96.0 96.0 96.0';
+}
+// sparks which go through walls
+SUB(TE_TAREXPLOSION) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 64;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// bloody impact effect indicating damage
+DEF(TE_BLOOD);
+SUB(TE_BLOOD) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(count) = 0.167000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 1;
+}
+
+// sparks (quake effect)
+DEF(TE_SPARK);
+SUB(TE_SPARK) {
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.600000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 1;
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// vortex impact
+DEF(TE_PLASMABURN);
+// decal
+SUB(TE_PLASMABURN) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '1.0 1.0 1.0';
+       MY(lightradiusfade) = 400;
+       MY(lightradius) = 200;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_PLASMABURN) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(tex_min) = 37;
+       MY(tex_max) = 37;
+       MY(type) = "static";
+}
+// small sparks which form a sphere as they slow down
+SUB(TE_PLASMABURN) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0x2030FF";
+       MY(color_max) = "0x80C0FF";
+       MY(count) = 128;
+       MY(liquidfriction) = 8;
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(type) = "spark";
+       MY(velocityjitter) = '128.0 128.0 128.0';
+}
+
+// quake effect
+DEF(TE_SMALLFLASH);
+SUB(TE_SMALLFLASH) {
+       MY(lightcolor) = '2.0 2.0 2.0';
+       MY(lightradiusfade) = 1000;
+       MY(lightradius) = 200;
+}
+
+// quake effect
+DEF(TE_FLAMEJET);
+SUB(TE_FLAMEJET) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.100000;
+       MY(color_min) = "0x6f0f00";
+       MY(color_max) = "0xe3974f";
+       MY(count) = 0.500000;
+       MY(gravity) = -1;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '128.0 128.0 128.0';
+       MY(velocitymultiplier) = 1;
+}
+
+// quake effect
+DEF(TE_LAVASPLASH);
+SUB(TE_LAVASPLASH) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x6f0f00";
+       MY(color_max) = "0xe3974f";
+       MY(count) = 32;
+       MY(gravity) = 0.050000;
+       MY(originjitter) = '128.0 128.0 32.0';
+       MY(originoffset) = '0.0 0.0 32.0';
+       MY(size_min) = 12;
+       MY(size_max) = 12;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '128.0 128.0 0.0';
+       MY(velocityoffset) = '0.0 0.0 256.0';
+}
+
+// player teleport effect
+DEF(TE_TELEPORT);
+SUB(TE_TELEPORT) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0xA0A0A0";
+       MY(color_max) = "0xFFFFFF";
+       MY(count) = 56;
+       MY(liquidfriction) = 4;
+       MY(originjitter) = '16.0 16.0 28.0';
+       MY(originoffset) = '0.0 0.0 28.0';
+       MY(size_min) = 10;
+       MY(size_max) = 10;
+       MY(type) = "static";
+       MY(velocityjitter) = '0.0 0.0 256.0';
+}
+
+// vortex beam
+DEF(TE_TEI_G3);
+SUB(TE_TEI_G3) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0xFFFFFF";
+       MY(color_max) = "0xFFFFFF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+SUB(TE_TEI_G3) {
+       MY(airfriction) = -4;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+
+// smoke effect
+DEF(TE_TEI_SMOKE);
+SUB(TE_TEI_SMOKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 0.167000;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 1;
+}
+
+// rocket explosion (bigger than mortar and hagar)
+DEF(TE_TEI_BIGEXPLOSION);
+// decal
+SUB(TE_TEI_BIGEXPLOSION) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 2.0 0.5';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 500;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_TEI_BIGEXPLOSION) {
+       MY(alpha_min) = 192;
+       MY(alpha_max) = 192;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x404040";
+       MY(countabsolute) = 1;
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 35;
+       MY(tex_max) = 37;
+       MY(type) = "static";
+}
+// fire effect
+SUB(TE_TEI_BIGEXPLOSION) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x902010";
+       MY(color_max) = "0xFFD080";
+       MY(count) = 128;
+       MY(liquidfriction) = 4;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// underwater bubbles
+SUB(TE_TEI_BIGEXPLOSION) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// bouncing sparks
+SUB(TE_TEI_BIGEXPLOSION) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 64;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(type) = "spark";
+       MY(velocityjitter) = '384.0 384.0 384.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// electro explosion
+DEF(TE_TEI_PLASMAHIT);
+// decal
+SUB(TE_TEI_PLASMAHIT) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '2.4 4.8 8.0';
+       MY(lightradiusfade) = 600;
+       MY(lightradius) = 200;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(TE_TEI_PLASMAHIT) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// cloud of bouncing sparks
+SUB(TE_TEI_PLASMAHIT) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x2030FF";
+       MY(color_max) = "0x80C0FF";
+       MY(count) = 0.500000;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+
+// bloody impact effect indicating damage
+DEF(blood);
+SUB(blood) {
+       MY(airfriction) = 0.400000;
+       MY(alpha_min) = 1560;
+       MY(alpha_max) = 2560;
+       MY(alpha_fade) = 7000;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 0.400000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 11;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 20;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "spark";
+       MY(velocityjitter) = '99.0 99.0 55.0';
+}
+//blood mist
+SUB(blood) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(blend) = "invmod";
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x420000";
+       MY(countabsolute) = 1;
+       MY(originjitter) = '11.0 11.0 11.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 25;
+       MY(size_max) = 30;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "alphastatic";
+}
+
+// player teleport effect
+DEF(teleport);
+SUB(teleport) {
+       MY(airfriction) = 2;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 100;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(count) = 500;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(stretchfactor) = 0.600000;
+       MY(tex_min) = 64;
+       MY(tex_max) = 64;
+       MY(type) = "spark";
+       MY(velocityjitter) = '1000.0 1000.0 1500.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+SUB(teleport) {
+       MY(alpha_min) = 190;
+       MY(alpha_max) = 190;
+       MY(alpha_fade) = 180;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = -80;
+       MY(size_min) = 150;
+       MY(size_max) = 150;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+}
+
+// normal super gory blood trail (used by gibs)
+DEF(TR_BLOOD);
+SUB(TR_BLOOD) {
+       MY(airfriction) = -2;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 984;
+       MY(alpha_fade) = 1492;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFF";
+       MY(gravity) = 0.400000;
+       MY(liquidfriction) = 1;
+       MY(sizeincrease) = -5;
+       MY(size_min) = 4;
+       MY(size_max) = 19;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 7;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 20;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = -0.100000;
+}
+// splash around gib
+SUB(TR_BLOOD) {
+       MY(alpha_min) = 684;
+       MY(alpha_max) = 684;
+       MY(alpha_fade) = 7492;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFF";
+       MY(sizeincrease) = 500;
+       MY(size_min) = 4;
+       MY(size_max) = 6;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 42;
+       MY(type) = "blood";
+}
+
+// thinner blood trail (used by quake zombies)
+DEF(TR_SLIGHTBLOOD);
+SUB(TR_SLIGHTBLOOD) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 384;
+       MY(alpha_fade) = 192;
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFF";
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 64;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+// func_stardust effect, used in some maps to indicate teleporters
+DEF(EF_STARDUST);
+SUB(EF_STARDUST) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0xfff368";
+       MY(color_max) = "0xfff368";
+       MY(count) = 37.500000;
+       MY(gravity) = -0.100000;
+       MY(liquidfriction) = 0.800000;
+       MY(originjitter) = '16.0 16.0 64.0';
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 0.0';
+}
+
+// flare particle and light
+DEF(item_respawn);
+SUB(item_respawn) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0x63f2EA";
+       MY(countabsolute) = 1;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(type) = "static";
+}
+// cloud of particles which expand rapidly and then slow to form a ball
+SUB(item_respawn) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1280;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0x63f2EA";
+       MY(count) = 128;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+DEF(jumppad_activate);
+SUB(jumppad_activate) {
+       MY(lightcolor) = '2.0 2.0 2.0';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+}
+
+DEF(laser_muzzleflash);
+// glow and light
+SUB(laser_muzzleflash) {
+       MY(airfriction) = 10;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xcc0000";
+       MY(color_max) = "0xff0000";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.0 0.1 0.1';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(sizeincrease) = -100;
+       MY(size_min) = 10;
+       MY(size_max) = 15;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+}
+// electricity
+SUB(laser_muzzleflash) {
+       MY(airfriction) = 10;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xb44215";
+       MY(color_max) = "0xff0000";
+       MY(count) = 3;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(sizeincrease) = -100;
+       MY(size_min) = 5;
+       MY(size_max) = 7;
+       MY(stretchfactor) = 2.300000;
+       MY(tex_min) = 43;
+       MY(tex_max) = 43;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+// fire
+SUB(laser_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xff4200";
+       MY(color_max) = "0xff0000";
+       MY(count) = 6;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -100;
+       MY(size_min) = 7;
+       MY(size_max) = 9;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+
+DEF(laser_impact);
+// decal
+SUB(laser_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 0.4 0.4';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 200;
+       MY(originjitter) = '14.0 14.0 14.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(laser_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xFF2010";
+       MY(color_max) = "0xFF2010";
+       MY(countabsolute) = 1;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
+SUB(laser_impact) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(count) = 128;
+       MY(liquidfriction) = 6;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+SUB(laser_impact) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(count) = 4;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 6;
+       MY(size_min) = 12;
+       MY(size_max) = 12;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '16.0 16.0 16.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+
+DEF(shotgun_muzzleflash);
+SUB(shotgun_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 1.500000;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = 12;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.050000;
+}
+SUB(shotgun_muzzleflash) {
+       MY(airfriction) = 5;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xffdb96";
+       MY(color_max) = "0xff5400";
+       MY(count) = 16;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 10;
+       MY(size_max) = 20;
+       MY(stretchfactor) = 2.500000;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+// shotgun pellet impact
+DEF(shotgun_impact);
+// decal
+SUB(shotgun_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(size_min) = 5;
+       MY(size_max) = 8;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(shotgun_impact) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 550;
+       MY(alpha_fade) = 756;
+       MY(color_min) = "0x473a37";
+       MY(color_max) = "0x0b0a07";
+       MY(count) = 1;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -50;
+       MY(spin_max) = 50;
+       MY(sizeincrease) = 25;
+       MY(size_min) = 10;
+       MY(size_max) = 20;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+// dust/smoke staying at the impact
+SUB(shotgun_impact) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 350;
+       MY(alpha_fade) = 500;
+       MY(bounce) = 6;
+       MY(color_min) = "0x201d1a";
+       MY(color_max) = "0x000000";
+       MY(count) = 0.200000;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -50;
+       MY(spin_max) = 50;
+       MY(sizeincrease) = 74;
+       MY(size_min) = 10;
+       MY(size_max) = 11;
+       MY(tex_min) = 36;
+       MY(tex_max) = 36;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 11.0';
+       MY(velocitymultiplier) = 0.030000;
+}
+// sparks
+SUB(shotgun_impact) {
+       MY(airfriction) = 1.100000;
+       MY(alpha_max) = 356;
+       MY(alpha_fade) = 268;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xFDFFD9";
+       MY(color_max) = "0xFDFFD9";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(notunderwater) = true;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.600000;
+       MY(size_max) = 0.600000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '200.0 200.0 200.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+
+DEF(uzi_muzzleflash);
+SUB(uzi_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 1;
+       MY(gravity) = -0.100000;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "static";
+       MY(velocityjitter) = '1.0 1.0 1.0';
+       MY(velocitymultiplier) = 0.030000;
+}
+SUB(uzi_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 6000;
+       MY(color_min) = "0xff9c00";
+       MY(color_max) = "0xffd200";
+       MY(count) = 3;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.300000;
+       MY(size_max) = 0.400000;
+       MY(stretchfactor) = 0.150000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '555.0 555.0 555.0';
+       MY(velocitymultiplier) = 3;
+}
+
+DEF(machinegun_impact);
+// decal
+SUB(machinegun_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '6.0 3.6 0.6';
+       MY(lightradiusfade) = 800;
+       MY(lightradius) = 80;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(machinegun_impact) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 550;
+       MY(alpha_fade) = 456;
+       MY(color_min) = "0x473a37";
+       MY(color_max) = "0x0b0a07";
+       MY(count) = 1.500000;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -50;
+       MY(spin_max) = 50;
+       MY(sizeincrease) = 15;
+       MY(size_min) = 10;
+       MY(size_max) = 20;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.100000;
+}
+// dust/smoke staying at the impact
+SUB(machinegun_impact) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 350;
+       MY(alpha_fade) = 500;
+       MY(bounce) = 6;
+       MY(color_min) = "0x201d1a";
+       MY(color_max) = "0x000000";
+       MY(count) = 0.500000;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -50;
+       MY(spin_max) = 50;
+       MY(sizeincrease) = 74;
+       MY(size_min) = 10;
+       MY(size_max) = 11;
+       MY(tex_min) = 36;
+       MY(tex_max) = 36;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 11.0';
+       MY(velocitymultiplier) = 0.030000;
+}
+// debris
+SUB(machinegun_impact) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 550;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.700000;
+       MY(color_min) = "0x63493e";
+       MY(color_max) = "0xffffff";
+       MY(count) = 1;
+       MY(gravity) = 1.400000;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -500;
+       MY(spin_max) = 500;
+       MY(size_min) = 1;
+       MY(size_max) = 5;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '350.0 350.0 350.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+// sparks
+SUB(machinegun_impact) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 168;
+       MY(bounce) = 1;
+       MY(color_min) = "0xFDFFD9";
+       MY(color_max) = "0xFDFFD9";
+       MY(count) = 1;
+       MY(gravity) = 1;
+       MY(notunderwater) = true;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.300000;
+       MY(size_max) = 0.300000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+
+DEF(grenadelauncher_muzzleflash);
+SUB(grenadelauncher_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 1.500000;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '20.0 20.0 20.0';
+       MY(velocitymultiplier) = 0.030000;
+}
+SUB(grenadelauncher_muzzleflash) {
+       MY(airfriction) = 5;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xffdb96";
+       MY(color_max) = "0xff5400";
+       MY(count) = 16;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 10;
+       MY(size_max) = 20;
+       MY(stretchfactor) = 2.500000;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+// mortar trail
+DEF(TR_GRENADE);
+// smoke
+SUB(TR_GRENADE) {
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 400;
+       MY(alpha_fade) = 780;
+       MY(bounce) = 1;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x000000";
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 3;
+       MY(size_max) = 2;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '1.0 1.0 1.0';
+       MY(velocitymultiplier) = -0.020000;
+}
+// fire
+SUB(TR_GRENADE) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 144;
+       MY(alpha_fade) = 988;
+       MY(color_min) = "0xffdf72";
+       MY(color_max) = "0x811200";
+       MY(notunderwater) = true;
+       MY(sizeincrease) = -15;
+       MY(size_min) = 5;
+       MY(size_max) = 2;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = -1;
+}
+// bubbles
+SUB(TR_GRENADE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 16;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+// hookbomb trail
+DEF(TR_KNIGHTSPIKE);
+// smoke
+SUB(TR_KNIGHTSPIKE) {
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 400;
+       MY(alpha_fade) = 600;
+       MY(bounce) = 1;
+       MY(color_min) = "0x303030";
+       MY(color_max) = "0x000000";
+       MY(gravity) = -0.110000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = 11;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 6;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '3.0 3.0 3.0';
+       MY(velocitymultiplier) = -0.020000;
+}
+// marker
+SUB(TR_KNIGHTSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 720;
+       MY(color_min) = "0x666666";
+       MY(color_max) = "0x000000";
+       MY(sizeincrease) = -0.100000;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 2;
+       MY(type) = "alphastatic";
+}
+// bubbles
+SUB(TR_KNIGHTSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 32;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+DEF(grenade_explode);
+// decal
+SUB(grenade_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 4.0 1.0';
+       MY(lightradiusfade) = 400;
+       MY(lightradius) = 250;
+       MY(originjitter) = '26.0 26.0 26.0';
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// fire effect which expands then slows
+SUB(grenade_explode) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 356;
+       MY(bounce) = 4.500000;
+       MY(color_min) = "0xe03f00";
+       MY(color_max) = "0x5e0000";
+       MY(count) = 40;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 16;
+       MY(size_max) = 26;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+// fire effect which make bright dot inside
+SUB(grenade_explode) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 228;
+       MY(alpha_max) = 328;
+       MY(alpha_fade) = 756;
+       MY(bounce) = 1;
+       MY(color_min) = "0xe03f00";
+       MY(color_max) = "0xffdf92";
+       MY(count) = 15;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 40;
+       MY(size_min) = 6;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+// smoke
+SUB(grenade_explode) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 550;
+       MY(alpha_fade) = 556;
+       MY(bounce) = 6;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 10;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 34;
+       MY(size_min) = 20;
+       MY(size_max) = 40;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+// underwater bubbles
+SUB(grenade_explode) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 6;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '196.0 196.0 196.0';
+}
+// underwatershockwave
+SUB(grenade_explode) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 300;
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1500;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(underwater) = true;
+       MY(velocitymultiplier) = 0.300000;
+}
+// bouncing sparks
+SUB(grenade_explode) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 484;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xffa35b";
+       MY(color_max) = "0xfff2be";
+       MY(count) = 16;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 1;
+       MY(size_max) = 0.100000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '424.0 424.0 624.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+// debris
+SUB(grenade_explode) {
+       MY(airfriction) = 0.500000;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 684;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0x6a3d25";
+       MY(color_max) = "0xcac5b4";
+       MY(count) = 12;
+       MY(gravity) = 1.300000;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -1000;
+       MY(spin_max) = 1000;
+       MY(size_min) = 2;
+       MY(size_max) = 6;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '324.0 324.0 524.0';
+}
+
+DEF(electro_muzzleflash);
+SUB(electro_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x283880";
+       MY(color_max) = "0x283880";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 15;
+       MY(size_max) = 15;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(electro_muzzleflash) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 2024;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 7;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 5;
+       MY(size_max) = 15;
+       MY(stretchfactor) = 1.500000;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+SUB(electro_muzzleflash) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 5;
+       MY(gravity) = 1.300000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 7;
+       MY(size_max) = 6;
+       MY(stretchfactor) = 0.100000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '350.0 350.0 350.0';
+       MY(velocitymultiplier) = 2.500000;
+}
+
+// electro trail
+DEF(TR_NEXUIZPLASMA);
+// glowing vapor trail
+SUB(TR_NEXUIZPLASMA) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 968;
+       MY(color_min) = "0x283880";
+       MY(color_max) = "0x283880";
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradius) = 90;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(trailspacing) = 2;
+       MY(type) = "static";
+       MY(velocitymultiplier) = -0.100000;
+}
+// bright sparks
+SUB(TR_NEXUIZPLASMA) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 1866;
+       MY(bounce) = 1;
+       MY(color_min) = "0x629dff";
+       MY(color_max) = "0x0018ff";
+       MY(count) = 1.500000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = -20;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_min) = 42;
+       MY(tex_max) = 42;
+       MY(trailspacing) = 12;
+       MY(type) = "snow";
+       MY(velocityjitter) = '50.0 50.0 50.0';
+       MY(velocityoffset) = '0.0 0.0 15.0';
+}
+
+DEF(electro_impact);
+// decal
+SUB(electro_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.1 4.4 10.0';
+       MY(lightradiusfade) = 250;
+       MY(lightradius) = 250;
+       MY(originjitter) = '17.0 17.0 17.0';
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// shockwave
+SUB(electro_impact) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1000;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 44;
+}
+// flare effect
+SUB(electro_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 12;
+       MY(size_max) = 32;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// cloud of bouncing sparks
+SUB(electro_impact) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0x629dff";
+       MY(color_max) = "0x0018ff";
+       MY(count) = 30;
+       MY(gravity) = -0.300000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -9999;
+       MY(spin_max) = 9999;
+       MY(sizeincrease) = -50;
+       MY(size_min) = 36;
+       MY(size_max) = 36;
+       MY(tex_min) = 42;
+       MY(tex_max) = 42;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// inner cloud of smoke
+SUB(electro_impact) {
+       MY(airfriction) = 30;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x629dff";
+       MY(color_max) = "0x0018ff";
+       MY(count) = 30;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(sizeincrease) = 50;
+       MY(size_min) = 20;
+       MY(size_max) = 24;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '320.0 320.0 320.0';
+}
+
+DEF(electro_ballexplode);
+// decal
+SUB(electro_ballexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.1 4.4 10.0';
+       MY(lightradiusfade) = 250;
+       MY(lightradius) = 250;
+       MY(originjitter) = '17.0 17.0 17.0';
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(electro_ballexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// cloud of bouncing sparks
+SUB(electro_ballexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0xFDFFD9";
+       MY(color_max) = "0xFDFFD9";
+       MY(count) = 64;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(stretchfactor) = 0.400000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// inner cloud of smoke
+SUB(electro_ballexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 8;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+
+DEF(electro_combo);
+// decal
+SUB(electro_combo) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 5.0 6.0';
+       MY(lightradiusfade) = 300;
+       MY(lightradius) = 400;
+       MY(originjitter) = '17.0 17.0 17.0';
+       MY(size_min) = 64;
+       MY(size_max) = 64;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(electro_combo) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// large sparks
+SUB(electro_combo) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 156;
+       MY(alpha_fade) = 156;
+       MY(bounce) = 2;
+       MY(color_min) = "0x2030FF";
+       MY(color_max) = "0x80C0FF";
+       MY(count) = 5;
+       MY(liquidfriction) = 16;
+       MY(sizeincrease) = 50;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_max) = 7;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+SUB(electro_combo) {
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 700;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xa9cacf";
+       MY(color_max) = "0x0054ff";
+       MY(count) = 32;
+       MY(gravity) = 0.300000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '312.0 312.0 312.0';
+       MY(velocitymultiplier) = 3;
+}
+// inner cloud of smoke
+SUB(electro_combo) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 0.125000;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+// shockwave
+SUB(electro_combo) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 100;
+       MY(color_min) = "0xa9cacf";
+       MY(color_max) = "0x0054ff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 600;
+       MY(size_min) = 30;
+       MY(size_max) = 30;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 0.300000;
+}
+
+DEF(crylink_muzzleflash);
+SUB(crylink_muzzleflash) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 2024;
+       MY(color_min) = "0xdd9cff";
+       MY(color_max) = "0xff0090";
+       MY(count) = 0.500000;
+       MY(lightcolor) = '1.6 0.2 2.0';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(size_min) = 15;
+       MY(size_max) = 20;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(crylink_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xA080C0";
+       MY(color_max) = "0xA080C0";
+       MY(count) = 5;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(stretchfactor) = 1.500000;
+       MY(tex_min) = 35;
+       MY(tex_max) = 36;
+       MY(type) = "spark";
+       MY(velocityjitter) = '200.0 200.0 200.0';
+       MY(velocitymultiplier) = 0.300000;
+}
+
+DEF(crylink_impact);
+// decal
+SUB(crylink_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '12.0 12.0 12.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// purple flare effect
+SUB(crylink_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x504060";
+       MY(color_max) = "0x504060";
+       MY(countabsolute) = 1;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// purple sparks
+SUB(crylink_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0xA040C0";
+       MY(color_max) = "0xA040C0";
+       MY(count) = 40;
+       MY(size_min) = 6;
+       MY(size_max) = 6;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// purple splash
+SUB(crylink_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 1.500000;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+// purple splash
+SUB(crylink_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 3;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+DEF(nex_muzzleflash);
+SUB(nex_muzzleflash) {
+       MY(airfriction) = 9;
+       MY(alpha_min) = 328;
+       MY(alpha_max) = 328;
+       MY(alpha_fade) = 4000;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x0072ff";
+       MY(count) = 12;
+       MY(lightcolor) = '2.0 2.5 3.0';
+       MY(lightradiusfade) = 200;
+       MY(lightradius) = 200;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = -100;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '180.0 180.0 180.0';
+       MY(velocitymultiplier) = 1.400000;
+}
+SUB(nex_muzzleflash) {
+       MY(airfriction) = 9;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 50;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '600.0 600.0 600.0';
+       MY(velocitymultiplier) = 1.500000;
+}
+
+// vortex beam
+DEF(nex_beam);
+SUB(nex_beam) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x1680A0";
+       MY(color_max) = "0x1680A0";
+       MY(sizeincrease) = 2;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_min) = 32;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 64;
+       MY(type) = "static";
+}
+// drifting smoke
+SUB(nex_beam) {
+       MY(airfriction) = 9;
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 32;
+       MY(color_min) = "0x5080A0";
+       MY(color_max) = "0x5080A0";
+       MY(sizeincrease) = 8;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 12;
+       MY(type) = "static";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+}
+// bright core
+SUB(nex_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1280;
+       MY(color_min) = "0x80CDFF";
+       MY(color_max) = "0x80CDFF";
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(trailspacing) = 12;
+       MY(type) = "static";
+}
+// sparks
+SUB(nex_beam) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 80;
+       MY(color_min) = "0x1680A0";
+       MY(color_max) = "0x1680A0";
+       MY(gravity) = -0.010000;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 63;
+       MY(tex_max) = 63;
+       MY(trailspacing) = 16;
+       MY(type) = "snow";
+}
+
+DEF(nex_impact);
+// decal
+SUB(nex_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 6.0 8.0';
+       MY(lightradiusfade) = 250;
+       MY(lightradius) = 200;
+       MY(originjitter) = '14.0 14.0 14.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// rotating something
+SUB(nex_impact) {
+       MY(alpha_min) = 55;
+       MY(alpha_max) = 55;
+       MY(alpha_fade) = 50;
+       MY(color_min) = "0x1680A0";
+       MY(color_max) = "0x1680A0";
+       MY(count) = 5;
+       MY(startangle_min) = 180;
+       MY(startangle_max) = -180;
+       MY(spin_min) = 500;
+       MY(spin_max) = -500;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 25;
+       MY(size_max) = 28;
+       MY(tex_min) = 46;
+       MY(tex_max) = 46;
+       MY(type) = "smoke";
+}
+// shockwave
+SUB(nex_impact) {
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 50;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x1680A0";
+       MY(color_max) = "0x1680A0";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 900;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "static";
+}
+// shockwave2
+SUB(nex_impact) {
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 50;
+       MY(alpha_fade) = 100;
+       MY(color_min) = "0x1680A0";
+       MY(color_max) = "0x1680A0";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 500;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "static";
+}
+// flare effect
+SUB(nex_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(tex_min) = 37;
+       MY(tex_max) = 37;
+       MY(type) = "static";
+}
+// small sparks which glow brightly but live briefly
+SUB(nex_impact) {
+       MY(airfriction) = 9;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 512;
+       MY(bounce) = 2;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 64;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(stretchfactor) = 3;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '600.0 600.0 600.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+// small sparks that live longer
+SUB(nex_impact) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 112;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 16;
+       MY(gravity) = 1;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(stretchfactor) = 0.700000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 600.0';
+       MY(velocitymultiplier) = 2.500000;
+}
+
+DEF(hagar_muzzleflash);
+SUB(hagar_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 2;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(hagar_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xff8400";
+       MY(color_max) = "0xff4200";
+       MY(count) = 15;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -400;
+       MY(spin_max) = 400;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '200.0 200.0 200.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(hagar_bounce);
+SUB(hagar_bounce) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 2;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 300;
+       MY(lightradius) = 60;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(hagar_bounce) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 15;
+       MY(gravity) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '600.0 600.0 600.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(hagar_explode);
+// decal
+SUB(hagar_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 4.0 1.0';
+       MY(lightradiusfade) = 400;
+       MY(lightradius) = 120;
+       MY(originjitter) = '14.0 14.0 14.0';
+       MY(size_min) = 28;
+       MY(size_max) = 38;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// fire effect which make bright dot inside
+SUB(hagar_explode) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 80;
+       MY(alpha_max) = 200;
+       MY(alpha_fade) = 356;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xffe955";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3.500000;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 16;
+       MY(size_max) = 26;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '156.0 156.0 156.0';
+}
+// fire effect which expands then slows
+SUB(hagar_explode) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 456;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 12;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 15;
+       MY(size_min) = 20;
+       MY(size_max) = 26;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '286.0 286.0 286.0';
+}
+// smoke
+SUB(hagar_explode) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 500;
+       MY(alpha_fade) = 600;
+       MY(bounce) = 2;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 7;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 20;
+       MY(size_max) = 40;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '244.0 244.0 244.0';
+}
+// underwater bubbles
+SUB(hagar_explode) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 16;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '96.0 96.0 96.0';
+}
+// bouncing sparks
+SUB(hagar_explode) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 684;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xffa35b";
+       MY(color_max) = "0xfff2be";
+       MY(count) = 4;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 1;
+       MY(size_max) = 0.100000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '224.0 224.0 224.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+DEF(rocketlauncher_muzzleflash);
+SUB(rocketlauncher_muzzleflash) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 10;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 40.0';
+       MY(velocitymultiplier) = -0.130000;
+}
+SUB(rocketlauncher_muzzleflash) {
+       MY(airfriction) = 9;
+       MY(alpha_min) = 10;
+       MY(alpha_max) = 25;
+       MY(alpha_fade) = 20;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 6;
+       MY(originjitter) = '3.0 3.0 3.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_min) = 35;
+       MY(tex_max) = 36;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.300000;
+}
+
+// rocket trail
+DEF(TR_ROCKET);
+// smoke
+SUB(TR_ROCKET) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 300;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x666666";
+       MY(lightcolor) = '6.0 3.0 1.0';
+       MY(lightradius) = 150;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 11;
+       MY(size_min) = 3;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 10;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '3.0 3.0 3.0';
+       MY(velocitymultiplier) = -0.020000;
+}
+// fire
+SUB(TR_ROCKET) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 144;
+       MY(alpha_fade) = 588;
+       MY(color_min) = "0xffdf72";
+       MY(color_max) = "0x811200";
+       MY(sizeincrease) = -30;
+       MY(size_min) = 7;
+       MY(size_max) = 7;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = -1.500000;
+}
+// bubbles
+SUB(TR_ROCKET) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 16;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+       MY(velocitymultiplier) = -0.310000;
+}
+// sparks
+SUB(TR_ROCKET) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 1866;
+       MY(bounce) = 1;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(notunderwater) = true;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.500000;
+       MY(size_max) = 0.500000;
+       MY(stretchfactor) = 0.300000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(trailspacing) = 20;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = -0.310000;
+}
+
+// rocket explosion (bigger than mortar and hagar)
+DEF(rocket_explode);
+SUB(rocket_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 4.0 1.0';
+       MY(lightradiusfade) = 750;
+       MY(lightradius) = 400;
+       MY(originjitter) = '23.0 23.0 23.0';
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// fire effect
+SUB(rocket_explode) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 32;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 45;
+       MY(size_min) = 33;
+       MY(size_max) = 44;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// fire effect 2
+SUB(rocket_explode) {
+       MY(airfriction) = 19;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 612;
+       MY(bounce) = 2.500000;
+       MY(color_min) = "0xea691b";
+       MY(color_max) = "0xeed05a";
+       MY(count) = 14;
+       MY(liquidfriction) = 19;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 55;
+       MY(size_min) = 33;
+       MY(size_max) = 44;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '912.0 912.0 912.0';
+}
+// smoke
+SUB(rocket_explode) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 450;
+       MY(alpha_fade) = 456;
+       MY(bounce) = 2;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 32;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 44;
+       MY(size_min) = 20;
+       MY(size_max) = 40;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '444.0 444.0 444.0';
+}
+// underwater bubbles
+SUB(rocket_explode) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// underwatershockwave
+SUB(rocket_explode) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 300;
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1900;
+       MY(size_min) = 30;
+       MY(size_max) = 30;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(underwater) = true;
+       MY(velocitymultiplier) = 0.300000;
+}
+// bouncing sparks
+SUB(rocket_explode) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 484;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xffa35b";
+       MY(color_max) = "0xfff2be";
+       MY(count) = 16;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 1;
+       MY(size_max) = 0.100000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '424.0 424.0 624.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+// debris
+SUB(rocket_explode) {
+       MY(airfriction) = 0.500000;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 684;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0x6a3d25";
+       MY(color_max) = "0xcac5b4";
+       MY(count) = 12;
+       MY(gravity) = 1.300000;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -1000;
+       MY(spin_max) = 1000;
+       MY(size_min) = 2;
+       MY(size_max) = 6;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '324.0 324.0 524.0';
+}
+
+DEF(grapple_muzzleflash);
+SUB(grapple_muzzleflash) {
+       MY(lightcolor) = '1.0 0.0 0.0';
+       MY(lightradiusfade) = 800;
+       MY(lightradius) = 160;
+}
+
+DEF(grapple_impact);
+SUB(grapple_impact) {
+       MY(lightcolor) = '1.0 0.0 0.0';
+       MY(lightradiusfade) = 800;
+       MY(lightradius) = 160;
+}
+
+DEF(nex242_misc_laser_beam);
+SUB(nex242_misc_laser_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xff0000";
+       MY(color_max) = "0xff0000";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_beam_end);
+SUB(nex242_misc_laser_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_beam_fast);
+SUB(nex242_misc_laser_beam_fast) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 640;
+       MY(color_min) = "0xff0000";
+       MY(color_max) = "0xff0000";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 0.100000;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_beam_fast_end);
+SUB(nex242_misc_laser_beam_fast_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_green_beam);
+SUB(nex242_misc_laser_green_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x00ff00";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_green_beam_end);
+SUB(nex242_misc_laser_green_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_blue_beam);
+SUB(nex242_misc_laser_blue_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x0000ff";
+       MY(color_max) = "0x0000ff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_blue_beam_end);
+SUB(nex242_misc_laser_blue_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_yellow_beam);
+SUB(nex242_misc_laser_yellow_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xffff00";
+       MY(color_max) = "0xffff00";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_yellow_beam_end);
+SUB(nex242_misc_laser_yellow_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_cyan_beam);
+SUB(nex242_misc_laser_cyan_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x00ffff";
+       MY(color_max) = "0x00ffff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_cyan_beam_end);
+SUB(nex242_misc_laser_cyan_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_magenta_beam);
+SUB(nex242_misc_laser_magenta_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xff00ff";
+       MY(color_max) = "0xff00ff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_magenta_beam_end);
+SUB(nex242_misc_laser_magenta_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_white_beam);
+SUB(nex242_misc_laser_white_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xffffff";
+       MY(color_max) = "0xffffff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_white_beam_end);
+SUB(nex242_misc_laser_white_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_black_beam);
+SUB(nex242_misc_laser_black_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x000000";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_black_beam_end);
+SUB(nex242_misc_laser_black_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(nex242_misc_laser_orange_beam);
+SUB(nex242_misc_laser_orange_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xff6600";
+       MY(color_max) = "0xff6600";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 200;
+       MY(tex_max) = 200;
+       MY(type) = "beam";
+}
+
+DEF(nex242_misc_laser_orange_beam_end);
+SUB(nex242_misc_laser_orange_beam_end) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = -1;
+       MY(color_min) = "0x8f4333";
+       MY(color_max) = "0xfff31b";
+       MY(count) = 0.500000;
+       MY(gravity) = 1;
+       MY(size_min) = 0.400000;
+       MY(size_max) = 0.400000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 100;
+}
+
+// bigger crylink impact effect
+DEF(crylink_impactbig);
+// decal
+SUB(crylink_impactbig) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '12.0 12.0 12.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// purple flare effect
+SUB(crylink_impactbig) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x504060";
+       MY(color_max) = "0x504060";
+       MY(countabsolute) = 1;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// purple sparks
+SUB(crylink_impactbig) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0xA040C0";
+       MY(color_max) = "0xA040C0";
+       MY(count) = 40;
+       MY(size_min) = 6;
+       MY(size_max) = 6;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// purple splash
+SUB(crylink_impactbig) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 1.500000;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+// purple splash
+SUB(crylink_impactbig) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 3;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+#include "effectinfo_gentle.inc"
+
+DEF(laser_deadly);
+// decal
+SUB(laser_deadly) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 56;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// dust/smoke drifting away from the impact
+SUB(laser_deadly) {
+       MY(airfriction) = 7;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xFFFFFF";
+       MY(color_max) = "0xFFFFFF";
+       MY(count) = 0.025000;
+       MY(liquidfriction) = 16;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 2;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '15.0 15.0 15.0';
+       MY(velocitymultiplier) = 20;
+}
+// sparks
+SUB(laser_deadly) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 768;
+       MY(bounce) = 1;
+       MY(color_min) = "0xFDFFD9";
+       MY(color_max) = "0xFDFFD9";
+       MY(count) = 0.025000;
+       MY(gravity) = 1;
+       MY(notunderwater) = true;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.600000;
+       MY(size_max) = 0.600000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 100;
+}
+
+DEF(torch_small);
+// fire
+SUB(torch_small) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 8;
+       MY(gravity) = -0.500000;
+       MY(originjitter) = '5.0 5.0 5.0';
+       MY(sizeincrease) = -1;
+       MY(size_min) = 1;
+       MY(size_max) = 11;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '1.0 1.0 50.0';
+}
+// smoke
+SUB(torch_small) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 4;
+       MY(gravity) = -0.300000;
+       MY(originjitter) = '3.0 3.0 3.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+DEF(fountain01);
+SUB(fountain01) {
+       MY(alpha_max) = 100;
+       MY(alpha_fade) = 100;
+       MY(bounce) = 1;
+       MY(color_min) = "0x7cbaff";
+       MY(color_max) = "0xcfd1ff";
+       MY(count) = 16;
+       MY(gravity) = 0.600000;
+       MY(originjitter) = '5.0 5.0 5.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 10;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(type) = "snow";
+       MY(velocityjitter) = '81.0 81.0 150.0';
+       MY(velocitymultiplier) = 2;
+}
+
+DEF(hookbomb_explode);
+// decal
+SUB(hookbomb_explode) {
+       MY(airfriction) = 10;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(count) = 25;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = -160;
+       MY(size_min) = 150;
+       MY(size_max) = 200;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+       MY(velocityjitter) = '550.0 550.0 550.0';
+}
+// decal in the air
+SUB(hookbomb_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 265;
+       MY(alpha_fade) = 100;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(countabsolute) = 3;
+       MY(originoffset) = '0.0 0.0 6.0';
+       MY(sizeincrease) = -60;
+       MY(size_min) = 160;
+       MY(size_max) = 200;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+}
+// decal on the ground
+SUB(hookbomb_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 80;
+       MY(size_max) = 100;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "decal";
+}
+// some sparks
+SUB(hookbomb_explode) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 456;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(count) = 30;
+       MY(gravity) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = -60;
+       MY(size_min) = 20;
+       MY(size_max) = 30;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "spark";
+       MY(velocityjitter) = '1900.0 1900.0 1300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(EF_MGTURRETTRAIL);
+// smoke
+SUB(EF_MGTURRETTRAIL) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 196;
+       MY(alpha_fade) = 768;
+       MY(color_min) = "0xd0d0a0";
+       MY(color_max) = "0xffffff";
+       MY(gravity) = -0.010000;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = -8;
+       MY(size_min) = 5;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 10;
+       MY(type) = "smoke";
+}
+// bubbles
+SUB(EF_MGTURRETTRAIL) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 32;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+DEF(fire_big);
+// fire
+SUB(fire_big) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 356;
+       MY(alpha_fade) = 512;
+       MY(bounce) = 2;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 26;
+       MY(gravity) = -0.500000;
+       MY(originjitter) = '33.0 33.0 33.0';
+       MY(sizeincrease) = -3;
+       MY(size_min) = 11;
+       MY(size_max) = 31;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(fire_big) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 2;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 11;
+       MY(gravity) = -0.300000;
+       MY(originjitter) = '44.0 44.0 44.0';
+       MY(sizeincrease) = 11;
+       MY(size_min) = 22;
+       MY(size_max) = 33;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+#define flare(name, colormin, colormax) \
+       DEF(name##_flare); \
+       SUB(name##_flare) /* smoke */ { \
+               MY(alpha_min) = 200; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 160; \
+               MY(bounce) = 1; \
+               MY(color_min) = colormin; \
+               MY(color_max) = colormax; \
+               MY(count) = 10.500000; \
+               MY(gravity) = -0.240000; \
+               MY(originjitter) = '2.0 2.0 0.0'; \
+               MY(sizeincrease) = 11; \
+               MY(size_min) = 1; \
+               MY(size_max) = 11; \
+               MY(tex_max) = 8; \
+               MY(type) = "alphastatic"; \
+               MY(velocityjitter) = '15.0 15.0 30.0'; \
+       }
+
+flare(red,     "0xff0000", "0xdc7171")
+flare(blue, "0x0000ff", "0x7194dc")
+#undef flare
+
+DEF(smoke_ring);
+// smoke
+SUB(smoke_ring) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 156;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.100000;
+       MY(color_min) = "0x111111";
+       MY(color_max) = "0x979797";
+       MY(count) = 45;
+       MY(gravity) = 0.100000;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 21;
+       MY(size_min) = 1;
+       MY(size_max) = 11;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '190.0 190.0 50.0';
+}
+
+DEF(smoke_large);
+// smoke
+SUB(smoke_large) {
+       MY(airfriction) = 7;
+       MY(alpha_min) = 140;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 190;
+       MY(bounce) = 1.100000;
+       MY(color_min) = "0x9e895f";
+       MY(color_max) = "0xffd39b";
+       MY(count) = 25;
+       MY(gravity) = -0.150000;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 21;
+       MY(size_min) = 11;
+       MY(size_max) = 21;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '390.0 390.0 390.0';
+}
+
+DEF(sparks);
+SUB(sparks) {
+       MY(airfriction) = 3;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 15;
+       MY(gravity) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 200.0';
+       MY(velocitymultiplier) = 1.500000;
+}
+
+DEF(electricity_sparks);
+SUB(electricity_sparks) {
+       MY(airfriction) = 3;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 556;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x807aff";
+       MY(color_max) = "0x4463d5";
+       MY(count) = 35;
+       MY(gravity) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(steam);
+SUB(steam) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 140;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 190;
+       MY(bounce) = 1.100000;
+       MY(color_min) = "0xfffbdf";
+       MY(color_max) = "0xffffff";
+       MY(count) = 1;
+       MY(gravity) = -0.250000;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 7;
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '19.0 19.0 19.0';
+       MY(velocitymultiplier) = 14;
+}
+
+DEF(smoking);
+SUB(smoking) {
+       MY(airfriction) = -1;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 100;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x292929";
+       MY(color_max) = "0x000000";
+       MY(count) = 10;
+       MY(gravity) = -0.100000;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 10;
+       MY(size_max) = 40;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '5.0 5.0 20.0';
+}
+
+// golden dust (create it once per second to cover large area in small yellow particles)
+DEF(goldendust);
+SUB(goldendust) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 70;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xff9600";
+       MY(color_max) = "0xffefb8";
+       MY(count) = 25;
+       MY(originjitter) = '500.0 500.0 500.0';
+       MY(sizeincrease) = -0.300000;
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "snow";
+       MY(velocityjitter) = '0.1 0.1 0.1';
+}
+
+DEF(healing_fx);
+SUB(healing_fx) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 170;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xff0000";
+       MY(color_max) = "0xff0000";
+       MY(count) = 25;
+       MY(gravity) = -0.100000;
+       MY(originjitter) = '5.0 5.0 100.0';
+       MY(sizeincrease) = -0.050000;
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '50.0 50.0 0.0';
+}
+
+DEF(armorrepair_fx);
+SUB(armorrepair_fx) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 170;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x00ff00";
+       MY(count) = 25;
+       MY(gravity) = -0.100000;
+       MY(originjitter) = '5.0 5.0 50.0';
+       MY(sizeincrease) = -0.050000;
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '50.0 50.0 0.0';
+}
+
+DEF(ammoregen_fx);
+SUB(ammoregen_fx) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 170;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x0000ff";
+       MY(color_max) = "0x0000ff";
+       MY(count) = 25;
+       MY(gravity) = -0.100000;
+       MY(originjitter) = '5.0 5.0 50.0';
+       MY(sizeincrease) = -0.050000;
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '50.0 50.0 0.0';
+}
+
+// red-yellow flame like fx
+DEF(rage);
+SUB(rage) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 190;
+       MY(color_min) = "0xff0000";
+       MY(color_max) = "0xff7800";
+       MY(count) = 2.500000;
+       MY(gravity) = -0.060000;
+       MY(originjitter) = '5.0 5.0 5.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 35;
+       MY(tex_max) = 36;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '25.0 25.0 25.0';
+}
+
+// pieces of glass or ice falling on the floor
+DEF(iceorglass);
+SUB(iceorglass) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(bounce) = 2;
+       MY(color_min) = "0xffffff";
+       MY(color_max) = "0xb2d3e6";
+       MY(count) = 15;
+       MY(gravity) = 1.300000;
+       MY(originjitter) = '30.0 30.0 30.0';
+       MY(size_min) = 3;
+       MY(size_max) = 7;
+       MY(tex_min) = 44;
+       MY(tex_max) = 44;
+       MY(time_min) = 1;
+       MY(time_max) = 3;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+}
+
+// cover small area in poison gas, spawn it once per second
+DEF(poisonfield);
+SUB(poisonfield) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 50;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x7db843";
+       MY(count) = 15;
+       MY(gravity) = -0.010000;
+       MY(originjitter) = '333.0 333.0 50.0';
+       MY(sizeincrease) = 30;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '5.0 5.0 5.0';
+}
+
+// cover small area in icy mist, spawn it once per second
+DEF(icefield);
+SUB(icefield) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 50;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x008aff";
+       MY(color_max) = "0x75e7ff";
+       MY(count) = 10;
+       MY(gravity) = -0.010000;
+       MY(originjitter) = '333.0 333.0 0.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '5.0 5.0 30.0';
+}
+SUB(icefield) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 50;
+       MY(color_min) = "0x008aff";
+       MY(color_max) = "0x75e7ff";
+       MY(count) = 5;
+       MY(gravity) = -0.001000;
+       MY(originjitter) = '333.0 333.0 0.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+}
+
+// cover very small area in flames, spawn it 3 times per second (or more often to get better looking fire at cost of fps hit )
+DEF(firefield);
+// flames that go up
+SUB(firefield) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 100;
+       MY(gravity) = -0.060000;
+       MY(originjitter) = '180.0 180.0 0.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '5.0 5.0 30.0';
+}
+// flames that stay on the ground
+SUB(firefield) {
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 50;
+       MY(originjitter) = '180.0 180.0 0.0';
+       MY(sizeincrease) = 40;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+}
+// smoke
+SUB(firefield) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 70;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 20;
+       MY(gravity) = -0.020000;
+       MY(originjitter) = '180.0 180.0 0.0';
+       MY(sizeincrease) = 7;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// flamethrower, spawn it as fast as you can  20 times per second or more, it needs direction
+DEF(flamethrower);
+// fast fire
+SUB(flamethrower) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 250;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 11.0';
+       MY(velocitymultiplier) = 30;
+}
+// slow fire
+SUB(flamethrower) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 2.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 40.0';
+       MY(velocitymultiplier) = 20;
+}
+// very slow and small fire
+SUB(flamethrower) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 1.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '30.0 30.0 30.0';
+       MY(velocitymultiplier) = 10;
+}
+// decreasing fire
+SUB(flamethrower) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 2;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = -10;
+       MY(size_min) = 20;
+       MY(size_max) = 30;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+       MY(velocitymultiplier) = 15;
+}
+// smoke
+SUB(flamethrower) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 90;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 0.500000;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = 7;
+       MY(size_min) = 5;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocitymultiplier) = 20;
+       MY(velocityoffset) = '0.0 0.0 10.0';
+}
+
+// port-o-launch trail
+DEF(TR_WIZSPIKE);
+// glowing vapor trail
+SUB(TR_WIZSPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 968;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x404040";
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradius) = 90;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocitymultiplier) = -0.100000;
+}
+// bright sparks
+SUB(TR_WIZSPIKE) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 1866;
+       MY(bounce) = 1;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x404040";
+       MY(count) = 1.500000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = -20;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_min) = 42;
+       MY(tex_max) = 42;
+       MY(trailspacing) = 12;
+       MY(type) = "snow";
+       MY(velocityjitter) = '50.0 50.0 50.0';
+       MY(velocityoffset) = '0.0 0.0 15.0';
+}
+
+// TAG trail
+DEF(TR_VORESPIKE);
+// glowing vapor trail
+SUB(TR_VORESPIKE) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 968;
+       MY(color_min) = "0x804000";
+       MY(color_max) = "0x804000";
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradius) = 90;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocitymultiplier) = -0.100000;
+}
+// bright sparks
+SUB(TR_VORESPIKE) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 1866;
+       MY(bounce) = 1;
+       MY(color_min) = "0xff8000";
+       MY(color_max) = "0xff8000";
+       MY(count) = 1.500000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = -20;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_min) = 42;
+       MY(tex_max) = 42;
+       MY(trailspacing) = 12;
+       MY(type) = "snow";
+       MY(velocityjitter) = '50.0 50.0 50.0';
+       MY(velocityoffset) = '0.0 0.0 15.0';
+}
+
+DEF(flac_explode);
+SUB(flac_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 4.0 1.0';
+       MY(lightradiusfade) = 400;
+       MY(lightradius) = 150;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(size_min) = 18;
+       MY(size_max) = 28;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// fire effect which make bright dot inside
+SUB(flac_explode) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 456;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xffe955";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 6;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '156.0 156.0 156.0';
+}
+// fire effect which expands then slows
+SUB(flac_explode) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 456;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 6;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = 15;
+       MY(size_min) = 10;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+// smoke
+SUB(flac_explode) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 500;
+       MY(alpha_max) = 600;
+       MY(alpha_fade) = 556;
+       MY(bounce) = 2;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 5;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 10;
+       MY(size_max) = 20;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '244.0 244.0 244.0';
+}
+// underwater bubbles
+SUB(flac_explode) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 8;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '96.0 96.0 96.0';
+}
+// bouncing sparks
+SUB(flac_explode) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 4;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+// bullet trail (somewhat like a tracer)
+DEF(tr_bullet);
+SUB(tr_bullet) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 2560;
+       MY(color_min) = "0xff8960";
+       MY(color_max) = "0xff8533";
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(stretchfactor) = 0.200000;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(trailspacing) = 750;
+       MY(type) = "spark";
+       MY(velocitymultiplier) = 3;
+}
+
+// smoke emitter for small pipes
+DEF(smoking_smallemitter);
+SUB(smoking_smallemitter) {
+       MY(airfriction) = -1;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 100;
+       MY(color_min) = "0x292929";
+       MY(color_max) = "0x000000";
+       MY(count) = 10;
+       MY(gravity) = -0.100000;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 6;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '5.0 5.0 20.0';
+}
+
+// crylink trail
+DEF(TR_CRYLINKPLASMA);
+// plasma smoke
+SUB(TR_CRYLINKPLASMA) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x5522aa";
+       MY(color_max) = "0x6622ff";
+       MY(sizeincrease) = 8;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 32;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 128;
+       MY(type) = "static";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+       MY(velocitymultiplier) = -0.010000;
+}
+// crylink main trail
+SUB(TR_CRYLINKPLASMA) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 2600;
+       MY(color_min) = "0x5522aa";
+       MY(color_max) = "0x6622ff";
+       MY(sizeincrease) = 15;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 3;
+       MY(tex_max) = 3;
+       MY(trailspacing) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '2.0 2.0 2.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+
+DEF(cherryblossom);
+SUB(cherryblossom) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 32;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xb123ff";
+       MY(color_max) = "0xb183ff";
+       MY(count) = 1.500000;
+       MY(gravity) = 0.050000;
+       MY(liquidfriction) = 1;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 1.500000;
+       MY(size_max) = 2;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 0.0';
+}
+
+DEF(alien_blood);
+SUB(alien_blood) {
+       MY(airfriction) = 0.400000;
+       MY(alpha_min) = 1560;
+       MY(alpha_max) = 2560;
+       MY(alpha_fade) = 7000;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xDC9BCD";
+       MY(color_max) = "0xDC9BCD";
+       MY(count) = 0.400000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 11;
+       MY(staincolor_min) = "0xDC9BCD";
+       MY(staincolor_max) = "0xDC9BCD";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 25;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "spark";
+       MY(velocityjitter) = '99.0 99.0 55.0';
+}
+// blood mist
+SUB(alien_blood) {
+       MY(alpha_min) = 3000;
+       MY(alpha_max) = 5560;
+       MY(alpha_fade) = 12000;
+       MY(blend) = "invmod";
+       MY(color_min) = "0xDC9BCD";
+       MY(color_max) = "0xDC9BCD";
+       MY(countabsolute) = 1;
+       MY(originjitter) = '11.0 11.0 11.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 25;
+       MY(size_max) = 30;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "smoke";
+}
+
+DEF(robot_blood);
+SUB(robot_blood) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xff3000";
+       MY(color_max) = "0xff7373";
+       MY(count) = 0.167000;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(type) = "spark";
+       MY(velocityjitter) = '264.0 264.0 264.0';
+       MY(velocityoffset) = '0.0 0.0 100.0';
+}
+// shockwave
+SUB(robot_blood) {
+       MY(alpha_max) = 90;
+       MY(alpha_fade) = 1000;
+       MY(color_min) = "0xff8400";
+       MY(color_max) = "0xffbb72";
+       MY(countabsolute) = 1;
+       MY(originjitter) = '11.0 11.0 11.0';
+       MY(sizeincrease) = 800;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 74;
+       MY(tex_max) = 74;
+       MY(type) = "smoke";
+}
+// electo sparks
+SUB(robot_blood) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 5120;
+       MY(color_min) = "0xff3000";
+       MY(color_max) = "0xff8585";
+       MY(count) = 0.100000;
+       MY(originjitter) = '41.0 41.0 21.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(size_min) = 20;
+       MY(size_max) = 40;
+       MY(tex_min) = 71;
+       MY(tex_max) = 73;
+       MY(type) = "smoke";
+}
+
+DEF(alien_TR_BLOOD);
+SUB(alien_TR_BLOOD) {
+       MY(airfriction) = -2;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 984;
+       MY(alpha_fade) = 1492;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xC080B0";
+       MY(color_max) = "0xC080B0";
+       MY(gravity) = 0.400000;
+       MY(liquidfriction) = 1;
+       MY(sizeincrease) = -5;
+       MY(size_min) = 4;
+       MY(size_max) = 19;
+       MY(staincolor_min) = "0xC080B0";
+       MY(staincolor_max) = "0xC080B0";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 7;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 20;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = -0.100000;
+}
+
+// splash around gib
+SUB(alien_TR_BLOOD) {
+       MY(alpha_min) = 684;
+       MY(alpha_max) = 684;
+       MY(alpha_fade) = 7492;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFF";
+       MY(sizeincrease) = 500;
+       MY(size_min) = 4;
+       MY(size_max) = 6;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 42;
+       MY(type) = "blood";
+}
+
+DEF(robot_TR_BLOOD);
+SUB(robot_TR_BLOOD) {
+       MY(airfriction) = -2;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 984;
+       MY(alpha_fade) = 1892;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(gravity) = 0.400000;
+       MY(liquidfriction) = 1;
+       MY(sizeincrease) = -6;
+       MY(size_min) = 4;
+       MY(size_max) = 13;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 3;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 6;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 16;
+       MY(type) = "spark";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = -0.300000;
+}
+// fire
+SUB(robot_TR_BLOOD) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 900;
+       MY(color_min) = "0x902010";
+       MY(color_max) = "0xff3600";
+       MY(gravity) = -1;
+       MY(liquidfriction) = 4;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 5;
+       MY(size_max) = 20;
+       MY(stretchfactor) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 16;
+       MY(type) = "spark";
+       MY(velocityjitter) = '44.0 44.0 44.0';
+}
+// arcs
+SUB(robot_TR_BLOOD) {
+       MY(alpha_min) = 1128;
+       MY(alpha_max) = 1256;
+       MY(alpha_fade) = 44900;
+       MY(color_min) = "0xff3000";
+       MY(color_max) = "0xff8585";
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(size_min) = 25;
+       MY(size_max) = 30;
+       MY(tex_min) = 71;
+       MY(tex_max) = 73;
+       MY(trailspacing) = 128;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '44.0 44.0 44.0';
+}
+
+DEF(alien_TR_SLIGHTBLOOD);
+SUB(alien_TR_SLIGHTBLOOD) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 384;
+       MY(alpha_fade) = 192;
+       MY(bounce) = -1;
+       MY(color_min) = "0xC080B0";
+       MY(color_max) = "0xC080B0";
+       MY(liquidfriction) = 4;
+       MY(size_min) = 80;
+       MY(size_max) = 80;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 64;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(robot_TR_SLIGHTBLOOD);
+SUB(robot_TR_SLIGHTBLOOD) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 384;
+       MY(alpha_max) = 384;
+       MY(alpha_fade) = 192;
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 8;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(trailspacing) = 64;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(item_pickup);
+// flare particle and light
+SUB(item_pickup) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0xB0C5C4";
+       MY(countabsolute) = 1;
+       MY(size_min) = 8;
+       MY(size_max) = 16;
+       MY(type) = "static";
+}
+// cloud of particles which expand rapidly and then slow to form a ball
+SUB(item_pickup) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1280;
+       MY(color_min) = "0x63F2EA";
+       MY(color_max) = "0xB0C5C4";
+       MY(count) = 32;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+DEF(bloodshower);
+SUB(bloodshower) {
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 656;
+       MY(alpha_fade) = 1664;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 125;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 28;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 3;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "spark";
+       MY(velocityjitter) = '764.0 764.0 764.0';
+}
+// center blood
+SUB(bloodshower) {
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 656;
+       MY(alpha_fade) = 1664;
+       MY(blend) = "invmod";
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(countabsolute) = 0.100000;
+       MY(originjitter) = '50.0 50.0 50.0';
+       MY(sizeincrease) = 300;
+       MY(size_min) = 1;
+       MY(size_max) = 28;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "smoke";
+}
+
+DEF(alien_bloodshower);
+SUB(alien_bloodshower) {
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 656;
+       MY(alpha_fade) = 1664;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xC080B0";
+       MY(color_max) = "0xC080B0";
+       MY(count) = 125;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 28;
+       MY(staincolor_min) = "0xC080B0";
+       MY(staincolor_max) = "0xC080B0";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 3;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "spark";
+       MY(velocityjitter) = '764.0 764.0 764.0';
+}
+// center blood
+SUB(alien_bloodshower) {
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 656;
+       MY(alpha_fade) = 1664;
+       MY(blend) = "invmod";
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(countabsolute) = 0.100000;
+       MY(originjitter) = '50.0 50.0 50.0';
+       MY(sizeincrease) = 300;
+       MY(size_min) = 1;
+       MY(size_max) = 28;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "smoke";
+}
+
+DEF(robot_bloodshower);
+SUB(robot_bloodshower) {
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 656;
+       MY(alpha_fade) = 1664;
+       MY(blend) = "invmod";
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(count) = 100;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 8;
+       MY(size_max) = 28;
+       MY(staincolor_min) = "0xC0D890";
+       MY(staincolor_max) = "0xC0D890";
+       MY(stainsize_min) = 1;
+       MY(stainsize_max) = 2;
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(stretchfactor) = 3;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "spark";
+       MY(velocityjitter) = '764.0 764.0 764.0';
+}
+// arc
+SUB(robot_bloodshower) {
+       MY(alpha_min) = 1128;
+       MY(alpha_max) = 1256;
+       MY(alpha_fade) = 4200;
+       MY(color_min) = "0xff3000";
+       MY(color_max) = "0xff8585";
+       MY(count) = 2.500000;
+       MY(originjitter) = '150.0 150.0 150.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 99;
+       MY(spin_max) = -99;
+       MY(size_min) = 25;
+       MY(size_max) = 40;
+       MY(tex_min) = 71;
+       MY(tex_max) = 73;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '44.0 44.0 44.0';
+}
+// shockwave
+SUB(robot_bloodshower) {
+       MY(alpha_min) = 11;
+       MY(alpha_max) = 125;
+       MY(alpha_fade) = 990;
+       MY(color_min) = "0xff3000";
+       MY(color_max) = "0xff8585";
+       MY(count) = 2.500000;
+       MY(sizeincrease) = 3000;
+       MY(size_min) = 5;
+       MY(size_max) = 50;
+       MY(tex_min) = 74;
+       MY(tex_max) = 74;
+       MY(type) = "smoke";
+}
+
+#define ground_quake(name, colormin, colormax) \
+       DEF(name##_ground_quake); \
+       SUB(name##_ground_quake) /* smoke */ { \
+               MY(airfriction) = 3; \
+               MY(alpha_min) = 100; \
+               MY(alpha_max) = 126; \
+               MY(alpha_fade) = 200; \
+               MY(bounce) = 1.100000; \
+               MY(color_min) = "0x111111"; \
+               MY(color_max) = "0xbbbbbb"; \
+               MY(count) = 90; \
+               MY(gravity) = 0.500000; \
+               MY(notunderwater) = true; \
+               MY(sizeincrease) = 100; \
+               MY(size_min) = 20; \
+               MY(size_max) = 50; \
+               MY(tex_max) = 8; \
+               MY(time_min) = 5; \
+               MY(time_max) = 10; \
+               MY(type) = "smoke"; \
+               MY(velocityjitter) = '190.0 190.0 50.0'; \
+       } \
+       SUB(name##_ground_quake) { \
+               MY(airfriction) = 4; \
+               MY(alpha_min) = 100; \
+               MY(alpha_max) = 126; \
+               MY(alpha_fade) = 200; \
+               MY(bounce) = 1.200000; \
+               MY(color_min) = "0x111111"; \
+               MY(color_max) = "0x979797"; \
+               MY(count) = 40; \
+               MY(gravity) = 0.200000; \
+               MY(notunderwater) = true; \
+               MY(sizeincrease) = 60; \
+               MY(size_min) = 10; \
+               MY(size_max) = 30; \
+               MY(tex_max) = 8; \
+               MY(time_min) = 10; \
+               MY(time_max) = 15; \
+               MY(type) = "smoke"; \
+               MY(velocityjitter) = '190.0 190.0 50.0'; \
+       } \
+       SUB(name##_ground_quake) { \
+               MY(alpha_min) = 200; \
+               MY(alpha_max) = 356; \
+               MY(alpha_fade) = 512; \
+               MY(bounce) = 6; \
+               MY(color_min) = colormin; \
+               MY(color_max) = colormax; \
+               MY(count) = 16; \
+               MY(gravity) = -0.500000; \
+               MY(originjitter) = '33.0 33.0 33.0'; \
+               MY(sizeincrease) = 5; \
+               MY(size_min) = 4; \
+               MY(size_max) = 20; \
+               MY(tex_min) = 48; \
+               MY(tex_max) = 55; \
+               MY(time_min) = 15; \
+               MY(time_max) = 25; \
+               MY(type) = "smoke"; \
+               MY(velocityjitter) = '22.0 22.0 50.0'; \
+       } \
+       SUB(name##_ground_quake) /* smoke */ { \
+               MY(alpha_min) = 200; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 200; \
+               MY(bounce) = 2; \
+               MY(color_min) = "0x000000"; \
+               MY(color_max) = "0xffffff"; \
+               MY(count) = 11; \
+               MY(gravity) = -0.300000; \
+               MY(originjitter) = '44.0 44.0 44.0'; \
+               MY(sizeincrease) = 11; \
+               MY(size_min) = 22; \
+               MY(size_max) = 33; \
+               MY(tex_max) = 8; \
+               MY(time_min) = 25; \
+               MY(time_max) = 35; \
+               MY(type) = "alphastatic"; \
+               MY(velocityjitter) = '11.0 11.0 50.0'; \
+       } \
+       /**/
+
+ground_quake(red,      "0x9E6A64", "0x91302D")
+ground_quake(blue,     "0x64679E", "0x2D4C91")
+#undef ground_quake
+
+#include "effectinfo_gentle_morphed.inc"
+
+// Team / hit vaporizer effects
+#define TE_TEI_G3(name, colormin1, colormax1, colormin2, colormax2) \
+       DEF(TE_TEI_G3##name); \
+       SUB(TE_TEI_G3##name) { \
+               MY(alpha_min) = 128; \
+               MY(alpha_max) = 128; \
+               MY(alpha_fade) = 256; \
+               MY(color_min) = colormin1; \
+               MY(color_max) = colormax1; \
+               MY(countabsolute) = 1; \
+               MY(size_min) = 4; \
+               MY(size_max) = 4; \
+               MY(tex_min) = 200; \
+               MY(tex_max) = 200; \
+               MY(type) = "beam"; \
+       } \
+       SUB(TE_TEI_G3##name) { \
+               MY(airfriction) = -4; \
+               MY(alpha_min) = 256; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 512; \
+               MY(color_min) = colormin2; \
+               MY(color_max) = colormax2; \
+               MY(sizeincrease) = 3; \
+               MY(size_min) = 0.300000; \
+               MY(size_max) = 0.300000; \
+               MY(tex_min) = 46; \
+               MY(tex_max) = 46; \
+               MY(trailspacing) = 8; \
+               MY(type) = "smoke"; \
+               MY(velocityjitter) = '3.0 3.0 3.0'; \
+       } \
+       DEF(TE_TEI_G3##name##_HIT); \
+       SUB(TE_TEI_G3##name##_HIT) { \
+               MY(alpha_min) = 128; \
+               MY(alpha_max) = 128; \
+               MY(alpha_fade) = 256; \
+               MY(color_min) = colormin1; \
+               MY(color_max) = colormax1; \
+               MY(countabsolute) = 1; \
+               MY(size_min) = 8; \
+               MY(size_max) = 8; \
+               MY(tex_min) = 200; \
+               MY(tex_max) = 200; \
+               MY(type) = "beam"; \
+       } \
+       SUB(TE_TEI_G3##name##_HIT) /* rings */ { \
+               MY(airfriction) = -4; \
+               MY(alpha_min) = 256; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 512; \
+               MY(color_min) = "0xFFFFFF"; \
+               MY(color_max) = colormax1; \
+               MY(sizeincrease) = -2; \
+               MY(size_min) = 2; \
+               MY(size_max) = 2; \
+               MY(trailspacing) = 20; \
+               MY(type) = "smoke"; \
+               MY(velocityjitter) = '2.0 2.0 2.0'; \
+       } \
+       SUB(TE_TEI_G3##name##_HIT) { \
+               MY(airfriction) = -4; \
+               MY(alpha_min) = 256; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 512; \
+               MY(color_min) = colormin1; \
+               MY(color_max) = colormax1; \
+               MY(sizeincrease) = -6; \
+               MY(size_min) = 10; \
+               MY(size_max) = 10; \
+               MY(trailspacing) = 40; \
+               MY(type) = "smoke"; \
+       } \
+       /**/
+TE_TEI_G3(RED, "0xFF0000", "0xFF0011", "0x200000", "0x400000")
+TE_TEI_G3(BLUE, "0x0000FF", "0x1100FF", "0x000020", "0x000040")
+TE_TEI_G3(YELLOW, "0xffff00", "0xffff11", "0x202000", "0x404000")
+TE_TEI_G3(PINK, "0xFF00FF", "0xFF11FF", "0x200020", "0x400040")
+#undef TE_TEI_G3
+
+#include "effectinfo_gentle_particlegibs.inc"
+
+#include "effectinfo_onslaught.inc"
+
+DEF(firemine);
+SUB(firemine) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 250;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 5;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 2;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '10.0 10.0 2.0';
+}
+// slowfire
+SUB(firemine) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 5;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 2;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+}
+// very slow and small fire
+SUB(firemine) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 2;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '8.0 8.0 8.0';
+}
+// decreasing fire
+SUB(firemine) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = -3;
+       MY(size_min) = 5;
+       MY(size_max) = 7;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '3.0 3.0 3.0';
+}
+// smoke
+SUB(firemine) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 90;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 0.500000;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityoffset) = '0.0 0.0 3.0';
+}
+// fastfire
+SUB(firemine) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1600;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(size_min) = 12;
+       MY(size_max) = 12;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 1;
+       MY(type) = "smoke";
+}
+// light only
+SUB(firemine) {
+       MY(lightcolor) = '2.7 2.7 0.6';
+       MY(lightradiusfade) = 50000;
+       MY(lightradius) = 50;
+       MY(trailspacing) = 16;
+}
+
+DEF(fireball);
+SUB(fireball) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 250;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 2;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 11.0';
+}
+// slow fire
+SUB(fireball) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 2;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 40.0';
+}
+// very slow and small fire
+SUB(fireball) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '30.0 30.0 30.0';
+}
+// decreasing fire
+SUB(fireball) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = -10;
+       MY(size_min) = 20;
+       MY(size_max) = 30;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+}
+// smoke
+SUB(fireball) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 90;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 0.500000;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = 7;
+       MY(size_min) = 5;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityoffset) = '0.0 0.0 10.0';
+}
+// fast fire
+SUB(fireball) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1600;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 0.500000;
+       MY(size_min) = 48;
+       MY(size_max) = 48;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 1;
+       MY(type) = "smoke";
+}
+// light only
+SUB(fireball) {
+       MY(lightcolor) = '2.7 2.7 0.6';
+       MY(lightradiusfade) = 3000;
+       MY(lightradius) = 300;
+       MY(trailspacing) = 16;
+}
+
+DEF(fireball_laser);
+SUB(fireball_laser) {
+       MY(alpha_min) = 192;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 2560;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(count) = 10;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(stretchfactor) = 0.700000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '1.0 1.0 1.0';
+       MY(velocitymultiplier) = 10;
+}
+
+// rocket explosion (bigger than mortar and hagar)
+DEF(fireball_explode);
+// decal
+SUB(fireball_explode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '4.0 2.0 0.5';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 500;
+       MY(originjitter) = '56.0 56.0 56.0';
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// flare effect
+SUB(fireball_explode) {
+       MY(alpha_min) = 192;
+       MY(alpha_max) = 192;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x404040";
+       MY(countabsolute) = 1;
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 35;
+       MY(tex_max) = 37;
+       MY(type) = "static";
+}
+// fire effect
+SUB(fireball_explode) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x902010";
+       MY(color_max) = "0xFFD080";
+       MY(count) = 128;
+       MY(liquidfriction) = 4;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// underwater bubbles
+SUB(fireball_explode) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '16.0 16.0 16.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// bouncing sparks
+SUB(fireball_explode) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 384;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 64;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(type) = "spark";
+       MY(velocityjitter) = '384.0 384.0 384.0';
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+DEF(fireball_muzzleflash);
+SUB(fireball_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 2;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(fireball_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 15;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(fireball_preattack_muzzleflash);
+SUB(fireball_preattack_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 2;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(fireball_preattack_muzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 15;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(fireball_bfgdamage);
+SUB(fireball_bfgdamage) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(count) = 2;
+       MY(lightcolor) = '2.0 1.5 0.2';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(fireball_bfgdamage) {
+       MY(airfriction) = 12;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(count) = 15;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+DEF(EF_FLAME);
+// fire
+SUB(EF_FLAME) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 356;
+       MY(alpha_fade) = 512;
+       MY(bounce) = 2;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 100;
+       MY(gravity) = -0.500000;
+       MY(originjitter) = '12.0 12.0 34.0';
+       MY(originoffset) = '0.0 0.0 10.0';
+       MY(sizeincrease) = -1;
+       MY(size_min) = 5;
+       MY(size_max) = 21;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(EF_FLAME) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 2;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 50;
+       MY(gravity) = -0.300000;
+       MY(originjitter) = '12.0 12.0 34.0';
+       MY(originoffset) = '0.0 0.0 10.0';
+       MY(sizeincrease) = 6;
+       MY(size_min) = 11;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+SUB(EF_FLAME) {
+       MY(count) = 0.500000;
+       MY(lightcolor) = '0.9 0.9 0.2';
+       MY(lightradiusfade) = 10000;
+       MY(lightradius) = 200;
+}
+
+// rifle bullet trail (somewhat like a tracer)
+DEF(tr_rifle);
+SUB(tr_rifle) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 2560;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(size_min) = 1.500000;
+       MY(size_max) = 1.500000;
+       MY(stretchfactor) = 1;
+       MY(trailspacing) = 128;
+       MY(type) = "spark";
+       MY(velocitymultiplier) = 0.700000;
+}
+SUB(tr_rifle) {
+       MY(airfriction) = -4;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 0.400000;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '4.0 4.0 4.0';
+}
+SUB(tr_rifle) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 128;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 32;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+// rocket guiding start
+DEF(rocket_guide);
+// underwater bubbles
+SUB(rocket_guide) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 2;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(size_min) = 1.500000;
+       MY(size_max) = 1.500000;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '48.0 48.0 48.0';
+       MY(velocitymultiplier) = -0.100000;
+}
+// bouncing sparks
+SUB(rocket_guide) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 984;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(count) = 8;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(size_min) = 0.300000;
+       MY(size_max) = 0.700000;
+       MY(stretchfactor) = 0.400000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '156.0 156.0 156.0';
+       MY(velocitymultiplier) = -0.300000;
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+SUB(rocket_guide) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 100;
+       MY(alpha_fade) = 500;
+       MY(color_min) = "0x903010";
+       MY(color_max) = "0xFFD030";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 300;
+       MY(size_min) = 10;
+       MY(size_max) = 10;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+}
+
+// gauntlet laser
+DEF(laser_gauntlet);
+SUB(laser_gauntlet) {
+       MY(airfriction) = 10;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xb44215";
+       MY(color_max) = "0x880000";
+       MY(count) = 3;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(sizeincrease) = -100;
+       MY(size_min) = 7;
+       MY(size_max) = 10;
+       MY(stretchfactor) = 2.300000;
+       MY(tex_min) = 43;
+       MY(tex_max) = 43;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+SUB(laser_gauntlet) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xff4200";
+       MY(color_max) = "0xff0000";
+       MY(count) = 6;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -100;
+       MY(size_min) = 7;
+       MY(size_max) = 9;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+
+DEF(laser_gauntletmuzzleflash);
+// glow and light
+SUB(laser_gauntletmuzzleflash) {
+       MY(airfriction) = 10;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0x220000";
+       MY(color_max) = "0x880000";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.0 0.1 0.1';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 150;
+       MY(sizeincrease) = -100;
+       MY(size_min) = 10;
+       MY(size_max) = 15;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+}
+// electricity
+SUB(laser_gauntletmuzzleflash) {
+       MY(airfriction) = 10;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xb44215";
+       MY(color_max) = "0x880000";
+       MY(count) = 3;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(sizeincrease) = -100;
+       MY(size_min) = 7;
+       MY(size_max) = 10;
+       MY(stretchfactor) = 2.300000;
+       MY(tex_min) = 43;
+       MY(tex_max) = 43;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+// fire
+SUB(laser_gauntletmuzzleflash) {
+       MY(airfriction) = 12;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 6280;
+       MY(color_min) = "0xff4200";
+       MY(color_max) = "0xff0000";
+       MY(count) = 6;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -100;
+       MY(size_min) = 7;
+       MY(size_max) = 9;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 0.200000;
+}
+
+// torch flame, spawn it as fast as you can  20 times per second or more, supports direction but not required
+DEF(torchflame);
+// fast fire
+SUB(torchflame) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 250;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 11.0';
+       MY(velocitymultiplier) = 30;
+}
+// slow fire
+SUB(torchflame) {
+       MY(airfriction) = 1.200000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 2.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 20;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '40.0 40.0 40.0';
+       MY(velocitymultiplier) = 20;
+}
+// very slow and small fire
+SUB(torchflame) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 1.500000;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '30.0 30.0 30.0';
+       MY(velocitymultiplier) = 10;
+}
+// decreasing fire
+SUB(torchflame) {
+       MY(airfriction) = 0.300000;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 2;
+       MY(gravity) = -0.060000;
+       MY(sizeincrease) = -10;
+       MY(size_min) = 20;
+       MY(size_max) = 30;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+       MY(velocitymultiplier) = 15;
+}
+// smoke
+SUB(torchflame) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 90;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 0.500000;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = 7;
+       MY(size_min) = 5;
+       MY(size_max) = 15;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocitymultiplier) = 20;
+       MY(velocityoffset) = '0.0 0.0 10.0';
+}
+
+#include "effectinfo_gentle_happy.inc"
+
+DEF(electro_lightning);
+SUB(electro_lightning) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.1 4.4 10.0';
+       MY(lightradiusfade) = 500;
+       MY(lightradius) = 50;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+SUB(electro_lightning) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 206;
+       MY(alpha_fade) = 1724;
+       MY(color_min) = "0x2030FF";
+       MY(color_max) = "0x80C0FF";
+       MY(count) = 300;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 6;
+       MY(size_max) = 6;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "spark";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 2000;
+}
+SUB(electro_lightning) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 170;
+       MY(alpha_fade) = 1500;
+       MY(color_min) = "0xDDFDFF";
+       MY(color_max) = "0xFDFDFF";
+       MY(count) = 30;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 2;
+       MY(size_max) = 5;
+       MY(stretchfactor) = 1.500000;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+SUB(electro_lightning) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 170;
+       MY(alpha_fade) = 1500;
+       MY(color_min) = "0xFDFDFF";
+       MY(color_max) = "0xF9FDFF";
+       MY(count) = 50;
+       MY(gravity) = 1.300000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(stretchfactor) = 0.100000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '350.0 350.0 350.0';
+       MY(velocitymultiplier) = 2.500000;
+}
+
+DEF(gauntlet_lightning);
+SUB(gauntlet_lightning) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x280000";
+       MY(color_max) = "0x280000";
+       MY(count) = 300;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = 15;
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "spark";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 2000;
+}
+SUB(gauntlet_lightning) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xDD0000";
+       MY(color_max) = "0xFD0000";
+       MY(count) = 30;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 2;
+       MY(size_max) = 5;
+       MY(stretchfactor) = 1.500000;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+SUB(gauntlet_lightning) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 600;
+       MY(color_min) = "0xFD0000";
+       MY(color_max) = "0xF90000";
+       MY(count) = 50;
+       MY(gravity) = 1.300000;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(stretchfactor) = 0.100000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '350.0 350.0 350.0';
+       MY(velocitymultiplier) = 2.500000;
+}
+
+DEF(crylink_joinexplode);
+// decal
+SUB(crylink_joinexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(originjitter) = '12.0 12.0 12.0';
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "decal";
+}
+// purple flare effect
+SUB(crylink_joinexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x504060";
+       MY(color_max) = "0x504060";
+       MY(countabsolute) = 1;
+       MY(size_min) = 24;
+       MY(size_max) = 24;
+       MY(tex_min) = 39;
+       MY(tex_max) = 39;
+       MY(type) = "static";
+}
+// purple sparks
+SUB(crylink_joinexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(bounce) = 2;
+       MY(color_min) = "0xA040C0";
+       MY(color_max) = "0xA040C0";
+       MY(count) = 40;
+       MY(size_min) = 6;
+       MY(size_max) = 6;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// purple splash
+SUB(crylink_joinexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 1.500000;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+// purple splash
+SUB(crylink_joinexplode) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0xE070FF";
+       MY(color_max) = "0xE070FF";
+       MY(count) = 3;
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(type) = "static";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+// sparks for keepaway ball touch
+DEF(kaball_sparks);
+SUB(kaball_sparks) {
+       MY(airfriction) = 3;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 556;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0xa9cacf";
+       MY(color_max) = "0x0054ff";
+       MY(count) = 35;
+       MY(gravity) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '300.0 300.0 300.0';
+       MY(velocitymultiplier) = 0.500000;
+}
+
+// weak rifle bullet trail (somewhat like a tracer)
+DEF(tr_rifle_weak);
+SUB(tr_rifle_weak) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 2560;
+       MY(color_min) = "0x800000";
+       MY(color_max) = "0xFF8020";
+       MY(size_min) = 1.500000;
+       MY(size_max) = 1.500000;
+       MY(stretchfactor) = 1;
+       MY(trailspacing) = 128;
+       MY(type) = "spark";
+       MY(velocitymultiplier) = 0.700000;
+}
+SUB(tr_rifle_weak) {
+       MY(airfriction) = -4;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x202020";
+       MY(color_max) = "0x404040";
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 0.400000;
+       MY(size_min) = 4;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 48;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '4.0 4.0 4.0';
+}
+SUB(tr_rifle_weak) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 128;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 192;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+// red smoke emiter
+DEF(red_smoke);
+SUB(red_smoke) {
+       MY(airfriction) = -1;
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 32;
+       MY(color_min) = "0xff8866";
+       MY(color_max) = "0x331100";
+       MY(count) = 2;
+       MY(gravity) = -0.007000;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(size_min) = 60;
+       MY(size_max) = 120;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 5;
+}
+
+// pipe smoke emiter
+DEF(pipe_smoke);
+SUB(pipe_smoke) {
+       MY(airfriction) = -1;
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 48;
+       MY(color_min) = "0x999999";
+       MY(color_max) = "0x555555";
+       MY(count) = 2;
+       MY(gravity) = -0.015000;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -180;
+       MY(spin_max) = 180;
+       MY(sizeincrease) = 35;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.0 0.0 5.0';
+       MY(velocitymultiplier) = 15;
+}
+
+// seeker missile trail
+DEF(TR_SEEKER);
+SUB(TR_SEEKER) {
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 300;
+       MY(alpha_fade) = 200;
+       MY(bounce) = 1;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x666666";
+       MY(lightcolor) = '6.0 3.0 1.0';
+       MY(lightradius) = 100;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 11;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 10;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '3.0 3.0 3.0';
+       MY(velocitymultiplier) = -0.020000;
+}
+// fire
+SUB(TR_SEEKER) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 144;
+       MY(alpha_fade) = 588;
+       MY(color_min) = "0xffdf72";
+       MY(color_max) = "0x811200";
+       MY(sizeincrease) = -30;
+       MY(size_min) = 5;
+       MY(size_max) = 5;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = -1.500000;
+}
+// bubbles
+SUB(TR_SEEKER) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 16;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+       MY(velocitymultiplier) = -0.310000;
+}
+// sparks
+SUB(TR_SEEKER) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 512;
+       MY(alpha_fade) = 1866;
+       MY(bounce) = 1;
+       MY(color_min) = "0xFFFDD9";
+       MY(color_max) = "0xFFFDD9";
+       MY(notunderwater) = true;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 0.500000;
+       MY(size_max) = 0.500000;
+       MY(stretchfactor) = 0.300000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(trailspacing) = 20;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = -0.310000;
+}
+
+#include "effectinfo_vehicles.inc"
+
+// generic explosion size:big (biggest explosion ever)
+DEF(explosion_big);
+// decal
+SUB(explosion_big) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '8.0 4.0 0.0';
+       MY(lightradiusfade) = 1750;
+       MY(lightradius) = 600;
+       MY(originjitter) = '23.0 23.0 23.0';
+       MY(size_min) = 172;
+       MY(size_max) = 172;
+       MY(tex_min) = 8;
+       MY(tex_max) = 16;
+       MY(type) = "decal";
+}
+// shockwave
+SUB(explosion_big) {
+       MY(alpha_min) = 56;
+       MY(alpha_max) = 56;
+       MY(alpha_fade) = 330;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 4400;
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "static";
+}
+// fire effect
+SUB(explosion_big) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 712;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 64;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '80.0 80.0 80.0';
+       MY(sizeincrease) = 45;
+       MY(size_min) = 133;
+       MY(size_max) = 144;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '2512.0 2512.0 2512.0';
+}
+// fire rays
+SUB(explosion_big) {
+       MY(airfriction) = -5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 800;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 64;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(sizeincrease) = 45;
+       MY(size_min) = 133;
+       MY(size_max) = 144;
+       MY(stretchfactor) = 10;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// smoke
+SUB(explosion_big) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 650;
+       MY(alpha_fade) = 456;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 32;
+       MY(notunderwater) = true;
+       MY(sizeincrease) = 244;
+       MY(size_min) = 50;
+       MY(size_max) = 100;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '3444.0 3444.0 3444.0';
+}
+// bouncing sparks
+SUB(explosion_big) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 1284;
+       MY(color_min) = "0xffa35b";
+       MY(color_max) = "0xfff2be";
+       MY(count) = 34;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '160.0 160.0 160.0';
+       MY(size_min) = 3;
+       MY(size_max) = 4;
+       MY(stretchfactor) = 0.700000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '924.0 924.0 924.0';
+       MY(velocityoffset) = '0.0 0.0 370.0';
+}
+// debris
+SUB(explosion_big) {
+       MY(airfriction) = 0.500000;
+       MY(alpha_min) = 444;
+       MY(alpha_max) = 1356;
+       MY(alpha_fade) = 1184;
+       MY(color_min) = "0xFFFFFF";
+       MY(color_max) = "0xcac5b4";
+       MY(count) = 16;
+       MY(gravity) = 2.300000;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -1000;
+       MY(spin_max) = 1000;
+       MY(sizeincrease) = -5;
+       MY(size_min) = 10;
+       MY(size_max) = 16;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '1800.0 1800.0 1800.0';
+       MY(velocityoffset) = '0.0 0.0 970.0';
+}
+// underwater bubbles
+SUB(explosion_big) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '160.0 160.0 160.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '444.0 444.0 444.0';
+}
+// underwatershockwave
+SUB(explosion_big) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 300;
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 2900;
+       MY(size_min) = 30;
+       MY(size_max) = 30;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(underwater) = true;
+       MY(velocitymultiplier) = 0.300000;
+}
+
+// generic explosion size:medium (it leaves rising smoke for a longer time)
+DEF(explosion_medium);
+// shockwave
+SUB(explosion_medium) {
+       MY(alpha_min) = 56;
+       MY(alpha_max) = 56;
+       MY(alpha_fade) = 330;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 2400;
+       MY(size_min) = 72;
+       MY(size_max) = 72;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "static";
+}
+// fire effect
+SUB(explosion_medium) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 712;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 32;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '30.0 30.0 30.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -500;
+       MY(spin_max) = 500;
+       MY(sizeincrease) = 45;
+       MY(size_min) = 133;
+       MY(size_max) = 144;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '1512.0 1512.0 1512.0';
+}
+// fire effect 2
+SUB(explosion_medium) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 612;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 32;
+       MY(gravity) = -2;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '30.0 30.0 30.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -150;
+       MY(spin_max) = 150;
+       MY(sizeincrease) = 40;
+       MY(size_min) = 73;
+       MY(size_max) = 94;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '1512.0 1512.0 1512.0';
+}
+// fire rays
+SUB(explosion_medium) {
+       MY(airfriction) = -3;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 800;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 14;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(sizeincrease) = 40;
+       MY(size_min) = 43;
+       MY(size_max) = 74;
+       MY(stretchfactor) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// smoke
+SUB(explosion_medium) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 650;
+       MY(alpha_fade) = 756;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 5;
+       MY(notunderwater) = true;
+       MY(originjitter) = '100.0 100.0 100.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -20;
+       MY(spin_max) = 20;
+       MY(sizeincrease) = -30;
+       MY(size_min) = 250;
+       MY(size_max) = 300;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '200.0 200.0 200.0';
+}
+// smoke 2
+SUB(explosion_medium) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 650;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 10;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '100.0 100.0 100.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -20;
+       MY(spin_max) = 20;
+       MY(sizeincrease) = 50;
+       MY(size_min) = 50;
+       MY(size_max) = 100;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '500.0 500.0 500.0';
+       MY(velocityoffset) = '0.0 0.0 200.0';
+}
+// smoke rays
+SUB(explosion_medium) {
+       MY(alpha_min) = 140;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 13;
+       MY(notunderwater) = true;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(sizeincrease) = 100;
+       MY(size_min) = 150;
+       MY(size_max) = 200;
+       MY(stretchfactor) = 50;
+       MY(tex_max) = 8;
+       MY(type) = "spark";
+       MY(velocityjitter) = '250.0 250.0 250.0';
+}
+// bouncing sparks
+SUB(explosion_medium) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 644;
+       MY(alpha_max) = 956;
+       MY(alpha_fade) = 984;
+       MY(color_min) = "0xffa35b";
+       MY(color_max) = "0xfff2be";
+       MY(count) = 14;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '100.0 100.0 100.0';
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(stretchfactor) = 0.700000;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "spark";
+       MY(velocityjitter) = '624.0 624.0 624.0';
+       MY(velocityoffset) = '0.0 0.0 370.0';
+}
+// underwater bubbles
+SUB(explosion_medium) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '160.0 160.0 160.0';
+       MY(size_min) = 3;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '444.0 444.0 444.0';
+}
+// underwatershockwave
+SUB(explosion_medium) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 300;
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 2900;
+       MY(size_min) = 30;
+       MY(size_max) = 30;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(underwater) = true;
+       MY(velocitymultiplier) = 0.300000;
+}
+
+// generic explosion size:small (its fire only, made to support other explosions)
+DEF(explosion_small);
+// shockwave
+SUB(explosion_small) {
+       MY(alpha_min) = 56;
+       MY(alpha_max) = 56;
+       MY(alpha_fade) = 330;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 2400;
+       MY(size_min) = 22;
+       MY(size_max) = 22;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "static";
+}
+// fire effect
+SUB(explosion_small) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1212;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 16;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -500;
+       MY(spin_max) = 500;
+       MY(sizeincrease) = 45;
+       MY(size_min) = 1;
+       MY(size_max) = 44;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// fire effect 2
+SUB(explosion_small) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 812;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 16;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -150;
+       MY(spin_max) = 150;
+       MY(sizeincrease) = 40;
+       MY(size_min) = 73;
+       MY(size_max) = 94;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "static";
+       MY(velocityjitter) = '912.0 912.0 912.0';
+}
+// fire rays
+SUB(explosion_small) {
+       MY(airfriction) = -3;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 1300;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 14;
+       MY(liquidfriction) = 8;
+       MY(notunderwater) = true;
+       MY(originjitter) = '40.0 40.0 40.0';
+       MY(sizeincrease) = 30;
+       MY(size_min) = 13;
+       MY(size_max) = 54;
+       MY(stretchfactor) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// underwater bubbles
+SUB(explosion_small) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 32;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '160.0 160.0 160.0';
+       MY(size_min) = 1;
+       MY(size_max) = 3;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// underwatershockwave
+SUB(explosion_small) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 300;
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1200;
+       MY(size_min) = 30;
+       MY(size_max) = 30;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(underwater) = true;
+}
+
+// big smoke ( for spamming on damaged stuff )
+DEF(smoke_big);
+SUB(smoke_big) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 750;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 3;
+       MY(gravity) = -0.500000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '55.0 55.0 55.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -20;
+       MY(spin_max) = 20;
+       MY(sizeincrease) = 15;
+       MY(size_min) = 30;
+       MY(size_max) = 60;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '140.0 140.0 200.0';
+       MY(velocityoffset) = '0.0 0.0 200.0';
+}
+
+// small smoke ( more precise than big one, for spamming on damaged parts like raptors spinner )
+DEF(smoke_small);
+SUB(smoke_small) {
+       MY(airfriction) = 4;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 750;
+       MY(alpha_fade) = 200;
+       MY(color_min) = "0x4F4B46";
+       MY(color_max) = "0x000000";
+       MY(count) = 3;
+       MY(gravity) = -0.500000;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -20;
+       MY(spin_max) = 20;
+       MY(sizeincrease) = -10;
+       MY(size_min) = 60;
+       MY(size_max) = 100;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '40.0 40.0 400.0';
+       MY(velocityoffset) = '0.0 0.0 200.0';
+}
+
+// metal impact effect
+DEF(impact_metal);
+SUB(impact_metal) {
+       MY(alpha_min) = 25;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 50;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x886666";
+       MY(count) = 1;
+       MY(gravity) = -0.010000;
+       MY(originjitter) = '20.0 20.0 5.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 3;
+       MY(size_max) = 6;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+// sparks
+SUB(impact_metal) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 112;
+       MY(bounce) = 1.800000;
+       MY(color_min) = "0xFFCC22";
+       MY(color_max) = "0xFF4422";
+       MY(count) = 2;
+       MY(gravity) = 1;
+       MY(size_min) = 2;
+       MY(size_max) = 2;
+       MY(stretchfactor) = 0.500000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '200.0 200.0 300.0';
+       MY(velocitymultiplier) = 2;
+}
+
+// stone impact effect
+DEF(impact_stone);
+SUB(impact_stone) {
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 75;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0xcc9966";
+       MY(count) = 1;
+       MY(gravity) = -0.010000;
+       MY(originjitter) = '20.0 20.0 5.0';
+       MY(sizeincrease) = 15;
+       MY(size_min) = 3;
+       MY(size_max) = 6;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+// debris
+SUB(impact_stone) {
+       MY(airfriction) = 0.500000;
+       MY(alpha_min) = 450;
+       MY(alpha_max) = 750;
+       MY(alpha_fade) = 300;
+       MY(bounce) = 1.200000;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x886644";
+       MY(count) = 1;
+       MY(gravity) = 1.300000;
+       MY(notunderwater) = true;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -1000;
+       MY(spin_max) = 1000;
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '124.0 124.0 324.0';
+}
+
+// wood impact effect
+DEF(impact_wood);
+SUB(impact_wood) {
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 75;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0xcc9966";
+       MY(count) = 1;
+       MY(gravity) = -0.010000;
+       MY(originjitter) = '20.0 20.0 5.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 3;
+       MY(size_max) = 6;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+// sparks
+SUB(impact_wood) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 75;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x221100";
+       MY(color_max) = "0x221100";
+       MY(count) = 2;
+       MY(gravity) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 8;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '180.0 180.0 260.0';
+       MY(velocitymultiplier) = 2;
+}
+
+// flesh impact effect
+DEF(impact_flesh);
+SUB(impact_flesh) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x420000";
+       MY(count) = 0.500000;
+       MY(originjitter) = '11.0 11.0 11.0';
+       MY(size_min) = 8;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+// blood splash
+SUB(impact_flesh) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 6;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '96.0 96.0 96.0';
+       MY(velocitymultiplier) = 5;
+}
+
+// hagar trail
+DEF(tr_hagar);
+// smoke
+SUB(tr_hagar) {
+       MY(alpha_min) = 300;
+       MY(alpha_max) = 400;
+       MY(alpha_fade) = 780;
+       MY(bounce) = 1;
+       MY(color_min) = "0x101010";
+       MY(color_max) = "0x000000";
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 3;
+       MY(size_max) = 2;
+       MY(tex_max) = 8;
+       MY(trailspacing) = 4;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '1.0 1.0 1.0';
+       MY(velocitymultiplier) = -0.020000;
+}
+// fire
+SUB(tr_hagar) {
+       MY(airfriction) = 8;
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 144;
+       MY(alpha_fade) = 988;
+       MY(color_min) = "0xffdf72";
+       MY(color_max) = "0x811200";
+       MY(notunderwater) = true;
+       MY(sizeincrease) = -15;
+       MY(size_min) = 5;
+       MY(size_max) = 2;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(trailspacing) = 4;
+       MY(type) = "static";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = -1;
+}
+// bubbles
+SUB(tr_hagar) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(trailspacing) = 16;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+// laser damage effect
+DEF(damage_laser);
+SUB(damage_laser) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x880000";
+       MY(color_max) = "0xff4400";
+       MY(count) = 3;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 8;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.4 0.4 0.6';
+}
+
+// shotgun damage effect, normal blood
+DEF(damage_shotgun);
+SUB(damage_shotgun) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 0.600000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_shotgun) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x420000";
+       MY(count) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 8;
+       MY(size_max) = 16;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// shotgun damage effect, alien blood
+DEF(damage_shotgun_alien);
+SUB(damage_shotgun_alien) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xDC9BCD";
+       MY(color_max) = "0xDC9BCD";
+       MY(count) = 0.600000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_shotgun_alien) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x204010";
+       MY(count) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 8;
+       MY(size_max) = 16;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// shotgun damage effect, robot blood
+DEF(damage_shotgun_robot);
+SUB(damage_shotgun_robot) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(count) = 0.600000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_shotgun_robot) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x301860";
+       MY(count) = 1;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 8;
+       MY(size_max) = 16;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// machinegun damage effect, normal blood
+DEF(damage_uzi);
+SUB(damage_uzi) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_uzi) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x420000";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// machinegun damage effect, alien blood
+DEF(damage_uzi_alien);
+SUB(damage_uzi_alien) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xDC9BCD";
+       MY(color_max) = "0xDC9BCD";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_uzi_alien) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x204010";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// machinegun damage effect, robot blood
+DEF(damage_uzi_robot);
+SUB(damage_uzi_robot) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_uzi_robot) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x301860";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// minelayer damage effect
+DEF(damage_minelayer);
+SUB(damage_minelayer) {
+       MY(alpha_min) = 512;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3;
+       MY(gravity) = -0.500000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -15;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(damage_minelayer) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 2;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// mortar damage effect
+DEF(damage_grenadelauncher);
+SUB(damage_grenadelauncher) {
+       MY(alpha_min) = 512;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 3;
+       MY(gravity) = -0.500000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -15;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(damage_grenadelauncher) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 2;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = 5;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// electro damage effect
+DEF(damage_electro);
+SUB(damage_electro) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 48;
+       MY(alpha_max) = 8;
+       MY(alpha_fade) = 48;
+       MY(color_min) = "0x66ffff";
+       MY(color_max) = "0x2288ff";
+       MY(count) = 2;
+       MY(gravity) = -0.000100;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '3.0 3.0 3.0';
+       MY(startangle_min) = 180;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = -14;
+       MY(size_min) = 6;
+       MY(size_max) = 10;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "static";
+       MY(velocityjitter) = '8.0 8.0 16.0';
+}
+// plasma smoke
+SUB(damage_electro) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x2244ff";
+       MY(color_max) = "0x002266";
+       MY(count) = 4;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.4 0.4 0.6';
+}
+// bouncing sparks
+SUB(damage_electro) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 768;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 256;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x003090";
+       MY(color_max) = "0x00CCFF";
+       MY(count) = 0.500000;
+       MY(gravity) = 0.200000;
+       MY(liquidfriction) = 0.800000;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(tex_min) = 66;
+       MY(tex_max) = 68;
+       MY(type) = "spark";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+}
+
+// crylink damage effect
+DEF(damage_crylink);
+SUB(damage_crylink) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 48;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 48;
+       MY(color_min) = "0xff44ff";
+       MY(color_max) = "0x9966ff";
+       MY(count) = 2;
+       MY(gravity) = -0.000100;
+       MY(liquidfriction) = 0.800000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '3.0 3.0 3.0';
+       MY(startangle_min) = 180;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = -8;
+       MY(size_min) = 0.500000;
+       MY(size_max) = 1;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(type) = "static";
+       MY(velocityjitter) = '10.0 10.0 20.0';
+}
+// plasma smoke
+SUB(damage_crylink) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x8844ff";
+       MY(color_max) = "0x662244";
+       MY(count) = 4;
+       MY(gravity) = 0.001000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 6;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.4 0.4 0.6';
+}
+// floating sparks
+SUB(damage_crylink) {
+       MY(airfriction) = 0.200000;
+       MY(alpha_min) = 192;
+       MY(alpha_max) = 192;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x903090";
+       MY(color_max) = "0xFFD0FF";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 0.800000;
+       MY(sizeincrease) = -5;
+       MY(size_min) = 0.500000;
+       MY(size_max) = 0.500000;
+       MY(type) = "spark";
+       MY(velocityjitter) = '12.0 12.0 12.0';
+}
+
+// hlac damage effect
+DEF(damage_hlac);
+SUB(damage_hlac) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x880000";
+       MY(color_max) = "0xff4400";
+       MY(count) = 3;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.4 0.4 0.6';
+}
+
+// vortex damage effect
+DEF(damage_nex);
+SUB(damage_nex) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 8;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xffffff";
+       MY(color_max) = "0x88ffff";
+       MY(count) = 1;
+       MY(gravity) = -0.000100;
+       MY(liquidfriction) = 0.600000;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(startangle_min) = 180;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = -14;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "static";
+       MY(velocityjitter) = '8.0 8.0 16.0';
+}
+// plasma smoke
+SUB(damage_nex) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x6688ff";
+       MY(color_max) = "0x226688";
+       MY(count) = 2;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 8;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.5 0.5 0.8';
+}
+// bouncing sparks
+SUB(damage_nex) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 112;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 0.200000;
+       MY(gravity) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(stretchfactor) = 0.700000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 300.0';
+       MY(velocitymultiplier) = 3;
+}
+
+// vaporizer damage effect
+DEF(damage_minstanex);
+SUB(damage_minstanex) {
+       MY(airfriction) = -0.500000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 8;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0xffffff";
+       MY(color_max) = "0x88ffff";
+       MY(count) = 2;
+       MY(gravity) = -0.000100;
+       MY(liquidfriction) = 0.600000;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(startangle_min) = 180;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = -14;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_min) = 47;
+       MY(tex_max) = 47;
+       MY(type) = "static";
+       MY(velocityjitter) = '8.0 8.0 16.0';
+}
+// plasma smoke
+SUB(damage_minstanex) {
+       MY(airfriction) = -0.350000;
+       MY(alpha_min) = 64;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 64;
+       MY(color_min) = "0x6688ff";
+       MY(color_max) = "0x226688";
+       MY(count) = 4;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_max) = 180;
+       MY(spin_min) = -30;
+       MY(spin_max) = 30;
+       MY(sizeincrease) = 8;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.5 0.5 0.8';
+}
+// bouncing sparks
+SUB(damage_minstanex) {
+       MY(airfriction) = 2;
+       MY(alpha_min) = 255;
+       MY(alpha_max) = 255;
+       MY(alpha_fade) = 112;
+       MY(bounce) = 1.600000;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0xD9FDFF";
+       MY(count) = 0.200000;
+       MY(gravity) = 1;
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(stretchfactor) = 0.700000;
+       MY(tex_min) = 41;
+       MY(tex_max) = 41;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 300.0';
+       MY(velocitymultiplier) = 3;
+}
+
+// rifle damage effect, normal blood
+DEF(damage_rifle);
+SUB(damage_rifle) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xA8FFFF";
+       MY(color_max) = "0xA8FFFFF";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_rifle) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x420000";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// rifle damage effect, alien blood
+DEF(damage_rifle_alien);
+SUB(damage_rifle_alien) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xDC9BCD";
+       MY(color_max) = "0xDC9BCD";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_rifle_alien) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x204010";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// rifle damage effect, robot blood
+DEF(damage_rifle_robot);
+SUB(damage_rifle_robot) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = -1;
+       MY(color_min) = "0xC0D890";
+       MY(color_max) = "0xC0D890";
+       MY(count) = 0.300000;
+       MY(liquidfriction) = 4;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(staincolor_min) = "0x808080";
+       MY(staincolor_max) = "0x808080";
+       MY(staintex_min) = 16;
+       MY(staintex_max) = 24;
+       MY(tex_min) = 24;
+       MY(tex_max) = 32;
+       MY(type) = "blood";
+       MY(velocityjitter) = '32.0 32.0 32.0';
+       MY(velocitymultiplier) = 5;
+}
+// blood mist
+SUB(damage_rifle_robot) {
+       MY(alpha_min) = 100;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 400;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x301860";
+       MY(count) = 1;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+}
+
+// seeker damage effect
+DEF(damage_seeker);
+SUB(damage_seeker) {
+       MY(alpha_min) = 512;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x8f0c00";
+       MY(color_max) = "0xff2200";
+       MY(count) = 3;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(damage_seeker) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 2;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// hagar damage effect
+DEF(damage_hagar);
+SUB(damage_hagar) {
+       MY(alpha_min) = 512;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x8f0c00";
+       MY(color_max) = "0xff3a00";
+       MY(count) = 3;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(damage_hagar) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 2;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 2;
+       MY(size_max) = 4;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// fireball damage effect
+DEF(damage_fireball);
+SUB(damage_fireball) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 16;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x8f0d00";
+       MY(color_max) = "0xff5a00";
+       MY(count) = 4;
+       MY(gravity) = -0.500000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '8.0 8.0 8.0';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 50.0';
+}
+// smoke
+SUB(damage_fireball) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 4;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// rocketlauncher damage effect
+DEF(damage_rocketlauncher);
+SUB(damage_rocketlauncher) {
+       MY(alpha_min) = 512;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x8f0c00";
+       MY(color_max) = "0xff2a00";
+       MY(count) = 3;
+       MY(gravity) = -0.700000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '22.0 22.0 30.0';
+}
+// smoke
+SUB(damage_rocketlauncher) {
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 32;
+       MY(alpha_fade) = 128;
+       MY(color_min) = "0x000000";
+       MY(color_max) = "0x111111";
+       MY(count) = 3;
+       MY(gravity) = -0.300000;
+       MY(notunderwater) = true;
+       MY(originjitter) = '4.0 4.0 4.0';
+       MY(sizeincrease) = 10;
+       MY(size_min) = 4;
+       MY(size_max) = 8;
+       MY(tex_max) = 8;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '11.0 11.0 50.0';
+}
+
+// fireflies
+DEF(fireflies);
+SUB(fireflies) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 70;
+       MY(bounce) = -1;
+       MY(color_min) = "0xff9600";
+       MY(color_max) = "0xffefb8";
+       MY(count) = 1;
+       MY(originjitter) = '32.0 32.0 32.0';
+       MY(originoffset) = '8.0 8.0 8.0';
+       MY(sizeincrease) = -0.300000;
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(tex_min) = 38;
+       MY(tex_max) = 38;
+       MY(time_min) = 1;
+       MY(time_max) = 2;
+       MY(type) = "static";
+       MY(velocityjitter) = '64.0 64.0 64.0';
+       MY(velocityoffset) = '2.0 2.0 2.0';
+}
+
+DEF(healray_muzzleflash);
+SUB(healray_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x283880";
+       MY(color_max) = "0x283880";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 20;
+       MY(size_max) = 20;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(healray_muzzleflash) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 150;
+       MY(alpha_fade) = 1924;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0x00f0ff";
+       MY(count) = 22;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 3;
+       MY(size_min) = 1;
+       MY(size_max) = 15;
+       MY(stretchfactor) = 3.900000;
+       MY(tex_min) = 71;
+       MY(tex_max) = 73;
+       MY(type) = "spark";
+       MY(velocityjitter) = '150.0 150.0 150.0';
+       MY(velocitymultiplier) = 0.400000;
+}
+SUB(healray_muzzleflash) {
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 4024;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0x00f0ff";
+       MY(count) = 4;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 1;
+       MY(stretchfactor) = 0.200000;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(type) = "spark";
+       MY(velocityjitter) = '650.0 650.0 650.0';
+       MY(velocitymultiplier) = 1.100000;
+}
+
+DEF(healray_impact);
+SUB(healray_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(color_min) = "0xd800ff";
+       MY(color_max) = "0xd800ff";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '0.0 4.4 0.0';
+       MY(lightradiusfade) = 450;
+       MY(lightradius) = 125;
+       MY(originjitter) = '17.0 17.0 17.0';
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// shockwave
+SUB(healray_impact) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x84c52f";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1400;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 44;
+}
+// cloud of bouncing sparks
+SUB(healray_impact) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 300;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x84c52f";
+       MY(count) = 30;
+       MY(gravity) = 2;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(type) = "spark";
+       MY(velocityjitter) = '1112.0 1112.0 1112.0';
+}
+// inner cloud of smoke
+SUB(healray_impact) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 456;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x84c52f";
+       MY(count) = 15;
+       MY(gravity) = -2;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -90;
+       MY(spin_max) = 90;
+       MY(size_min) = 2;
+       MY(size_max) = 3;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '120.0 120.0 420.0';
+}
+
+DEF(bigplasma_muzzleflash);
+SUB(bigplasma_muzzleflash) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 812;
+       MY(color_min) = "0x283880";
+       MY(color_max) = "0x283880";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '1.5 3.0 6.0';
+       MY(lightradiusfade) = 2000;
+       MY(lightradius) = 200;
+       MY(originjitter) = '1.5 1.5 1.5';
+       MY(sizeincrease) = -10;
+       MY(size_min) = 50;
+       MY(size_max) = 50;
+       MY(tex_min) = 65;
+       MY(tex_max) = 65;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '6.0 6.0 6.0';
+       MY(velocitymultiplier) = 0.010000;
+}
+SUB(bigplasma_muzzleflash) {
+       MY(alpha_min) = 56;
+       MY(alpha_max) = 56;
+       MY(alpha_fade) = 1112;
+       MY(color_min) = "0x00f0ff";
+       MY(color_max) = "0x00f0ff";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 300;
+       MY(size_min) = 20;
+       MY(size_max) = 20;
+       MY(tex_min) = 74;
+       MY(tex_max) = 74;
+       MY(type) = "smoke";
+}
+SUB(bigplasma_muzzleflash) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 50;
+       MY(alpha_max) = 150;
+       MY(alpha_fade) = 1924;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0x00f0ff";
+       MY(count) = 14;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(sizeincrease) = 135;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(stretchfactor) = 1.900000;
+       MY(tex_min) = 51;
+       MY(tex_max) = 55;
+       MY(type) = "spark";
+       MY(velocityjitter) = '350.0 350.0 350.0';
+       MY(velocitymultiplier) = 0.400000;
+}
+SUB(bigplasma_muzzleflash) {
+       MY(alpha_min) = 110;
+       MY(alpha_max) = 228;
+       MY(alpha_fade) = 4024;
+       MY(color_min) = "0xD9FDFF";
+       MY(color_max) = "0x00f0ff";
+       MY(count) = 4;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 20;
+       MY(size_max) = 20;
+       MY(stretchfactor) = 0.200000;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(type) = "spark";
+       MY(velocityjitter) = '650.0 650.0 650.0';
+       MY(velocitymultiplier) = 1.100000;
+}
+
+DEF(bigplasma_impact);
+SUB(bigplasma_impact) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.1 4.4 10.0';
+       MY(lightradiusfade) = 450;
+       MY(lightradius) = 125;
+       MY(originjitter) = '17.0 17.0 17.0';
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 59;
+       MY(tex_max) = 59;
+       MY(type) = "decal";
+}
+// shockwave
+SUB(bigplasma_impact) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x80C0FF";
+       MY(color_max) = "0x80C0FF";
+       MY(countabsolute) = 1;
+       MY(sizeincrease) = 1400;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 44;
+}
+// cloud of bouncing sparks
+SUB(bigplasma_impact) {
+       MY(airfriction) = 6;
+       MY(alpha_min) = 156;
+       MY(alpha_max) = 300;
+       MY(alpha_fade) = 1024;
+       MY(color_min) = "0x629dff";
+       MY(color_max) = "0x0018ff";
+       MY(count) = 30;
+       MY(gravity) = 2;
+       MY(originjitter) = '1.0 1.0 1.0';
+       MY(size_min) = 1;
+       MY(size_max) = 2;
+       MY(tex_min) = 70;
+       MY(tex_max) = 70;
+       MY(type) = "spark";
+       MY(velocityjitter) = '1512.0 1512.0 1512.0';
+}
+// inner cloud of smoke
+SUB(bigplasma_impact) {
+       MY(airfriction) = 30;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 456;
+       MY(alpha_fade) = 1512;
+       MY(color_min) = "0x629dff";
+       MY(color_max) = "0x0018ff";
+       MY(count) = 15;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -9;
+       MY(spin_max) = 9;
+       MY(sizeincrease) = 555;
+       MY(size_min) = 20;
+       MY(size_max) = 24;
+       MY(tex_min) = 48;
+       MY(tex_max) = 55;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '320.0 320.0 320.0';
+}
+// smoke
+SUB(bigplasma_impact) {
+       MY(airfriction) = 0.040000;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 328;
+       MY(alpha_fade) = 390;
+       MY(blend) = "alpha";
+       MY(color_min) = "0x222222";
+       MY(color_max) = "0x000000";
+       MY(count) = 16;
+       MY(gravity) = 0.400000;
+       MY(originjitter) = '80.0 80.0 10.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 2;
+       MY(spin_max) = -2;
+       MY(sizeincrease) = 30;
+       MY(size_min) = 60;
+       MY(size_max) = 30;
+       MY(tex_max) = 7;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '100.0 100.0 200.0';
+       MY(velocityoffset) = '0.0 0.0 180.0';
+}
+// smoke in the middle
+SUB(bigplasma_impact) {
+       MY(airfriction) = 0.040000;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 328;
+       MY(alpha_fade) = 310;
+       MY(color_min) = "0x222222";
+       MY(color_max) = "0x000000";
+       MY(count) = 10;
+       MY(gravity) = -0.200000;
+       MY(originjitter) = '80.0 80.0 80.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 20;
+       MY(spin_max) = -20;
+       MY(sizeincrease) = -10;
+       MY(size_min) = 60;
+       MY(size_max) = 70;
+       MY(tex_max) = 7;
+       MY(type) = "alphastatic";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+}
+
+#include "effectinfo_ctf.inc"
+
+// spawn_point -- team idle spawn point effect
+#define spawn_point(name, color) \
+       DEF(spawn_point_##name); \
+       SUB(spawn_point_##name) { \
+               MY(airfriction) = 0.200000; \
+               MY(alpha_min) = 64; \
+               MY(alpha_max) = 128; \
+               MY(alpha_fade) = 128; \
+               MY(color_min) = color; \
+               MY(color_max) = color; \
+               MY(count) = 37.500000; \
+               MY(gravity) = -0.100000; \
+               MY(liquidfriction) = 0.800000; \
+               MY(originjitter) = '16.0 16.0 64.0'; \
+               MY(size_min) = 1; \
+               MY(size_max) = 2; \
+               MY(type) = "static"; \
+               MY(velocityjitter) = '32.0 32.0 0.0'; \
+       }
+
+spawn_point(red,               "0xFF0F0F")
+spawn_point(blue,              "0x0F0FFF")
+spawn_point(yellow,    "0xFFFF0F")
+spawn_point(pink,              "0xFF0FFF")
+spawn_point(neutral,   "0xFFFFFF")
+#undef spawn_point
+
+// spawn_event -- team spawning effect
+#define spawn_event(name, color) \
+       DEF(spawn_event_##name); \
+       SUB(spawn_event_##name) { \
+               MY(airfriction) = 2; \
+               MY(alpha_max) = 256; \
+               MY(alpha_fade) = 256; \
+               MY(bounce) = 1; \
+               MY(color_min) = color; \
+               MY(color_max) = color; \
+               MY(count) = 100; \
+               MY(originjitter) = '1.0 1.0 1.0'; \
+               MY(size_min) = 1; \
+               MY(size_max) = 1; \
+               MY(stretchfactor) = 0.600000; \
+               MY(tex_min) = 64; \
+               MY(tex_max) = 64; \
+               MY(type) = "spark"; \
+               MY(velocityjitter) = '500.0 500.0 500.0'; \
+               MY(velocitymultiplier) = 0.100000; \
+       } \
+       SUB(spawn_event_##name) { \
+               MY(alpha_min) = 190; \
+               MY(alpha_max) = 190; \
+               MY(alpha_fade) = 180; \
+               MY(color_min) = color; \
+               MY(color_max) = color; \
+               MY(countabsolute) = 1; \
+               MY(sizeincrease) = -80; \
+               MY(size_min) = 100; \
+               MY(size_max) = 100; \
+               MY(tex_min) = 65; \
+               MY(tex_max) = 65; \
+               MY(type) = "smoke"; \
+       } \
+       /**/
+
+spawn_event(red,               "0xFF0F0F")
+spawn_event(blue,              "0x0F0FFF")
+spawn_event(yellow,    "0xFFFF0F")
+spawn_event(pink,              "0xFF0FFF")
+spawn_event(neutral,   "0xFFFFFF")
+#undef spawn_event
+
+#include "effectinfo_nades.inc"
+
+DEF(shockwave_attack);
+// electricity
+SUB(shockwave_attack) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 4096;
+       MY(alpha_max) = 4096;
+       MY(alpha_fade) = 20000;
+       MY(color_min) = "0xb44215";
+       MY(color_max) = "0xff0000";
+       MY(count) = 1;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = 4000;
+       MY(spin_max) = -4000;
+       MY(sizeincrease) = 1.500000;
+       MY(size_min) = 5;
+       MY(size_max) = 7;
+       MY(stretchfactor) = 2.300000;
+       MY(tex_min) = 43;
+       MY(tex_max) = 43;
+       MY(type) = "spark";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+       MY(velocitymultiplier) = 10;
+}
+// fire
+SUB(shockwave_attack) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 4096;
+       MY(alpha_max) = 4096;
+       MY(alpha_fade) = 20000;
+       MY(color_min) = "0xff4200";
+       MY(color_max) = "0xff0000";
+       MY(count) = 1;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(sizeincrease) = 1.500000;
+       MY(size_min) = 7;
+       MY(size_max) = 9;
+       MY(stretchfactor) = 2;
+       MY(tex_min) = 8;
+       MY(tex_max) = 15;
+       MY(type) = "spark";
+       MY(velocityjitter) = '10.0 10.0 10.0';
+       MY(velocitymultiplier) = 10;
+}
+
+DEF(arc_lightning);
+// impact decal
+SUB(arc_lightning) {
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 32;
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '3.1 4.4 10.0';
+       MY(lightradiusfade) = 200;
+       MY(lightradius) = 50;
+       MY(originjitter) = '2.0 2.0 2.0';
+       MY(size_min) = 16;
+       MY(size_max) = 16;
+       MY(tex_min) = 16;
+       MY(tex_max) = 32;
+       MY(type) = "decal";
+}
+// impact sparks
+SUB(arc_lightning) {
+       MY(airfriction) = 110;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0xDDFDFF";
+       MY(color_max) = "0xFDFDFF";
+       MY(count) = 100;
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(startangle_max) = 360;
+       MY(spin_min) = -36000;
+       MY(spin_max) = 36000;
+       MY(sizeincrease) = -5;
+       MY(size_max) = 5;
+       MY(stretchfactor) = 1;
+       MY(tex_min) = 71;
+       MY(tex_max) = 74;
+       MY(type) = "static";
+       MY(velocityjitter) = '250.0 250.0 250.0';
+       MY(velocitymultiplier) = 100;
+}
+// impact sparks (underwater)
+SUB(arc_lightning) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0xDDFDFF";
+       MY(color_max) = "0xFDFDFF";
+       MY(count) = 100;
+       MY(liquidfriction) = 5;
+       MY(orientation) = "spark";
+       MY(originjitter) = '20.0 20.0 20.0';
+       MY(startangle_max) = 360;
+       MY(spin_min) = -36000;
+       MY(spin_max) = 36000;
+       MY(sizeincrease) = -5;
+       MY(size_max) = 5;
+       MY(stretchfactor) = 1;
+       MY(tex_min) = 71;
+       MY(tex_max) = 74;
+       MY(type) = "static";
+       MY(underwater) = true;
+       MY(velocityjitter) = '250.0 250.0 250.0';
+       MY(velocitymultiplier) = 20;
+}
+
+DEF(arc_beam);
+// sparks on beam
+SUB(arc_beam) {
+       MY(airfriction) = -10;
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 16384;
+       MY(color_min) = "0xfafad2";
+       MY(color_max) = "0xffffff";
+       MY(originjitter) = '3.0 3.0 3.0';
+       MY(relativeoriginoffset) = '10.0 0.0 0.0';
+       MY(startangle_max) = 360;
+       MY(spin_min) = 360;
+       MY(spin_max) = 1000;
+       MY(stretchfactor) = 1;
+       MY(tex_min) = 71;
+       MY(tex_max) = 74;
+       MY(time_min) = 0.050000;
+       MY(time_max) = 0.050000;
+       MY(trailspacing) = 10;
+       MY(type) = "spark";
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 200;
+}
+// sparks on beam (underwater)
+SUB(arc_beam) {
+       MY(alpha_min) = 256;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 16384;
+       MY(color_min) = "0xfafad2";
+       MY(color_max) = "0xffffff";
+       MY(liquidfriction) = -10;
+       MY(originjitter) = '30.0 30.0 30.0';
+       MY(relativeoriginoffset) = '10.0 0.0 0.0';
+       MY(startangle_max) = 360;
+       MY(spin_min) = 360;
+       MY(spin_max) = 1000;
+       MY(stretchfactor) = 1;
+       MY(tex_min) = 71;
+       MY(tex_max) = 74;
+       MY(time_min) = 0.001000;
+       MY(time_max) = 0.001000;
+       MY(trailspacing) = 10;
+       MY(type) = "spark";
+       MY(underwater) = true;
+       MY(velocityjitter) = '100.0 100.0 100.0';
+       MY(velocitymultiplier) = 200;
+}
+
+DEF(arc_beam_heal);
+// bubble this...
+SUB(arc_beam_heal) {
+       MY(airfriction) = -20;
+       MY(alpha_min) = 2048;
+       MY(alpha_max) = 2048;
+       MY(alpha_fade) = 256;
+       MY(color_min) = "0x20FF20";
+       MY(color_max) = "0x40FF40";
+       MY(relativeoriginoffset) = '5.0 0.0 0.0';
+       MY(relativevelocityoffset) = '100.0 0.0 0.0';
+       MY(sizeincrease) = 20;
+       MY(size_min) = 0.100000;
+       MY(size_max) = 0.100000;
+       MY(tex_min) = 74;
+       MY(tex_max) = 74;
+       MY(trailspacing) = 1500;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '3.0 3.0 3.0';
+       MY(velocitymultiplier) = 200;
+}
+
+DEF(arc_beam_healimpact);
+// healing "aura"
+SUB(arc_beam_healimpact) {
+       MY(alpha_min) = 40;
+       MY(alpha_max) = 40;
+       MY(alpha_fade) = 350;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x84c52f";
+       MY(countabsolute) = 1;
+       MY(lightcolor) = '0.0 4.4 0.0';
+       MY(lightradiusfade) = 150;
+       MY(lightradius) = 20;
+       MY(sizeincrease) = -1000;
+       MY(size_min) = 32;
+       MY(size_max) = 32;
+       MY(tex_min) = 33;
+       MY(tex_max) = 33;
+       MY(type) = "smoke";
+       MY(velocitymultiplier) = 44;
+}
+// rising "smoke"
+SUB(arc_beam_healimpact) {
+       MY(airfriction) = 3;
+       MY(alpha_min) = 200;
+       MY(alpha_max) = 456;
+       MY(alpha_fade) = 512;
+       MY(color_min) = "0x00ff00";
+       MY(color_max) = "0x84c52f";
+       MY(count) = 15;
+       MY(gravity) = -2;
+       MY(startangle_min) = -180;
+       MY(startangle_max) = 180;
+       MY(spin_min) = -90;
+       MY(spin_max) = 90;
+       MY(size_min) = 0.500000;
+       MY(size_max) = 1;
+       MY(tex_min) = 40;
+       MY(tex_max) = 40;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '120.0 120.0 420.0';
+}
+
+DEF(arc_smoke);
+// arc heat smoke  (notunderwater)
+SUB(arc_smoke) {
+       MY(airfriction) = 1;
+       MY(alpha_min) = 32;
+       MY(alpha_max) = 64;
+       MY(alpha_fade) = 48;
+       MY(color_min) = "0x4c453f";
+       MY(color_max) = "0x2a241f";
+       MY(count) = 2;
+       MY(gravity) = -0.125000;
+       MY(notunderwater) = true;
+       MY(startangle_max) = 360;
+       MY(spin_min) = -180;
+       MY(spin_max) = 180;
+       MY(sizeincrease) = 10;
+       MY(size_min) = 5;
+       MY(size_max) = 10;
+       MY(tex_max) = 8;
+       MY(type) = "smoke";
+       MY(velocityjitter) = '0.0 0.0 16.0';
+}
+// arc heat bubbles  (underwater)
+SUB(arc_smoke) {
+       MY(alpha_min) = 170;
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 64;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x404040";
+       MY(color_max) = "0x808080";
+       MY(count) = 2;
+       MY(gravity) = -0.125000;
+       MY(liquidfriction) = 0.250000;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 0.100000;
+       MY(size_max) = 1;
+       MY(tex_min) = 62;
+       MY(tex_max) = 62;
+       MY(type) = "bubble";
+       MY(underwater) = true;
+       MY(velocityjitter) = '16.0 16.0 16.0';
+}
+
+DEF(arc_overheat);
+// arc overheat electric bolts
+SUB(arc_overheat) {
+       MY(airfriction) = 5;
+       MY(alpha_min) = 128;
+       MY(alpha_max) = 128;
+       MY(alpha_fade) = 292;
+       MY(color_min) = "0xffffff";
+       MY(color_max) = "0x9271fb";
+       MY(count) = 24;
+       MY(gravity) = -0.400000;
+       MY(liquidfriction) = 10;
+       MY(originjitter) = '10.0 10.0 10.0';
+       MY(sizeincrease) = -24;
+       MY(size_min) = 6;
+       MY(size_max) = 12;
+       MY(tex_min) = 43;
+       MY(tex_max) = 43;
+       MY(type) = "spark";
+       MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+DEF(arc_overheat_fire);
+// arc overheat bouncing sparks
+SUB(arc_overheat_fire) {
+       MY(alpha_max) = 256;
+       MY(alpha_fade) = 640;
+       MY(bounce) = 1.500000;
+       MY(color_min) = "0x4444ff";
+       MY(color_max) = "0xeeeeff";
+       MY(count) = 1;
+       MY(gravity) = 1;
+       MY(liquidfriction) = 5;
+       MY(originjitter) = '6.0 6.0 6.0';
+       MY(size_min) = 0.400000;
+       MY(size_max) = 1;
+       MY(type) = "spark";
+       MY(velocityjitter) = '92.0 92.0 92.0';
+       MY(velocitymultiplier) = 80;
+       MY(velocityoffset) = '0.0 0.0 80.0';
+}
+
+#include "effectinfo_buffs.inc"
+
+#include "effectinfo_instagib.inc"
diff --git a/qcsrc/common/effects/effectinfo.qc b/qcsrc/common/effects/effectinfo.qc
new file mode 100644 (file)
index 0000000..e27d2c9
--- /dev/null
@@ -0,0 +1,310 @@
+#define EFFECTINFO_PARSER(on) \
+    on(airfriction,                                 MY(airfriction) \
+    ,{ ASSERT(n == 1 && "airfriction");             MY(airfriction) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(airfriction)) \
+    )) \
+    on(alpha,                                       MY(alpha_min) ||                    MY(alpha_max) ||                MY(alpha_fade) \
+    ,{ ASSERT(n == 3 && "alpha");                   MY(alpha_min) = stof(argv(1));      MY(alpha_max) = stof(argv(2));  MY(alpha_fade) = stof(argv(3)); \
+    }, sprintf(" %s %s %s",                         ftos(MY(alpha_min)),                ftos(MY(alpha_max)),            ftos(MY(alpha_fade)) \
+    )) \
+    on(blend,                                       MY(blend) \
+    ,{ ASSERT(n == 1 && "blend");                   MY(blend) = argv(1); \
+    }, sprintf(" %s",                               (MY(blend)) \
+    )) \
+    on(bounce,                                      MY(bounce) \
+    ,{ ASSERT(n == 1 && "bounce");                  MY(bounce) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(bounce)) \
+    )) \
+    on(color,                                       MY(color_min) ||                    MY(color_max) \
+    ,{ ASSERT(n == 2 && "color");                   MY(color_min) = argv(1);            MY(color_max) = argv(2); \
+    }, sprintf(" %s %s",                            (MY(color_min)),                    (MY(color_max)) \
+    )) \
+    on(countabsolute,                               MY(countabsolute) \
+    ,{ ASSERT(n == 1 && "countabsolute");           MY(countabsolute) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(countabsolute)) \
+    )) \
+    on(count,                                       MY(count) \
+    ,{ ASSERT(n == 1 && "count");                   MY(count) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(count)) \
+    )) \
+    on(gravity,                                     MY(gravity) \
+    ,{ ASSERT(n == 1 && "gravity");                 MY(gravity) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(gravity)) \
+    )) \
+    on(lightcolor,                                  MY(lightcolor) \
+    ,{ ASSERT(n == 3 && "lightcolor");              MY(lightcolor) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(lightcolor)) \
+    )) \
+    on(lightradiusfade,                             MY(lightradiusfade) \
+    ,{ ASSERT(n == 1 && "lightradiusfade");         MY(lightradiusfade) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(lightradiusfade)) \
+    )) \
+    on(lightradius,                                 MY(lightradius) \
+    ,{ ASSERT(n == 1 && "lightradius");             MY(lightradius) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(lightradius)) \
+    )) \
+    on(lighttime,                                   MY(lighttime) \
+    ,{ ASSERT(n == 1 && "lighttime");               MY(lighttime) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(lighttime)) \
+    )) \
+    on(liquidfriction,                              MY(liquidfriction) \
+    ,{ ASSERT(n == 1 && "liquidfriction");          MY(liquidfriction) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(liquidfriction)) \
+    )) \
+    on(notunderwater,                               MY(notunderwater) \
+    ,{ ASSERT(n == 0 && "notunderwater");           MY(notunderwater) = true; \
+    }, "" \
+    ) \
+    on(orientation,                                 MY(orientation) \
+    ,{ ASSERT(n == 1 && "orientation");             MY(orientation) = argv(1); \
+    }, sprintf(" %s",                               (MY(orientation)) \
+    )) \
+    on(originjitter,                                MY(originjitter) \
+    ,{ ASSERT(n == 3 && "originjitter");            MY(originjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(originjitter)) \
+    )) \
+    on(originoffset,                                MY(originoffset) \
+    ,{ ASSERT(n == 3 && "originoffset");            MY(originoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(originoffset)) \
+    )) \
+    on(relativeoriginoffset,                        MY(relativeoriginoffset) \
+    ,{ ASSERT(n == 3 && "relativeoriginoffset");    MY(relativeoriginoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(relativeoriginoffset)) \
+    )) \
+    on(relativevelocityoffset,                      MY(relativevelocityoffset) \
+    ,{ ASSERT(n == 3 && "relativevelocityoffset");  MY(relativevelocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(relativevelocityoffset)) \
+    )) \
+    on(rotate,                                      MY(startangle_min) ||               MY(startangle_max) ||               MY(spin_min) ||                 MY(spin_max) \
+    ,{ ASSERT(n == 4 && "rotate");                  MY(startangle_min) = stof(argv(1)); MY(startangle_max) = stof(argv(2)); MY(spin_min) = stof(argv(3));   MY(spin_max) = stof(argv(4)); \
+    }, sprintf(" %s %s %s %s",                      ftos(MY(startangle_min)),           ftos(MY(startangle_max)),           ftos(MY(spin_min)),             ftos(MY(spin_max)) \
+    )) \
+    on(sizeincrease,                                MY(sizeincrease) \
+    ,{ ASSERT(n == 1 && "sizeincrease");            MY(sizeincrease) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(sizeincrease)) \
+    )) \
+    on(size,                                        MY(size_min) ||                     MY(size_max) \
+    ,{ ASSERT(n == 2 && "size");                    MY(size_min) = stof(argv(1));       MY(size_max) = stof(argv(2)); \
+    }, sprintf(" %s %s",                            ftos(MY(size_min)),                 ftos(MY(size_max)) \
+    )) \
+    on(staincolor,                                  MY(staincolor_min) ||               MY(staincolor_max) \
+    ,{ ASSERT(n == 2 && "staincolor");              MY(staincolor_min) = argv(1);       MY(staincolor_max) = argv(2); \
+    }, sprintf(" %s %s",                            (MY(staincolor_min)),               (MY(staincolor_max)) \
+    )) \
+    on(stainsize,                                   MY(stainsize_min) ||                MY(stainsize_max) \
+    ,{ ASSERT(n == 2 && "stainsize");               MY(stainsize_min) = stof(argv(1));  MY(stainsize_max) = stof(argv(2)); \
+    }, sprintf(" %s %s",                            ftos(MY(stainsize_min)),            ftos(MY(stainsize_max)) \
+    )) \
+    on(staintex,                                    MY(staintex_min) ||                 MY(staintex_max) \
+    ,{ ASSERT(n == 2 && "staintex");                MY(staintex_min) = stof(argv(1));   MY(staintex_max) = stof(argv(2)); \
+    }, sprintf(" %s %s",                            ftos(MY(staintex_min)),             ftos(MY(staintex_max)) \
+    )) \
+    on(stretchfactor,                               MY(stretchfactor) \
+    ,{ ASSERT(n == 1 && "stretchfactor");           MY(stretchfactor) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(stretchfactor)) \
+    )) \
+    on(tex,                                         MY(tex_min) ||                      MY(tex_max) \
+    ,{ ASSERT(n == 2 && "tex");                     MY(tex_min) = stof(argv(1));        MY(tex_max) = stof(argv(2)); \
+    }, sprintf(" %s %s",                            ftos(MY(tex_min)),                  ftos(MY(tex_max)) \
+    )) \
+    on(time,                                        MY(time_min) ||                     MY(time_max) \
+    ,{ ASSERT(n == 2 && "time");                    MY(time_min) = stof(argv(1));       MY(time_max) = stof(argv(2)); \
+    }, sprintf(" %s %s",                            ftos(MY(time_min)),                 ftos(MY(time_max)) \
+    )) \
+    on(trailspacing,                                MY(trailspacing) \
+    ,{ ASSERT(n == 1 && "trailspacing");            MY(trailspacing) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(trailspacing)) \
+    )) \
+    on(type,                                        MY(type) \
+    ,{ ASSERT(n == 1 && "type");                    MY(type) = argv(1); \
+    }, sprintf(" %s",                               (MY(type)) \
+    )) \
+    on(underwater,                                  MY(underwater) \
+    ,{ ASSERT(n == 0 && "underwater");              MY(underwater) = true; \
+    }, "" \
+    ) \
+    on(velocityjitter,                              MY(velocityjitter) \
+    ,{ ASSERT(n == 3 && "velocityjitter");          MY(velocityjitter) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(velocityjitter)) \
+    )) \
+    on(velocitymultiplier,                          MY(velocitymultiplier) \
+    ,{ ASSERT(n == 1 && "velocitymultiplier");      MY(velocitymultiplier) = stof(argv(1)); \
+    }, sprintf(" %s",                               ftos(MY(velocitymultiplier)) \
+    )) \
+    on(velocityoffset,                              MY(velocityoffset) \
+    ,{ ASSERT(n == 3 && "velocityoffset");          MY(velocityoffset) = vec3(stof(argv(1)), stof(argv(2)), stof(argv(3))); \
+    }, sprintf(" %v",                               (MY(velocityoffset)) \
+    )) \
+    /**/
+
+CLASS(EffectInfo, Object)
+    ATTRIB(EffectInfo, effectinfo_name, string, string_null)
+    CONSTRUCTOR(EffectInfo, string s) {
+        CONSTRUCT(EffectInfo);
+        this.effectinfo_name = s;
+    }
+
+    #define FIELDS(MY) \
+    MY(airfriction, float, 0) \
+    MY(alpha_min, float, 0) \
+    MY(alpha_max, float, 0) \
+    MY(alpha_fade, float, 0) \
+    MY(blend, string, string_null) \
+    MY(bounce, float, 0) \
+    MY(color_min, string, string_null) \
+    MY(color_max, string, string_null) \
+    MY(countabsolute, float, 0) \
+    MY(count, float, 0) \
+    MY(gravity, float, 0) \
+    MY(lightcolor, vector, '0 0 0') \
+    MY(lightradiusfade, float, 0) \
+    MY(lightradius, float, 0) \
+    MY(lighttime, float, 0) \
+    MY(liquidfriction, float, 0) \
+    MY(notunderwater, bool, false) \
+    MY(orientation, string, string_null) \
+    MY(originjitter, vector, '0 0 0') \
+    MY(originoffset, vector, '0 0 0') \
+    MY(relativeoriginoffset, vector, '0 0 0') \
+    MY(relativevelocityoffset, vector, '0 0 0') \
+    MY(startangle_min, float, 0) \
+    MY(startangle_max, float, 0) \
+    MY(spin_min, float, 0) \
+    MY(spin_max, float, 0) \
+    MY(sizeincrease, float, 0) \
+    MY(size_min, float, 0) \
+    MY(size_max, float, 0) \
+    MY(staincolor_min, string, string_null) \
+    MY(staincolor_max, string, string_null) \
+    MY(stainsize_min, float, 0) \
+    MY(stainsize_max, float, 0) \
+    MY(staintex_min, float, 0) \
+    MY(staintex_max, float, 0) \
+    MY(stretchfactor, float, 0) \
+    MY(tex_min, float, 0) \
+    MY(tex_max, float, 0) \
+    MY(time_min, float, 0) \
+    MY(time_max, float, 0) \
+    MY(trailspacing, float, 0) \
+    MY(type, string, string_null) \
+    MY(underwater, bool, false) \
+    MY(velocityjitter, vector, '0 0 0') \
+    MY(velocitymultiplier, float, 0) \
+    MY(velocityoffset, vector, '0 0 0') \
+    /**/
+
+    #define MY(f, type, val) ATTRIB(EffectInfo, effectinfo_##f, type, val)
+    FIELDS(MY)
+    #undef MY
+
+    METHOD(EffectInfo, describe, string(EffectInfo this)) {
+        string s = sprintf("SUB(%s) {\n", this.effectinfo_name);
+        #define str_bool(it) (it ? "true" : "false")
+        #define str_float(it) ftos(it)
+        #define str_vector(it) vtos(it)
+        #define str_string(it) strcat("\"", it, "\"")
+        #define p(f, type, default) if (this.effectinfo_##f) { s = strcat(s, "\t", "MY("#f") = ", str_##type(this.effectinfo_##f), ";\n"); }
+        FIELDS(p)
+        #undef p
+        #undef MY
+        return strcat(s, "}\n");
+    }
+
+    METHOD(EffectInfo, dump, string(EffectInfo this)) {
+        string s = sprintf("effect %s\n", this.effectinfo_name);
+        #define MY(f) this.effectinfo_##f
+        #define p(k, isset, parse, unparse) if (isset) { s = strcat(s, "\t", #k, unparse, "\n"); }
+        EFFECTINFO_PARSER(p)
+        #undef p
+        #undef MY
+        return s;
+    }
+
+    #undef FIELDS
+ENDCLASS(EffectInfo)
+
+CLASS(EffectInfoGroup, Object)
+    ATTRIBARRAY(EffectInfoGroup, children, EffectInfo, 16)
+    ATTRIB(EffectInfoGroup, children_count, int, 0)
+ENDCLASS(EffectInfoGroup)
+
+void effectinfo_read()
+{
+    int fh = fopen("effectinfo.txt", FILE_READ);
+    EffectInfo info = NULL;
+    for (string line; (line = fgets(fh)); ) {
+        int n = tokenize_console(line);
+        if (n == 0) continue;
+        n--;
+        string k = argv(0);
+        if (k == "effect") {
+            ASSERT(n == 1);
+            info = NEW(EffectInfo, argv(1));
+            continue;
+        }
+        ASSERT(info != NULL);
+        switch (k) {
+            #define MY(f) info.effectinfo_##f
+            #define p(k, isset, parse, unparse) case #k: parse break;
+            EFFECTINFO_PARSER(p)
+            #undef p
+            #undef MY
+            default:
+                LOG_WARNINGF("Unknown property '%s'\n", k);
+                break;
+        }
+    }
+    fclose(fh);
+}
+
+void effectinfo_dump(int fh, bool alsoprint)
+{
+    #define WRITE(s) do { \
+        fputs(fh, s); \
+        if (alsoprint) LOG_INFO(s); \
+    } while (0)
+    WRITE("// ********************************************** //\n");
+    WRITE("// ** WARNING - DO NOT MANUALLY EDIT THIS FILE ** //\n");
+    WRITE("// **                                          ** //\n");
+    WRITE("// **  This file is automatically generated by ** //\n");
+    WRITE("// **  code with the command 'dumpeffectinfo'. ** //\n");
+    WRITE("// **                                          ** //\n");
+    WRITE("// **  If you modify an effect, please         ** //\n");
+    WRITE("// **  regenerate this file with that command. ** //\n");
+    WRITE("// **                                          ** //\n");
+    WRITE("// ********************************************** //\n");
+    WRITE("\n");
+
+    for (EffectInfo it = NULL; (it = findfloat(it, instanceOfEffectInfo, true)); ) {
+        if (it.classname == "vtbl") continue;
+        string s = it.dump(it);
+        WRITE(s);
+    }
+    #undef WRITE
+}
+
+
+void RegisterEffectInfo();
+const int MAX_EFFECTINFOS = 512;
+entity EFFECTINFOS[MAX_EFFECTINFOS], EFFECTINFOS_first, EFFECTINFOS_last;
+int EFFECTINFOS_COUNT;
+
+#define EFFECTINFO(name) \
+    [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { } \
+    REGISTER(RegisterEffectInfo, EFFECTINFO, EFFECTINFOS, EFFECTINFOS_COUNT, name, m_id, NEW(EffectInfoGroup)) { \
+        effectinfo_##name(this, NULL); \
+    }
+REGISTER_REGISTRY(RegisterEffectInfo)
+
+
+#define REGISTER_EFFECTINFO(id) var void effectinfo_##id(EffectInfoGroup parent)
+
+#define MY(f) this.effectinfo_##f
+#define DEF(name) EFFECTINFO(name)
+#define SUB(name) \
+    [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this) { parent = EFFECTINFO_##name; parent.children[parent.children_count++] = this = NEW(EffectInfo, #name); } \
+    [[accumulate]] void effectinfo_##name(EffectInfoGroup parent, EffectInfo this)
+#include "effectinfo.inc"
+#undef MY
+#undef DEF
+#undef SUB
diff --git a/qcsrc/common/effects/effectinfo_buffs.inc b/qcsrc/common/effects/effectinfo_buffs.inc
new file mode 100644 (file)
index 0000000..8ac9041
--- /dev/null
@@ -0,0 +1,305 @@
+DEF(relic_resistance);
+SUB(relic_resistance) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x00ff80";
+    MY(color_max) = "0x00ff80";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_regeneration);
+SUB(relic_regeneration) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x00ffff";
+    MY(color_max) = "0x00ffff";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_vampire);
+SUB(relic_vampire) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xff00ff";
+    MY(color_max) = "0xff00ff";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_ammo);
+SUB(relic_ammo) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x80ff00";
+    MY(color_max) = "0x80ff00";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_damage);
+SUB(relic_damage) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xff0000";
+    MY(color_max) = "0xff0000";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_ssplashdamage);
+SUB(relic_ssplashdamage) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xff8000";
+    MY(color_max) = "0xff8000";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_firingspeed);
+SUB(relic_firingspeed) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xffff00";
+    MY(color_max) = "0xffff00";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_disability);
+SUB(relic_disability) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x0000ff";
+    MY(color_max) = "0x0000ff";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_disability_curse);
+SUB(relic_disability_curse) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x000080";
+    MY(color_max) = "0x000080";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_teamboost);
+SUB(relic_teamboost) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0xffffff";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_teamboost_boost);
+SUB(relic_teamboost_boost) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x808080";
+    MY(color_max) = "0x808080";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_speed);
+SUB(relic_speed) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x80ffff";
+    MY(color_max) = "0x80ffff";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_jump);
+SUB(relic_jump) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xffff80";
+    MY(color_max) = "0xffff80";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_flight);
+SUB(relic_flight) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x8080ff";
+    MY(color_max) = "0x8080ff";
+    MY(count) = 1;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_radioactive);
+SUB(relic_radioactive) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0x00ff00";
+    MY(color_max) = "0x00ff00";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_resurrection);
+SUB(relic_resurrection) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xff0080";
+    MY(color_max) = "0xff0080";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
+
+DEF(relic_vengeance);
+SUB(relic_vengeance) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 256;
+    MY(color_min) = "0xff8080";
+    MY(color_max) = "0xff8080";
+    MY(count) = 20;
+    MY(gravity) = -0.100000;
+    MY(liquidfriction) = 0.800000;
+    MY(originjitter) = '8.0 8.0 32.0';
+    MY(size_min) = 1.500000;
+    MY(size_max) = 1.500000;
+    MY(type) = "static";
+    MY(velocityjitter) = '64.0 64.0 32.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_ctf.inc b/qcsrc/common/effects/effectinfo_ctf.inc
new file mode 100644 (file)
index 0000000..5794ad4
--- /dev/null
@@ -0,0 +1,123 @@
+// flag_touch -- effects for touching the flag
+#define flag_touch(name, colormin, colormax) \
+    DEF(name##flag_touch); \
+    SUB(name##flag_touch) { \
+        MY(airfriction) = 3; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 556; \
+        MY(bounce) = 1.500000; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(count) = 35; \
+        MY(gravity) = 1; \
+        MY(originjitter) = '1.0 1.0 1.0'; \
+        MY(size_min) = 1; \
+        MY(size_max) = 3; \
+        MY(tex_min) = 40; \
+        MY(tex_max) = 40; \
+        MY(type) = "spark"; \
+        MY(velocityjitter) = '300.0 300.0 300.0'; \
+        MY(velocitymultiplier) = 0.500000; \
+    }
+
+flag_touch(red,     "0xFF0000", "0x970000")
+flag_touch(blue,    "0x0000FF", "0x000097")
+flag_touch(yellow,  "0xFFFF0F", "0xFFFF0F")
+flag_touch(pink,    "0xFF0FFF", "0xFF0FFF")
+flag_touch(neutral, "0xFFFFFF", "0xFFFFFF")
+#undef flag_touch
+
+#define pass(name, colormin, colormax) \
+    DEF(name##_pass); \
+    SUB(name##_pass) { \
+        MY(airfriction) = 5; \
+        MY(alpha_min) = 64; \
+        MY(alpha_max) = 128; \
+        MY(alpha_fade) = 64; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(sizeincrease) = 2; \
+        MY(size_min) = 2; \
+        MY(size_max) = 2; \
+        MY(tex_min) = 32; \
+        MY(tex_max) = 32; \
+        MY(trailspacing) = 64; \
+        MY(type) = "static"; \
+    } \
+    SUB(name##_pass) { \
+        MY(airfriction) = 9; \
+        MY(alpha_min) = 32; \
+        MY(alpha_max) = 64; \
+        MY(alpha_fade) = 32; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(sizeincrease) = 8; \
+        MY(size_min) = 1; \
+        MY(size_max) = 1; \
+        MY(tex_max) = 8; \
+        MY(trailspacing) = 12; \
+        MY(type) = "static"; \
+        MY(velocityjitter) = '64.0 64.0 64.0'; \
+    } \
+    SUB(name##_pass) { \
+        MY(alpha_min) = 256; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 1280; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(size_min) = 4; \
+        MY(size_max) = 4; \
+        MY(trailspacing) = 12; \
+        MY(type) = "static"; \
+    } \
+    /**/
+
+pass(red,       "0xFF0000", "0x970000")
+pass(blue,      "0x0000FF", "0x000097")
+pass(yellow,    "0xFFFF0F", "0xFFFF0F")
+pass(pink,      "0xFFFFFF", "0xFFFFFF")
+pass(neutral,   "0xFFFFFF", "0xFFFFFF")
+#undef pass
+
+// cap -- team capture effect
+#define cap(name, colormin, colormax) \
+    DEF(name##_cap); \
+    SUB(name##_cap) { \
+        MY(airfriction) = 2; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 100; \
+        MY(bounce) = 1.500000; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(count) = 500; \
+        MY(originjitter) = '1.0 1.0 1.0'; \
+        MY(size_min) = 1; \
+        MY(size_max) = 1; \
+        MY(stretchfactor) = 0.600000; \
+        MY(tex_min) = 64; \
+        MY(tex_max) = 64; \
+        MY(type) = "spark"; \
+        MY(velocityjitter) = '1000.0 1000.0 1500.0'; \
+        MY(velocitymultiplier) = 0.500000; \
+    } \
+    SUB(name##_cap) { \
+        MY(alpha_min) = 190; \
+        MY(alpha_max) = 190; \
+        MY(alpha_fade) = 180; \
+        MY(color_min) = colormin; \
+        MY(color_max) = colormax; \
+        MY(countabsolute) = 1; \
+        MY(sizeincrease) = -80; \
+        MY(size_min) = 150; \
+        MY(size_max) = 150; \
+        MY(tex_min) = 65; \
+        MY(tex_max) = 65; \
+        MY(type) = "smoke"; \
+    } \
+    /**/
+
+cap(red,    "0xFF0000", "0x970000")
+cap(blue,   "0x0000FF", "0x000097")
+cap(yellow, "0xFFFF0F", "0xFFFF0F")
+cap(pink,   "0xFF0FFF", "0xFF0FFF")
+#undef cap
diff --git a/qcsrc/common/effects/effectinfo_gentle.inc b/qcsrc/common/effects/effectinfo_gentle.inc
new file mode 100644 (file)
index 0000000..aef1664
--- /dev/null
@@ -0,0 +1,121 @@
+// cl_gentle impact effect indicating damage
+// NOTE: maintained by div0, make your own new effect instead of changing this one without asking!
+DEF(damage_hit);
+SUB(damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x00FFFF";
+    MY(color_max) = "0xFF00FF";
+    MY(count) = 0.500000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -24;
+    MY(size_min) = 16;
+    MY(size_max) = 16;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '256.0 256.0 256.0';
+}
+SUB(damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFF00FF";
+    MY(color_max) = "0xFFFF00";
+    MY(count) = 0.500000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -24;
+    MY(size_min) = 16;
+    MY(size_max) = 16;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '256.0 256.0 256.0';
+}
+SUB(damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFFFF00";
+    MY(color_max) = "0x00FFFF";
+    MY(count) = 0.500000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -24;
+    MY(size_min) = 16;
+    MY(size_max) = 16;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '256.0 256.0 256.0';
+}
+
+// effect for removing player model
+DEF(damage_dissolve);
+// large sparks
+SUB(damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 128;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x00FFFF";
+    MY(color_max) = "0xFF00FF";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
+SUB(damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 128;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFF00FF";
+    MY(color_max) = "0xFFFF00";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
+SUB(damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 128;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFFFF00";
+    MY(color_max) = "0x00FFFF";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_gentle_happy.inc b/qcsrc/common/effects/effectinfo_gentle_happy.inc
new file mode 100644 (file)
index 0000000..4afbe00
--- /dev/null
@@ -0,0 +1,119 @@
+// happy death fx for cl_gentle
+DEF(happy_damage_dissolve);
+SUB(happy_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 228;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x00FFFF";
+    MY(color_max) = "0xFF00FF";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -10;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '312.0 312.0 312.0';
+}
+SUB(happy_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 228;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFF00FF";
+    MY(color_max) = "0xFFFF00";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -10;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '312.0 312.0 312.0';
+}
+SUB(happy_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 228;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFFFF00";
+    MY(color_max) = "0x00FFFF";
+    MY(count) = 15;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 6;
+    MY(sizeincrease) = -10;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '312.0 312.0 312.0';
+}
+
+// happy damage fx for cl_gentle
+DEF(happy_damage_hit);
+SUB(happy_damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x00FFFF";
+    MY(color_max) = "0xFF00FF";
+    MY(count) = 0.100000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -28;
+    MY(size_min) = 26;
+    MY(size_max) = 26;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '156.0 156.0 156.0';
+}
+SUB(happy_damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFF00FF";
+    MY(color_max) = "0xFFFF00";
+    MY(count) = 0.100000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -28;
+    MY(size_min) = 26;
+    MY(size_max) = 26;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '156.0 156.0 156.0';
+}
+SUB(happy_damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 192;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xFFFF00";
+    MY(color_max) = "0x00FFFF";
+    MY(count) = 0.100000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -28;
+    MY(size_min) = 26;
+    MY(size_max) = 26;
+    MY(tex_min) = 69;
+    MY(tex_max) = 69;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '156.0 156.0 156.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_gentle_morphed.inc b/qcsrc/common/effects/effectinfo_gentle_morphed.inc
new file mode 100644 (file)
index 0000000..c334912
--- /dev/null
@@ -0,0 +1,121 @@
+// cl_gentle impact effect indicating damage
+DEF(morphed_damage_hit);
+SUB(morphed_damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 292;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0x9271fb";
+    MY(count) = 0.500000;
+    MY(gravity) = -0.400000;
+    MY(liquidfriction) = 10;
+    MY(sizeincrease) = -24;
+    MY(size_min) = 14;
+    MY(size_max) = 24;
+    MY(tex_min) = 43;
+    MY(tex_max) = 43;
+    MY(type) = "spark";
+    MY(velocityjitter) = '356.0 356.0 456.0';
+}
+SUB(morphed_damage_hit) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 128;
+    MY(alpha_fade) = 292;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0x9271fb";
+    MY(count) = 0.500000;
+    MY(liquidfriction) = 10;
+    MY(originjitter) = '10.0 10.0 10.0';
+    MY(sizeincrease) = -24;
+    MY(size_min) = 24;
+    MY(size_max) = 24;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+}
+
+// effect for removing player model
+DEF(morphed_damage_dissolve);
+SUB(morphed_damage_dissolve) {
+    MY(airfriction) = 8;
+    MY(alpha_min) = 456;
+    MY(alpha_max) = 456;
+    MY(alpha_fade) = 1828;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0x9271fb";
+    MY(count) = 10;
+    MY(gravity) = -1.900000;
+    MY(liquidfriction) = 6;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -399;
+    MY(spin_max) = -99;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 40;
+    MY(size_max) = 40;
+    MY(tex_min) = 43;
+    MY(tex_max) = 43;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '256.0 256.0 512.0';
+}
+SUB(morphed_damage_dissolve) {
+    MY(airfriction) = 9;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 628;
+    MY(color_min) = "0x7bdbff";
+    MY(color_max) = "0xbed2ff";
+    MY(count) = 2.500000;
+    MY(gravity) = -0.800000;
+    MY(liquidfriction) = 6;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 40;
+    MY(size_max) = 40;
+    MY(tex_min) = 43;
+    MY(tex_max) = 43;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '256.0 256.0 512.0';
+}
+SUB(morphed_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 156;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 128;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0x9271fb";
+    MY(count) = 5;
+    MY(liquidfriction) = 6;
+    MY(originjitter) = '22.0 22.0 76.0';
+    MY(sizeincrease) = -16;
+    MY(size_min) = 44;
+    MY(size_max) = 44;
+    MY(tex_min) = 65;
+    MY(tex_max) = 65;
+    MY(type) = "smoke";
+}
+SUB(morphed_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 56;
+    MY(alpha_max) = 56;
+    MY(alpha_fade) = 128;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xffffff";
+    MY(color_max) = "0x9271fb";
+    MY(count) = 15;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 6;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 999;
+    MY(spin_max) = -999;
+    MY(sizeincrease) = -16;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(tex_min) = 46;
+    MY(tex_max) = 46;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '400.0 400.0 0.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_gentle_particlegibs.inc b/qcsrc/common/effects/effectinfo_gentle_particlegibs.inc
new file mode 100644 (file)
index 0000000..f01c175
--- /dev/null
@@ -0,0 +1,199 @@
+// cl_gentle impact effect indicating damage
+DEF(particlegibs_damage_hit);
+// core decal
+SUB(particlegibs_damage_hit) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 428;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 0.500000;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 6;
+    MY(size_min) = 5;
+    MY(size_max) = 10;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_max) = 8;
+    MY(type) = "blood";
+    MY(velocityjitter) = '156.0 156.0 212.0';
+}
+// front blood
+SUB(particlegibs_damage_hit) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 0.100000;
+    MY(gravity) = 0.500000;
+    MY(liquidfriction) = 3;
+    MY(sizeincrease) = -15;
+    MY(size_min) = 10;
+    MY(size_max) = 20;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_min) = 24;
+    MY(tex_max) = 32;
+    MY(type) = "blood";
+    MY(velocityjitter) = '6.0 6.0 30.0';
+    MY(velocitymultiplier) = -1;
+}
+// back blood
+SUB(particlegibs_damage_hit) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 0.100000;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 3;
+    MY(originjitter) = '3.0 3.0 3.0';
+    MY(sizeincrease) = 10;
+    MY(size_min) = 5;
+    MY(size_max) = 15;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_min) = 24;
+    MY(tex_max) = 32;
+    MY(type) = "blood";
+    MY(velocityjitter) = '26.0 26.0 112.0';
+    MY(velocitymultiplier) = 2;
+}
+
+// effect for removing player model
+DEF(particlegibs_damage_dissolve);
+// small core blood no decals
+SUB(particlegibs_damage_dissolve) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(color_min) = "0x00ffff";
+    MY(color_max) = "0x82ffff";
+    MY(count) = 32;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 6;
+    MY(originjitter) = '10.0 10.0 25.0';
+    MY(size_min) = 15;
+    MY(size_max) = 20;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_max) = 8;
+    MY(type) = "blood";
+    MY(velocityjitter) = '256.0 256.0 312.0';
+}
+// core decal
+SUB(particlegibs_damage_dissolve) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 528;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 12;
+    MY(gravity) = 2;
+    MY(liquidfriction) = 6;
+    MY(originjitter) = '10.0 10.0 25.0';
+    MY(size_min) = 20;
+    MY(size_max) = 40;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_max) = 8;
+    MY(type) = "blood";
+    MY(velocityjitter) = '356.0 356.0 412.0';
+}
+// front blood
+SUB(particlegibs_damage_dissolve) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 32;
+    MY(gravity) = 0.500000;
+    MY(liquidfriction) = 3;
+    MY(originjitter) = '5.0 5.0 10.0';
+    MY(sizeincrease) = -15;
+    MY(size_min) = 10;
+    MY(size_max) = 20;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_min) = 24;
+    MY(tex_max) = 32;
+    MY(type) = "blood";
+    MY(velocityjitter) = '56.0 56.0 212.0';
+    MY(velocitymultiplier) = -0.300000;
+}
+// back blood
+SUB(particlegibs_damage_dissolve) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(bounce) = -1;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 32;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 3;
+    MY(originjitter) = '5.0 5.0 10.0';
+    MY(sizeincrease) = 10;
+    MY(size_min) = 5;
+    MY(size_max) = 15;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_min) = 24;
+    MY(tex_max) = 32;
+    MY(type) = "blood";
+    MY(velocityjitter) = '56.0 56.0 212.0';
+    MY(velocitymultiplier) = 0.500000;
+}
+// small bits
+SUB(particlegibs_damage_dissolve) {
+    MY(airfriction) = 1.500000;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 328;
+    MY(color_min) = "0xA8FFFF";
+    MY(color_max) = "0xA8FFFFF";
+    MY(count) = 75;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 3;
+    MY(originjitter) = '10.0 10.0 25.0';
+    MY(sizeincrease) = 10;
+    MY(size_min) = 1;
+    MY(size_max) = 1;
+    MY(staincolor_min) = "0x808080";
+    MY(staincolor_max) = "0x808080";
+    MY(staintex_min) = 16;
+    MY(staintex_max) = 24;
+    MY(tex_min) = 24;
+    MY(tex_max) = 32;
+    MY(type) = "blood";
+    MY(velocityjitter) = '656.0 656.0 912.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_instagib.inc b/qcsrc/common/effects/effectinfo_instagib.inc
new file mode 100644 (file)
index 0000000..044f252
--- /dev/null
@@ -0,0 +1,46 @@
+#define rocketminsta_laser(name, color) \
+    DEF(rocketminsta_laser_##name); \
+    SUB(rocketminsta_laser_##name) { \
+        MY(alpha_min) = 256; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 968; \
+        MY(color_min) = color; \
+        MY(color_max) = color; \
+        MY(lightcolor) = '1.5 3.0 6.0'; \
+        MY(lightradius) = 90; \
+        MY(size_min) = 3; \
+        MY(size_max) = 3; \
+        MY(tex_min) = 38; \
+        MY(tex_max) = 38; \
+        MY(trailspacing) = 2; \
+        MY(type) = "static"; \
+        MY(velocitymultiplier) = -0.100000; \
+    } \
+    SUB(rocketminsta_laser_##name) /* bright sparks */ { \
+        MY(airfriction) = 12; \
+        MY(alpha_min) = 444; \
+        MY(alpha_max) = 512; \
+        MY(alpha_fade) = 1866; \
+        MY(bounce) = 1; \
+        MY(color_min) = color; \
+        MY(color_max) = color; \
+        MY(count) = 1.500000; \
+        MY(originjitter) = '1.0 1.0 1.0'; \
+        MY(sizeincrease) = -20; \
+        MY(size_min) = 2; \
+        MY(size_max) = 4; \
+        MY(tex_min) = 42; \
+        MY(tex_max) = 42; \
+        MY(trailspacing) = 12; \
+        MY(type) = "snow"; \
+        MY(velocityjitter) = '50.0 50.0 50.0'; \
+        MY(velocityoffset) = '0.0 0.0 15.0'; \
+    } \
+    /**/
+
+rocketminsta_laser(red,     "0xFF0F0F")
+rocketminsta_laser(blue,    "0x0F0FFF")
+rocketminsta_laser(yellow,  "0xFFFF0F")
+rocketminsta_laser(pink,    "0xFF0FFF")
+rocketminsta_laser(neutral, "0xFFFFFF")
+#undef rocketminsta_laser
diff --git a/qcsrc/common/effects/effectinfo_nades.inc b/qcsrc/common/effects/effectinfo_nades.inc
new file mode 100644 (file)
index 0000000..9c65557
--- /dev/null
@@ -0,0 +1,316 @@
+#define nade(name, colormin1, colormax1, colormin2, colormax2) \
+    DEF(nade_##name); \
+    SUB(nade_##name) { \
+        MY(alpha_min) = 100; \
+        MY(alpha_max) = 100; \
+        MY(alpha_fade) = 250; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(sizeincrease) = -1; \
+        MY(size_min) = 3; \
+        MY(size_max) = 3; \
+        MY(tex_min) = 65; \
+        MY(tex_max) = 65; \
+        MY(trailspacing) = 1; \
+        MY(type) = "smoke"; \
+    } \
+    SUB(nade_##name) /* fire */ { \
+        MY(alpha_min) = 30; \
+        MY(alpha_max) = 30; \
+        MY(alpha_fade) = 150; \
+        MY(color_min) = colormin2; \
+        MY(color_max) = colormax2; \
+        MY(notunderwater) = true; \
+        MY(sizeincrease) = -10; \
+        MY(size_min) = 15; \
+        MY(size_max) = 25; \
+        MY(tex_min) = 65; \
+        MY(tex_max) = 65; \
+        MY(trailspacing) = 8; \
+        MY(type) = "smoke"; \
+    } \
+    SUB(nade_##name) /* bubbles */ { \
+        MY(alpha_min) = 256; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 256; \
+        MY(bounce) = 1.500000; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(gravity) = -0.125000; \
+        MY(liquidfriction) = 4; \
+        MY(size_min) = 1; \
+        MY(size_max) = 1; \
+        MY(tex_min) = 62; \
+        MY(tex_max) = 62; \
+        MY(trailspacing) = 16; \
+        MY(type) = "bubble"; \
+        MY(underwater) = true; \
+        MY(velocityjitter) = '16.0 16.0 16.0'; \
+    } \
+    /**/
+
+nade(blue,      "0x006cff", "0x0600ff", "0x0600ff", "0x9794ff")
+nade(red,       "0xff0000", "0xff3c00", "0xff0000", "0xffa2a2")
+nade(yellow,    "0xFFFF0F", "0xFFFF0F", "0xFFFF0F", "0xFFFF0F")
+nade(pink,      "0xFF0FFF", "0xFF0FFF", "0xFF0FFF", "0xFF0FFF")
+nade(neutral,   "0xFFFFFF", "0xFFFFFF", "0xFFFFFF", "0xFFFFFF")
+#undef nade
+
+#define nade_burn(name, colormin1, colormax1, colormin2, colormax2) \
+    DEF(nade_##name##_burn); \
+    SUB(nade_##name##_burn) { \
+        MY(alpha_min) = 100; \
+        MY(alpha_max) = 100; \
+        MY(alpha_fade) = 250; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(sizeincrease) = -1; \
+        MY(size_min) = 5; \
+        MY(size_max) = 5; \
+        MY(tex_min) = 65; \
+        MY(tex_max) = 65; \
+        MY(trailspacing) = 1; \
+        MY(type) = "smoke"; \
+    } \
+    SUB(nade_##name##_burn) /* fire */ { \
+        MY(alpha_min) = 200; \
+        MY(alpha_max) = 200; \
+        MY(alpha_fade) = 1000; \
+        MY(color_min) = colormin2; \
+        MY(color_max) = colormax2; \
+        MY(notunderwater) = true; \
+        MY(sizeincrease) = -30; \
+        MY(size_min) = 45; \
+        MY(size_max) = 25; \
+        MY(tex_min) = 65; \
+        MY(tex_max) = 65; \
+        MY(trailspacing) = 64; \
+        MY(type) = "smoke"; \
+    } \
+    SUB(nade_##name##_burn) /* bubbles */ { \
+        MY(alpha_min) = 256; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 256; \
+        MY(bounce) = 1.500000; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(gravity) = -0.125000; \
+        MY(liquidfriction) = 4; \
+        MY(size_min) = 1; \
+        MY(size_max) = 1; \
+        MY(tex_min) = 62; \
+        MY(tex_max) = 62; \
+        MY(trailspacing) = 16; \
+        MY(type) = "bubble"; \
+        MY(underwater) = true; \
+        MY(velocityjitter) = '16.0 16.0 16.0'; \
+    } \
+    SUB(nade_##name##_burn) { \
+        MY(alpha_min) = 300; \
+        MY(alpha_max) = 900; \
+        MY(alpha_fade) = 1500; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(originjitter) = '2.0 2.0 2.0'; \
+        MY(startangle_min) = -180; \
+        MY(startangle_max) = 180; \
+        MY(spin_min) = 20; \
+        MY(spin_max) = -20; \
+        MY(sizeincrease) = -40; \
+        MY(size_min) = 15; \
+        MY(size_max) = 25; \
+        MY(tex_min) = 71; \
+        MY(tex_max) = 73; \
+        MY(trailspacing) = 16; \
+        MY(type) = "smoke"; \
+        MY(velocityjitter) = '10.0 10.0 10.0'; \
+    } \
+    /**/
+
+nade_burn(red,      "0xff0000", "0xff3c00", "0xff0000", "0xffa2a2")
+nade_burn(blue,     "0x006cff", "0x0600ff", "0x0600ff", "0x9794ff")
+nade_burn(yellow,   "0xFFFF0F", "0xFFFF0F", "0xFFFF0F", "0xFFFF0F")
+nade_burn(pink,     "0xFF0FFF", "0xFF0FFF", "0xFF0FFF", "0xFF0FFF")
+nade_burn(neutral,  "0xFFFFFF", "0xFFFFFF", "0xFFFFFF", "0xFFFFFF")
+#undef nade_burn
+
+#define nade_explode(name, colorlight, colormin1, colormax1, colormin2, colormax2, colormin3, colormax3) \
+    DEF(nade_##name##_explode); \
+    SUB(nade_##name##_explode) { \
+        MY(alpha_min) = 256; \
+        MY(alpha_max) = 256; \
+        MY(countabsolute) = 1; \
+        MY(lightcolor) = colorlight; \
+        MY(lightradiusfade) = 1500; \
+        MY(lightradius) = 300; \
+        MY(originjitter) = '26.0 26.0 26.0'; \
+        MY(size_min) = 88; \
+        MY(size_max) = 88; \
+        MY(tex_min) = 8; \
+        MY(tex_max) = 16; \
+        MY(type) = "decal"; \
+    } \
+    SUB(nade_##name##_explode) /* shockwave */ { \
+        MY(alpha_min) = 80; \
+        MY(alpha_max) = 80; \
+        MY(alpha_fade) = 650; \
+        MY(color_min) = colormin1; \
+        MY(color_max) = colormax1; \
+        MY(countabsolute) = 1; \
+        MY(sizeincrease) = 1800; \
+        MY(size_min) = 32; \
+        MY(size_max) = 32; \
+        MY(tex_min) = 33; \
+        MY(tex_max) = 33; \
+        MY(type) = "smoke"; \
+        MY(velocitymultiplier) = 44; \
+    } \
+    SUB(nade_##name##_explode) /* fire */ { \
+        MY(airfriction) = 30; \
+        MY(alpha_min) = 400; \
+        MY(alpha_max) = 656; \
+        MY(alpha_fade) = 2000; \
+        MY(color_min) = colormin2; \
+        MY(color_max) = colormax2; \
+        MY(count) = 16; \
+        MY(notunderwater) = true; \
+        MY(originjitter) = '50.0 50.0 50.0'; \
+        MY(startangle_min) = -180; \
+        MY(startangle_max) = 180; \
+        MY(spin_min) = -9; \
+        MY(spin_max) = 9; \
+        MY(sizeincrease) = 555; \
+        MY(size_min) = 20; \
+        MY(size_max) = 24; \
+        MY(tex_min) = 48; \
+        MY(tex_max) = 55; \
+        MY(type) = "smoke"; \
+        MY(velocityjitter) = '320.0 320.0 320.0'; \
+    } \
+    SUB(nade_##name##_explode) /* fire stretched */ { \
+        MY(airfriction) = -9; \
+        MY(alpha_min) = 1500; \
+        MY(alpha_max) = 3000; \
+        MY(alpha_fade) = 13000; \
+        MY(color_min) = colormin2; \
+        MY(color_max) = colormax2; \
+        MY(count) = 8; \
+        MY(sizeincrease) = 40; \
+        MY(size_min) = 60; \
+        MY(size_max) = 90; \
+        MY(stretchfactor) = 80; \
+        MY(tex_min) = 48; \
+        MY(tex_max) = 55; \
+        MY(type) = "spark"; \
+        MY(velocityjitter) = '30.0 30.0 30.0'; \
+    } \
+    SUB(nade_##name##_explode) /* smoke */ { \
+        MY(airfriction) = 0.040000; \
+        MY(alpha_min) = 128; \
+        MY(alpha_max) = 328; \
+        MY(alpha_fade) = 390; \
+        MY(blend) = "alpha"; \
+        MY(color_min) = "0x222222"; \
+        MY(color_max) = "0x000000"; \
+        MY(count) = 32; \
+        MY(gravity) = 0.400000; \
+        MY(originjitter) = '50.0 50.0 10.0'; \
+        MY(startangle_min) = -180; \
+        MY(startangle_max) = 180; \
+        MY(spin_min) = 2; \
+        MY(spin_max) = -2; \
+        MY(sizeincrease) = 50; \
+        MY(size_min) = 60; \
+        MY(size_max) = 30; \
+        MY(tex_max) = 7; \
+        MY(type) = "smoke"; \
+        MY(velocityjitter) = '200.0 200.0 200.0'; \
+        MY(velocityoffset) = '0.0 0.0 180.0'; \
+    } \
+    SUB(nade_##name##_explode) /* underwater bubbles */ { \
+        MY(alpha_min) = 128; \
+        MY(alpha_max) = 256; \
+        MY(alpha_fade) = 64; \
+        MY(bounce) = 1.500000; \
+        MY(color_min) = "0x404040"; \
+        MY(color_max) = "0x808080"; \
+        MY(count) = 32; \
+        MY(gravity) = -0.125000; \
+        MY(liquidfriction) = 0.250000; \
+        MY(originjitter) = '16.0 16.0 16.0'; \
+        MY(size_min) = 3; \
+        MY(size_max) = 6; \
+        MY(tex_min) = 62; \
+        MY(tex_max) = 62; \
+        MY(type) = "bubble"; \
+        MY(underwater) = true; \
+        MY(velocityjitter) = '196.0 196.0 196.0'; \
+    } \
+    SUB(nade_##name##_explode) /* bouncing sparks */ { \
+        MY(airfriction) = 1; \
+        MY(alpha_min) = 644; \
+        MY(alpha_max) = 956; \
+        MY(alpha_fade) = 484; \
+        MY(bounce) = 1.600000; \
+        MY(color_min) = colormin3; \
+        MY(color_max) = colormax3; \
+        MY(count) = 8; \
+        MY(gravity) = 1; \
+        MY(liquidfriction) = 0.800000; \
+        MY(notunderwater) = true; \
+        MY(originjitter) = '16.0 16.0 16.0'; \
+        MY(size_min) = 1; \
+        MY(size_max) = 2; \
+        MY(tex_min) = 40; \
+        MY(tex_max) = 40; \
+        MY(type) = "spark"; \
+        MY(velocityjitter) = '424.0 424.0 624.0'; \
+        MY(velocityoffset) = '0.0 0.0 80.0'; \
+    } \
+    SUB(nade_##name##_explode) /* notbouncing sparks */ { \
+        MY(airfriction) = 0.700000; \
+        MY(alpha_min) = 644; \
+        MY(alpha_max) = 956; \
+        MY(alpha_fade) = 684; \
+        MY(color_min) = colormin3; \
+        MY(color_max) = colormax3; \
+        MY(count) = 16; \
+        MY(gravity) = 0.500000; \
+        MY(liquidfriction) = 0.800000; \
+        MY(originjitter) = '16.0 16.0 16.0'; \
+        MY(size_min) = 1; \
+        MY(size_max) = 2; \
+        MY(tex_min) = 40; \
+        MY(tex_max) = 40; \
+        MY(type) = "spark"; \
+        MY(velocityjitter) = '424.0 424.0 624.0'; \
+        MY(velocityoffset) = '0.0 0.0 80.0'; \
+    } \
+    SUB(nade_##name##_explode) /* debris */ { \
+        MY(alpha_min) = 644; \
+        MY(alpha_max) = 956; \
+        MY(alpha_fade) = 2500; \
+        MY(color_min) = colormin3; \
+        MY(color_max) = colormax3; \
+        MY(count) = 8; \
+        MY(notunderwater) = true; \
+        MY(originjitter) = '64.0 64.0 64.0'; \
+        MY(startangle_min) = -180; \
+        MY(startangle_max) = 180; \
+        MY(spin_min) = -100; \
+        MY(spin_max) = 100; \
+        MY(size_min) = 20; \
+        MY(size_max) = 40; \
+        MY(tex_min) = 71; \
+        MY(tex_max) = 73; \
+        MY(type) = "smoke"; \
+        MY(velocityjitter) = '324.0 324.0 324.0'; \
+    } \
+    /**/
+
+nade_explode(blue,      '20.0 20.0 100.0', "0x80C0FF", "0x80C0FF", "0x629dff", "0x0018ff", "0x006cff", "0x0600ff")
+nade_explode(red,       '100.0 20.0 20.0', "0xff0000", "0xffa2a2", "0xff0000", "0xff4200", "0xff0000", "0xffa2a2")
+nade_explode(yellow,    '100.0 20.0 20.0', "0xff0000", "0xffa2a2", "0xFFFF0F", "0xFFFF0F", "0xff0000", "0xffa2a2")
+nade_explode(pink,      '100.0 20.0 20.0', "0xff0000", "0xffa2a2", "0xFF0FFF", "0xFF0FFF", "0xff0000", "0xffa2a2")
+nade_explode(neutral,   '100.0 20.0 20.0', "0xff0000", "0xffa2a2", "0xFFFFFF", "0xFFFFFF", "0xff0000", "0xffa2a2")
+#undef nade_explode
diff --git a/qcsrc/common/effects/effectinfo_onslaught.inc b/qcsrc/common/effects/effectinfo_onslaught.inc
new file mode 100644 (file)
index 0000000..af330c7
--- /dev/null
@@ -0,0 +1,123 @@
+DEF(onslaught_generator_gib_explode);
+// fire effect which expands then slows
+SUB(onslaught_generator_gib_explode) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 356;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 17;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '8.0 8.0 8.0';
+    MY(sizeincrease) = 45;
+    MY(size_min) = 20;
+    MY(size_max) = 26;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '286.0 286.0 286.0';
+}
+// smoke
+SUB(onslaught_generator_gib_explode) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 500;
+    MY(alpha_fade) = 600;
+    MY(bounce) = 2;
+    MY(color_min) = "0x000000";
+    MY(color_max) = "0x111111";
+    MY(count) = 6;
+    MY(gravity) = -0.300000;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 90;
+    MY(size_min) = 1;
+    MY(size_max) = 10;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '244.0 244.0 244.0';
+}
+// underwater bubbles
+SUB(onslaught_generator_gib_explode) {
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 64;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x404040";
+    MY(color_max) = "0x808080";
+    MY(count) = 16;
+    MY(gravity) = -0.125000;
+    MY(liquidfriction) = 0.250000;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(size_min) = 3;
+    MY(size_max) = 3;
+    MY(tex_min) = 62;
+    MY(tex_max) = 62;
+    MY(type) = "bubble";
+    MY(underwater) = true;
+    MY(velocityjitter) = '96.0 96.0 96.0';
+}
+
+DEF(onslaught_generator_gib_flame);
+// fire effect which expands then slows
+SUB(onslaught_generator_gib_flame) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 356;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 15;
+    MY(gravity) = -0.500000;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '3.0 3.0 3.0';
+    MY(sizeincrease) = 25;
+    MY(size_min) = 5;
+    MY(size_max) = 10;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '86.0 86.0 86.0';
+}
+// smoke
+SUB(onslaught_generator_gib_flame) {
+    MY(airfriction) = 5;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 500;
+    MY(alpha_fade) = 600;
+    MY(bounce) = 2;
+    MY(color_min) = "0x000000";
+    MY(color_max) = "0x111111";
+    MY(count) = 1;
+    MY(gravity) = -0.800000;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 30;
+    MY(size_min) = 10;
+    MY(size_max) = 20;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '44.0 44.0 44.0';
+}
+// underwater bubbles
+SUB(onslaught_generator_gib_flame) {
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 64;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x404040";
+    MY(color_max) = "0x808080";
+    MY(count) = 16;
+    MY(gravity) = -0.125000;
+    MY(liquidfriction) = 0.250000;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(size_min) = 3;
+    MY(size_max) = 3;
+    MY(tex_min) = 62;
+    MY(tex_max) = 62;
+    MY(type) = "bubble";
+    MY(underwater) = true;
+    MY(velocityjitter) = '96.0 96.0 96.0';
+}
diff --git a/qcsrc/common/effects/effectinfo_vehicles.inc b/qcsrc/common/effects/effectinfo_vehicles.inc
new file mode 100644 (file)
index 0000000..31fed7f
--- /dev/null
@@ -0,0 +1,1166 @@
+DEF(spiderbot_minigun_trail);
+SUB(spiderbot_minigun_trail) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 20;
+    MY(alpha_max) = 50;
+    MY(alpha_fade) = 100;
+    MY(color_min) = "0xd0d0a0";
+    MY(color_max) = "0xffffff";
+    MY(gravity) = -0.030000;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 2;
+    MY(size_min) = 1;
+    MY(size_max) = 2;
+    MY(tex_max) = 8;
+    MY(trailspacing) = 10;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '5.0 5.0 5.0';
+}
+
+DEF(spiderbot_minigun_muzzleflash);
+SUB(spiderbot_minigun_muzzleflash) {
+    MY(airfriction) = 10;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 6280;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff8400";
+    MY(count) = 3;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 4000;
+    MY(spin_max) = -4000;
+    MY(sizeincrease) = -100;
+    MY(size_min) = 10;
+    MY(size_max) = 15;
+    MY(stretchfactor) = 1.300000;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '150.0 150.0 150.0';
+    MY(velocitymultiplier) = 0.350000;
+}
+// fire
+SUB(spiderbot_minigun_muzzleflash) {
+    MY(airfriction) = 12;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 6280;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff8400";
+    MY(count) = 6;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(sizeincrease) = -10;
+    MY(size_min) = 5;
+    MY(size_max) = 7;
+    MY(stretchfactor) = 0.800000;
+    MY(tex_min) = 8;
+    MY(tex_max) = 15;
+    MY(type) = "spark";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+    MY(velocitymultiplier) = 0.200000;
+}
+SUB(spiderbot_minigun_muzzleflash) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 6680;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff8400";
+    MY(countabsolute) = 2;
+    MY(lightcolor) = '3.0 3.0 0.0';
+    MY(lightradiusfade) = 8000;
+    MY(lightradius) = 120;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 4000;
+    MY(spin_max) = -4000;
+    MY(sizeincrease) = -100;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(stretchfactor) = 0.100000;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+}
+
+DEF(spiderbot_minigun_impact);
+SUB(spiderbot_minigun_impact) {
+    MY(alpha_min) = 50;
+    MY(alpha_max) = 100;
+    MY(alpha_fade) = 1680;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xf6ff00";
+    MY(countabsolute) = 1;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 4000;
+    MY(spin_max) = -4000;
+    MY(sizeincrease) = -100;
+    MY(size_min) = 52;
+    MY(size_max) = 52;
+    MY(stretchfactor) = 0.100000;
+    MY(tex_min) = 65;
+    MY(tex_max) = 65;
+    MY(type) = "static";
+}
+// fire
+SUB(spiderbot_minigun_impact) {
+    MY(airfriction) = 6;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 6280;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff8400";
+    MY(count) = 7;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 4000;
+    MY(spin_max) = -4000;
+    MY(sizeincrease) = 100;
+    MY(size_min) = 9;
+    MY(size_max) = 15;
+    MY(stretchfactor) = 3;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '250.0 250.0 150.0';
+    MY(velocitymultiplier) = 0.200000;
+}
+// smoke
+SUB(spiderbot_minigun_impact) {
+    MY(airfriction) = 10;
+    MY(alpha_min) = 50;
+    MY(alpha_max) = 50;
+    MY(alpha_fade) = 190;
+    MY(color_min) = "0xd0d0a0";
+    MY(color_max) = "0xffffff";
+    MY(count) = 6;
+    MY(gravity) = 1.300000;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(sizeincrease) = 80;
+    MY(size_min) = 10;
+    MY(size_max) = 20;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '100.0 100.0 250.0';
+    MY(velocitymultiplier) = 0.490000;
+}
+// smoke 2
+SUB(spiderbot_minigun_impact) {
+    MY(airfriction) = 6;
+    MY(alpha_min) = 25;
+    MY(alpha_max) = 51;
+    MY(alpha_fade) = 128;
+    MY(color_min) = "0xd0d0a0";
+    MY(color_max) = "0xffffff";
+    MY(count) = 7;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(sizeincrease) = 100;
+    MY(size_min) = 15;
+    MY(size_max) = 19;
+    MY(stretchfactor) = 7.600000;
+    MY(tex_max) = 8;
+    MY(type) = "spark";
+    MY(velocityjitter) = '250.0 250.0 150.0';
+    MY(velocitymultiplier) = 0.200000;
+}
+// debris
+SUB(spiderbot_minigun_impact) {
+    MY(airfriction) = 0.400000;
+    MY(alpha_min) = 644;
+    MY(alpha_max) = 756;
+    MY(alpha_fade) = 1484;
+    MY(color_min) = "0x99977D";
+    MY(color_max) = "0xFFFFFF";
+    MY(count) = 3;
+    MY(gravity) = 1.100000;
+    MY(notunderwater) = true;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -1000;
+    MY(spin_max) = 1000;
+    MY(sizeincrease) = -10;
+    MY(size_min) = 6;
+    MY(size_max) = 8;
+    MY(tex_min) = 66;
+    MY(tex_max) = 68;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '124.0 124.0 224.0';
+    MY(velocitymultiplier) = 0.150000;
+}
+// decal
+SUB(spiderbot_minigun_impact) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 20;
+    MY(size_max) = 25;
+    MY(tex_min) = 56;
+    MY(tex_max) = 59;
+    MY(type) = "decal";
+}
+
+DEF(spiderbot_rocket_explode);
+SUB(spiderbot_rocket_explode) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(lightcolor) = '8.0 4.0 0.0';
+    MY(lightradiusfade) = 1750;
+    MY(lightradius) = 300;
+    MY(originjitter) = '23.0 23.0 23.0';
+    MY(size_min) = 72;
+    MY(size_max) = 72;
+    MY(tex_min) = 8;
+    MY(tex_max) = 16;
+    MY(type) = "decal";
+}
+// shockwave
+SUB(spiderbot_rocket_explode) {
+    MY(alpha_min) = 56;
+    MY(alpha_max) = 56;
+    MY(alpha_fade) = 230;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 2400;
+    MY(size_min) = 22;
+    MY(size_max) = 22;
+    MY(tex_min) = 33;
+    MY(tex_max) = 33;
+    MY(type) = "static";
+}
+// glow
+SUB(spiderbot_rocket_explode) {
+    MY(alpha_min) = 156;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 830;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 240;
+    MY(size_min) = 120;
+    MY(size_max) = 120;
+    MY(tex_min) = 64;
+    MY(tex_max) = 64;
+    MY(type) = "static";
+}
+// fire effect
+SUB(spiderbot_rocket_explode) {
+    MY(airfriction) = 8;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 812;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 32;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '100.0 100.0 100.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -50;
+    MY(spin_max) = 50;
+    MY(sizeincrease) = 495;
+    MY(size_min) = 12;
+    MY(size_max) = 21;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// fire effect 2
+SUB(spiderbot_rocket_explode) {
+    MY(airfriction) = -2;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 912;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 16;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -150;
+    MY(spin_max) = 150;
+    MY(sizeincrease) = 120;
+    MY(size_min) = 3;
+    MY(size_max) = 3;
+    MY(stretchfactor) = 10;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '412.0 412.0 412.0';
+}
+// fire rays
+SUB(spiderbot_rocket_explode) {
+    MY(airfriction) = -3;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1600;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 10;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '40.0 40.0 40.0';
+    MY(sizeincrease) = 120;
+    MY(size_min) = 13;
+    MY(size_max) = 54;
+    MY(stretchfactor) = 10;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '712.0 712.0 712.0';
+}
+// smoke
+SUB(spiderbot_rocket_explode) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 300;
+    MY(alpha_max) = 650;
+    MY(alpha_fade) = 756;
+    MY(color_min) = "0x4F4B46";
+    MY(color_max) = "0x000000";
+    MY(count) = 10;
+    MY(notunderwater) = true;
+    MY(originjitter) = '100.0 100.0 100.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -20;
+    MY(spin_max) = 20;
+    MY(sizeincrease) = 280;
+    MY(size_min) = 10;
+    MY(size_max) = 15;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+}
+// smoke2
+SUB(spiderbot_rocket_explode) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 300;
+    MY(alpha_max) = 650;
+    MY(alpha_fade) = 556;
+    MY(color_min) = "0x4F4B46";
+    MY(color_max) = "0x000000";
+    MY(count) = 3;
+    MY(gravity) = -0.500000;
+    MY(notunderwater) = true;
+    MY(originjitter) = '10.0 10.0 10.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -20;
+    MY(spin_max) = 20;
+    MY(sizeincrease) = 30;
+    MY(size_min) = 100;
+    MY(size_max) = 150;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+}
+// underwater bubbles
+SUB(spiderbot_rocket_explode) {
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 64;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x404040";
+    MY(color_max) = "0x808080";
+    MY(count) = 32;
+    MY(gravity) = -0.125000;
+    MY(liquidfriction) = 0.250000;
+    MY(originjitter) = '160.0 160.0 160.0';
+    MY(size_min) = 1;
+    MY(size_max) = 3;
+    MY(tex_min) = 62;
+    MY(tex_max) = 62;
+    MY(type) = "bubble";
+    MY(underwater) = true;
+    MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// underwatershockwave
+SUB(spiderbot_rocket_explode) {
+    MY(alpha_min) = 40;
+    MY(alpha_max) = 40;
+    MY(alpha_fade) = 300;
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 1200;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(tex_min) = 33;
+    MY(tex_max) = 33;
+    MY(type) = "smoke";
+    MY(underwater) = true;
+}
+
+DEF(spiderbot_rocket_thrust);
+SUB(spiderbot_rocket_thrust) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1600;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 3;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = -40;
+    MY(size_min) = 5;
+    MY(size_max) = 10;
+    MY(stretchfactor) = 0.900000;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '20.0 20.0 20.0';
+    MY(velocitymultiplier) = -1.400000;
+}
+SUB(spiderbot_rocket_thrust) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 200;
+    MY(alpha_fade) = 9000;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 4;
+    MY(notunderwater) = true;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -500;
+    MY(spin_max) = 500;
+    MY(sizeincrease) = -3000;
+    MY(size_min) = 25;
+    MY(size_max) = 25;
+    MY(stretchfactor) = 1;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = -1.400000;
+}
+
+DEF(spiderbot_rocket_launch);
+// long lasting smoke
+SUB(spiderbot_rocket_launch) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 100;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 60;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 8;
+    MY(gravity) = -0.010000;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 20;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = -0.100000;
+}
+// fast smoke
+SUB(spiderbot_rocket_launch) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 100;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 260;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 14;
+    MY(gravity) = -0.300000;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 20;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '160.0 160.0 60.0';
+}
+// fire
+SUB(spiderbot_rocket_launch) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1960;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 14;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 40;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(stretchfactor) = 3;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = 0.500000;
+}
+// sparks
+SUB(spiderbot_rocket_launch) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1000;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 10;
+    MY(notunderwater) = true;
+    MY(size_min) = 1;
+    MY(size_max) = 4;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '160.0 160.0 160.0';
+    MY(velocitymultiplier) = -0.500000;
+}
+
+DEF(wakizashi_gun_impact);
+SUB(wakizashi_gun_impact) {
+    MY(airfriction) = 4;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 1180;
+    MY(color_min) = "0xff0000";
+    MY(color_max) = "0xc03535";
+    MY(count) = 15;
+    MY(gravity) = 3;
+    MY(originjitter) = '40.0 40.0 10.0';
+    MY(size_min) = 4;
+    MY(size_max) = 7;
+    MY(stretchfactor) = 0.900000;
+    MY(tex_min) = 41;
+    MY(tex_max) = 41;
+    MY(type) = "spark";
+    MY(velocityjitter) = '350.0 350.0 550.0';
+    MY(velocityoffset) = '0.0 0.0 700.0';
+}
+SUB(wakizashi_gun_impact) {
+    MY(airfriction) = 4;
+    MY(alpha_min) = 50;
+    MY(alpha_max) = 90;
+    MY(alpha_fade) = 150;
+    MY(color_min) = "0xd0d0a0";
+    MY(color_max) = "0xc03535";
+    MY(count) = 24;
+    MY(originjitter) = '40.0 40.0 10.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(sizeincrease) = 80;
+    MY(size_min) = 10;
+    MY(size_max) = 20;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '250.0 250.0 450.0';
+    MY(velocityoffset) = '0.0 0.0 600.0';
+}
+SUB(wakizashi_gun_impact) {
+    MY(alpha_min) = 250;
+    MY(alpha_max) = 300;
+    MY(alpha_fade) = 680;
+    MY(color_min) = "0xff0000";
+    MY(color_max) = "0xc03535";
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = -180;
+    MY(size_min) = 82;
+    MY(size_max) = 82;
+    MY(tex_min) = 65;
+    MY(tex_max) = 65;
+    MY(type) = "smoke";
+}
+SUB(wakizashi_gun_impact) {
+    MY(alpha_min) = 50;
+    MY(alpha_max) = 100;
+    MY(alpha_fade) = 620;
+    MY(color_min) = "0xff0000";
+    MY(color_max) = "0xc03535";
+    MY(countabsolute) = 1;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 400;
+    MY(spin_max) = -400;
+    MY(sizeincrease) = 900;
+    MY(size_min) = 40;
+    MY(size_max) = 40;
+    MY(tex_min) = 33;
+    MY(tex_max) = 33;
+    MY(type) = "smoke";
+}
+SUB(wakizashi_gun_impact) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 14;
+    MY(size_max) = 14;
+    MY(tex_min) = 59;
+    MY(tex_max) = 59;
+    MY(type) = "decal";
+}
+
+DEF(wakizashi_gun_muzzleflash);
+SUB(wakizashi_gun_muzzleflash) {
+    MY(airfriction) = 12;
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 512;
+    MY(alpha_fade) = 6280;
+    MY(color_min) = "0xff0000";
+    MY(color_max) = "0xc03535";
+    MY(count) = 16;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(sizeincrease) = -10;
+    MY(size_min) = 5;
+    MY(size_max) = 7;
+    MY(stretchfactor) = 0.700000;
+    MY(tex_min) = 8;
+    MY(tex_max) = 15;
+    MY(type) = "spark";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+    MY(velocitymultiplier) = 0.200000;
+}
+
+DEF(wakizashi_rocket_explode);
+SUB(wakizashi_rocket_explode) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(lightcolor) = '8.0 4.0 0.0';
+    MY(lightradiusfade) = 1750;
+    MY(lightradius) = 300;
+    MY(originjitter) = '23.0 23.0 23.0';
+    MY(size_min) = 72;
+    MY(size_max) = 72;
+    MY(tex_min) = 8;
+    MY(tex_max) = 16;
+    MY(type) = "decal";
+}
+// shockwave
+SUB(wakizashi_rocket_explode) {
+    MY(alpha_min) = 56;
+    MY(alpha_max) = 56;
+    MY(alpha_fade) = 230;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 2400;
+    MY(size_min) = 22;
+    MY(size_max) = 22;
+    MY(tex_min) = 33;
+    MY(tex_max) = 33;
+    MY(type) = "static";
+}
+// glow
+SUB(wakizashi_rocket_explode) {
+    MY(alpha_min) = 156;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 830;
+    MY(color_min) = "0x8f0d00";
+    MY(color_max) = "0xff5a00";
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 240;
+    MY(size_min) = 120;
+    MY(size_max) = 120;
+    MY(tex_min) = 64;
+    MY(tex_max) = 64;
+    MY(type) = "static";
+}
+// fire effect
+SUB(wakizashi_rocket_explode) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 512;
+    MY(color_min) = "0xFFAE00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 64;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '10.0 10.0 10.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -50;
+    MY(spin_max) = 50;
+    MY(sizeincrease) = 195;
+    MY(size_min) = 12;
+    MY(size_max) = 21;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// fire rays
+SUB(wakizashi_rocket_explode) {
+    MY(airfriction) = -3;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1600;
+    MY(color_min) = "0xFFEA00";
+    MY(color_max) = "0xff5a00";
+    MY(count) = 10;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '40.0 40.0 40.0';
+    MY(sizeincrease) = 120;
+    MY(size_min) = 43;
+    MY(size_max) = 54;
+    MY(stretchfactor) = 10;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '512.0 512.0 512.0';
+}
+// smoke
+SUB(wakizashi_rocket_explode) {
+    MY(airfriction) = 3;
+    MY(alpha_min) = 300;
+    MY(alpha_max) = 450;
+    MY(alpha_fade) = 556;
+    MY(color_min) = "0x4F4B46";
+    MY(color_max) = "0x000000";
+    MY(count) = 32;
+    MY(notunderwater) = true;
+    MY(originjitter) = '100.0 100.0 100.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -20;
+    MY(spin_max) = 20;
+    MY(sizeincrease) = 230;
+    MY(size_min) = 10;
+    MY(size_max) = 15;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+}
+// bouncing sparks
+SUB(wakizashi_rocket_explode) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 644;
+    MY(alpha_max) = 956;
+    MY(alpha_fade) = 884;
+    MY(color_min) = "0xffa35b";
+    MY(color_max) = "0xfff2be";
+    MY(count) = 14;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 0.800000;
+    MY(notunderwater) = true;
+    MY(originjitter) = '60.0 60.0 60.0';
+    MY(size_min) = 1;
+    MY(size_max) = 2;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '524.0 524.0 524.0';
+    MY(velocityoffset) = '0.0 0.0 170.0';
+}
+// underwater bubbles
+SUB(wakizashi_rocket_explode) {
+    MY(alpha_min) = 128;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 64;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0x404040";
+    MY(color_max) = "0x808080";
+    MY(count) = 32;
+    MY(gravity) = -0.125000;
+    MY(liquidfriction) = 0.250000;
+    MY(originjitter) = '160.0 160.0 160.0';
+    MY(size_min) = 1;
+    MY(size_max) = 3;
+    MY(tex_min) = 62;
+    MY(tex_max) = 62;
+    MY(type) = "bubble";
+    MY(underwater) = true;
+    MY(velocityjitter) = '144.0 144.0 144.0';
+}
+// underwatershockwave
+SUB(wakizashi_rocket_explode) {
+    MY(alpha_min) = 40;
+    MY(alpha_max) = 40;
+    MY(alpha_fade) = 300;
+    MY(countabsolute) = 1;
+    MY(sizeincrease) = 1200;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(tex_min) = 33;
+    MY(tex_max) = 33;
+    MY(type) = "smoke";
+    MY(underwater) = true;
+}
+
+DEF(wakizashi_rocket_thrust);
+SUB(wakizashi_rocket_thrust) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1600;
+    MY(color_min) = "0x00FFDD";
+    MY(color_max) = "0x6200FF";
+    MY(countabsolute) = 3;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = -2;
+    MY(size_min) = 14;
+    MY(size_max) = 19;
+    MY(stretchfactor) = 1;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = -1.100000;
+}
+SUB(wakizashi_rocket_thrust) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1900;
+    MY(color_min) = "0xFFFF33";
+    MY(color_max) = "0xFFEE00";
+    MY(countabsolute) = 2;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = -2;
+    MY(size_min) = 5;
+    MY(size_max) = 10;
+    MY(stretchfactor) = 3;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = -0.300000;
+}
+
+DEF(wakizashi_rocket_launch);
+// long lasting smoke
+SUB(wakizashi_rocket_launch) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 100;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 60;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 8;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 20;
+    MY(size_min) = 3;
+    MY(size_max) = 30;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '160.0 160.0 60.0';
+    MY(velocitymultiplier) = -0.100000;
+}
+// fast smoke
+SUB(wakizashi_rocket_launch) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 100;
+    MY(alpha_max) = 156;
+    MY(alpha_fade) = 260;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 14;
+    MY(notunderwater) = true;
+    MY(sizeincrease) = 20;
+    MY(size_min) = 30;
+    MY(size_max) = 30;
+    MY(tex_max) = 8;
+    MY(type) = "smoke";
+    MY(velocityjitter) = '160.0 160.0 60.0';
+    MY(velocitymultiplier) = 0.400000;
+}
+//sparks
+SUB(wakizashi_rocket_launch) {
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 1000;
+    MY(color_min) = "0xFFFFFF";
+    MY(color_max) = "0xD9C4B0";
+    MY(count) = 10;
+    MY(notunderwater) = true;
+    MY(size_min) = 1;
+    MY(size_max) = 4;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '60.0 60.0 60.0';
+    MY(velocitymultiplier) = -1.500000;
+}
+
+DEF(wakizashi_booster_smoke);
+SUB(wakizashi_booster_smoke) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 750;
+    MY(alpha_fade) = 200;
+    MY(color_min) = "0xA69A80";
+    MY(color_max) = "0xB3B39F";
+    MY(count) = 3;
+    MY(gravity) = -0.100000;
+    MY(notunderwater) = true;
+    MY(originjitter) = '60.0 60.0 60.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = -20;
+    MY(spin_max) = 20;
+    MY(sizeincrease) = 10;
+    MY(size_min) = 60;
+    MY(size_max) = 100;
+    MY(tex_max) = 8;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '40.0 40.0 40.0';
+}
+
+DEF(raptor_cannon_impact);
+// decal
+SUB(raptor_cannon_impact) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 24;
+    MY(size_max) = 24;
+    MY(tex_min) = 47;
+    MY(tex_max) = 47;
+    MY(type) = "decal";
+}
+// spark
+SUB(raptor_cannon_impact) {
+    MY(airfriction) = 0.200000;
+    MY(alpha_min) = 644;
+    MY(alpha_max) = 956;
+    MY(alpha_fade) = 784;
+    MY(color_min) = "0xD400FF";
+    MY(color_max) = "0x571863";
+    MY(count) = 6;
+    MY(gravity) = 1;
+    MY(notunderwater) = true;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(size_min) = 1;
+    MY(size_max) = 1;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '124.0 124.0 524.0';
+    MY(velocityoffset) = '0.0 0.0 150.0';
+}
+// smoke
+SUB(raptor_cannon_impact) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 428;
+    MY(alpha_max) = 428;
+    MY(alpha_fade) = 600;
+    MY(color_min) = "0x646364";
+    MY(color_max) = "0x151515";
+    MY(count) = 4;
+    MY(gravity) = 0.700000;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 50;
+    MY(size_max) = 50;
+    MY(tex_max) = 7;
+    MY(type) = "alphastatic";
+    MY(velocityjitter) = '200.0 200.0 300.0';
+    MY(velocityoffset) = '0.0 0.0 340.0';
+}
+// fire
+SUB(raptor_cannon_impact) {
+    MY(airfriction) = 8;
+    MY(alpha_min) = 200;
+    MY(alpha_max) = 256;
+    MY(alpha_fade) = 812;
+    MY(bounce) = 1.500000;
+    MY(color_min) = "0xD400FF";
+    MY(color_max) = "0x571863";
+    MY(count) = 10;
+    MY(liquidfriction) = 8;
+    MY(notunderwater) = true;
+    MY(originjitter) = '8.0 8.0 8.0';
+    MY(sizeincrease) = 25;
+    MY(size_min) = 33;
+    MY(size_max) = 44;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '312.0 312.0 312.0';
+}
+
+DEF(raptor_cannon_muzzleflash);
+SUB(raptor_cannon_muzzleflash) {
+    MY(airfriction) = 12;
+    MY(alpha_min) = 1256;
+    MY(alpha_max) = 1512;
+    MY(alpha_fade) = 56280;
+    MY(color_min) = "0xD400FF";
+    MY(color_max) = "0x571863";
+    MY(count) = 16;
+    MY(originjitter) = '2.0 2.0 2.0';
+    MY(sizeincrease) = -10;
+    MY(size_min) = 10;
+    MY(size_max) = 17;
+    MY(stretchfactor) = 0.600000;
+    MY(tex_min) = 8;
+    MY(tex_max) = 15;
+    MY(type) = "spark";
+    MY(velocityjitter) = '200.0 200.0 200.0';
+    MY(velocitymultiplier) = 0.200000;
+}
+SUB(raptor_cannon_muzzleflash) {
+    MY(alpha_min) = 6056;
+    MY(alpha_max) = 20112;
+    MY(alpha_fade) = 406280;
+    MY(color_min) = "0xD400FF";
+    MY(color_max) = "0x571863";
+    MY(countabsolute) = 1;
+    MY(lightcolor) = '3.0 0.0 6.0';
+    MY(lightradiusfade) = 6000;
+    MY(lightradius) = 150;
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(spin_min) = 4000;
+    MY(spin_max) = -4000;
+    MY(sizeincrease) = -100;
+    MY(size_min) = 32;
+    MY(size_max) = 32;
+    MY(stretchfactor) = 0.100000;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+}
+
+DEF(raptor_bomb_impact);
+// decal
+SUB(raptor_bomb_impact) {
+    MY(alpha_min) = 256;
+    MY(alpha_max) = 256;
+    MY(countabsolute) = 1;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 84;
+    MY(size_max) = 84;
+    MY(tex_min) = 8;
+    MY(tex_max) = 16;
+    MY(type) = "decal";
+}
+// spark vertical
+SUB(raptor_bomb_impact) {
+    MY(alpha_min) = 300;
+    MY(alpha_max) = 300;
+    MY(alpha_fade) = 600;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff3c00";
+    MY(count) = 3;
+    MY(originjitter) = '10.0 10.0 10.0';
+    MY(sizeincrease) = 50;
+    MY(size_min) = 20;
+    MY(size_max) = 40;
+    MY(stretchfactor) = 210;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "spark";
+    MY(velocityjitter) = '40.0 40.0 120.0';
+}
+// fire
+SUB(raptor_bomb_impact) {
+    MY(airfriction) = 2;
+    MY(alpha_min) = 300;
+    MY(alpha_max) = 300;
+    MY(alpha_fade) = 500;
+    MY(color_min) = "0xff9c00";
+    MY(color_max) = "0xff3c00";
+    MY(count) = 4;
+    MY(originjitter) = '10.0 10.0 10.0';
+    MY(sizeincrease) = 230;
+    MY(size_min) = 30;
+    MY(size_max) = 120;
+    MY(tex_min) = 48;
+    MY(tex_max) = 55;
+    MY(type) = "static";
+    MY(velocityjitter) = '950.0 950.0 0.0';
+}
+// smoke
+SUB(raptor_bomb_impact) {
+    MY(alpha_min) = 428;
+    MY(alpha_max) = 428;
+    MY(alpha_fade) = 600;
+    MY(blend) = "alpha";
+    MY(color_min) = "0x646364";
+    MY(color_max) = "0x151515";
+    MY(count) = 4;
+    MY(originjitter) = '30.0 30.0 10.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(size_min) = 120;
+    MY(size_max) = 180;
+    MY(stretchfactor) = 10;
+    MY(tex_max) = 7;
+    MY(type) = "spark";
+    MY(velocityjitter) = '200.0 200.0 280.0';
+    MY(velocityoffset) = '0.0 0.0 280.0';
+}
+// smoke 2
+SUB(raptor_bomb_impact) {
+    MY(airfriction) = 0.600000;
+    MY(alpha_min) = 328;
+    MY(alpha_max) = 328;
+    MY(alpha_fade) = 350;
+    MY(blend) = "alpha";
+    MY(color_min) = "0x646364";
+    MY(color_max) = "0x151515";
+    MY(count) = 4;
+    MY(gravity) = 2;
+    MY(originjitter) = '30.0 30.0 10.0';
+    MY(startangle_min) = -180;
+    MY(startangle_max) = 180;
+    MY(sizeincrease) = 60;
+    MY(size_min) = 40;
+    MY(size_max) = 100;
+    MY(tex_max) = 7;
+    MY(type) = "spark";
+    MY(velocityjitter) = '200.0 200.0 300.0';
+    MY(velocityoffset) = '0.0 0.0 580.0';
+}
+// sparks
+SUB(raptor_bomb_impact) {
+    MY(airfriction) = 0.300000;
+    MY(alpha_min) = 644;
+    MY(alpha_max) = 956;
+    MY(alpha_fade) = 984;
+    MY(color_min) = "0xffa35b";
+    MY(color_max) = "0xfff2be";
+    MY(count) = 5;
+    MY(gravity) = 1;
+    MY(notunderwater) = true;
+    MY(originjitter) = '16.0 16.0 16.0';
+    MY(size_min) = 3;
+    MY(size_max) = 5;
+    MY(stretchfactor) = 2;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '174.0 174.0 924.0';
+    MY(velocityoffset) = '0.0 0.0 350.0';
+}
+
+DEF(raptor_bomb_spread);
+SUB(raptor_bomb_spread) {
+    MY(airfriction) = 1;
+    MY(alpha_min) = 644;
+    MY(alpha_max) = 956;
+    MY(alpha_fade) = 1284;
+    MY(color_min) = "0xffa35b";
+    MY(color_max) = "0xfff2be";
+    MY(count) = 34;
+    MY(gravity) = 1;
+    MY(liquidfriction) = 0.800000;
+    MY(notunderwater) = true;
+    MY(originjitter) = '110.0 110.0 110.0';
+    MY(size_min) = 1;
+    MY(size_max) = 2;
+    MY(tex_min) = 40;
+    MY(tex_max) = 40;
+    MY(type) = "spark";
+    MY(velocityjitter) = '324.0 324.0 324.0';
+}
index cbd3a44ab5d40e4f739d3ef04b734e3c5d8d2754..4d82087e05dc47bea1ec9eb0b08aa18cd56247f6 100644 (file)
@@ -46,15 +46,35 @@ EFFECT(0, VORTEX_IMPACT,            "nex_impact")
 EFFECT(0, VORTEX_MUZZLEFLASH,       "nex_muzzleflash")
 
 EFFECT(1, VAPORIZER_RED,            "TE_TEI_G3RED")
-EFFECT(1, VAPORIZER_RED_HIT,        "TE_TEI_G3RED_HIT")
+EFFECT(1, VAPORIZER_HIT_RED,        "TE_TEI_G3RED_HIT")
 EFFECT(1, VAPORIZER_BLUE,           "TE_TEI_G3BLUE")
-EFFECT(1, VAPORIZER_BLUE_HIT,       "TE_TEI_G3BLUE_HIT")
+EFFECT(1, VAPORIZER_HIT_BLUE,       "TE_TEI_G3BLUE_HIT")
 EFFECT(1, VAPORIZER_YELLOW,         "TE_TEI_G3YELLOW")
-EFFECT(1, VAPORIZER_YELLOW_HIT,     "TE_TEI_G3YELLOW_HIT")
+EFFECT(1, VAPORIZER_HIT_YELLOW,     "TE_TEI_G3YELLOW_HIT")
 EFFECT(1, VAPORIZER_PINK,           "TE_TEI_G3PINK")
-EFFECT(1, VAPORIZER_PINK_HIT,       "TE_TEI_G3PINK_HIT")
+EFFECT(1, VAPORIZER_HIT_PINK,       "TE_TEI_G3PINK_HIT")
 EFFECT(1, VAPORIZER_NEUTRAL,        "TE_TEI_G3")
-EFFECT(1, VAPORIZER_NEUTRAL_HIT,    "TE_TEI_G3_HIT")
+EFFECT(1, VAPORIZER_HIT_NEUTRAL,    "TE_TEI_G3_HIT")
+entity EFFECT_VAPORIZER(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_VAPORIZER_RED;
+        case NUM_TEAM_2:    return EFFECT_VAPORIZER_BLUE;
+        case NUM_TEAM_3:    return EFFECT_VAPORIZER_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_VAPORIZER_PINK;
+        default:            return EFFECT_VAPORIZER_NEUTRAL;
+    }
+}
+entity EFFECT_VAPORIZER_HIT(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_VAPORIZER_HIT_RED;
+        case NUM_TEAM_2:    return EFFECT_VAPORIZER_HIT_BLUE;
+        case NUM_TEAM_3:    return EFFECT_VAPORIZER_HIT_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_VAPORIZER_HIT_PINK;
+        default:            return EFFECT_VAPORIZER_HIT_NEUTRAL;
+    }
+}
 
 EFFECT(0, RIFLE_IMPACT,             "machinegun_impact")
 EFFECT(0, RIFLE_MUZZLEFLASH,        "rifle_muzzleflash")
@@ -124,11 +144,53 @@ EFFECT(0, SPAWN_PINK,               "spawn_event_pink")
 EFFECT(0, SPAWNPOINT_NEUTRAL,       "spawn_point_neutral")
 EFFECT(0, SPAWN_NEUTRAL,            "spawn_event_neutral")
 
-EFFECT(0, NADE_RED_EXPLODE,         "nade_red_explode")
-EFFECT(0, NADE_BLUE_EXPLODE,        "nade_blue_explode")
-EFFECT(0, NADE_YELLOW_EXPLODE,      "nade_yellow_explode")
-EFFECT(0, NADE_PINK_EXPLODE,        "nade_pink_explode")
-EFFECT(0, NADE_NEUTRAL_EXPLODE,     "nade_neutral_explode")
+EFFECT(0, NADE_EXPLODE_RED,         "nade_red_explode")
+EFFECT(0, NADE_EXPLODE_BLUE,        "nade_blue_explode")
+EFFECT(0, NADE_EXPLODE_YELLOW,      "nade_yellow_explode")
+EFFECT(0, NADE_EXPLODE_PINK,        "nade_pink_explode")
+EFFECT(0, NADE_EXPLODE_NEUTRAL,     "nade_neutral_explode")
+entity EFFECT_NADE_EXPLODE(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_NADE_EXPLODE_RED;
+        case NUM_TEAM_2:    return EFFECT_NADE_EXPLODE_BLUE;
+        case NUM_TEAM_3:    return EFFECT_NADE_EXPLODE_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_NADE_EXPLODE_PINK;
+        default:                   return EFFECT_NADE_EXPLODE_NEUTRAL;
+    }
+}
+
+EFFECT(1, NADE_TRAIL_RED,           "nade_red")
+EFFECT(1, NADE_TRAIL_BLUE,          "nade_blue")
+EFFECT(1, NADE_TRAIL_YELLOW,        "nade_yellow")
+EFFECT(1, NADE_TRAIL_PINK,          "nade_pink")
+EFFECT(1, NADE_TRAIL_NEUTRAL,       "nade_neutral")
+entity EFFECT_NADE_TRAIL(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_NADE_TRAIL_RED;
+        case NUM_TEAM_2:    return EFFECT_NADE_TRAIL_BLUE;
+        case NUM_TEAM_3:    return EFFECT_NADE_TRAIL_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_NADE_TRAIL_PINK;
+        default:            return EFFECT_NADE_TRAIL_NEUTRAL;
+    }
+}
+
+EFFECT(1, NADE_TRAIL_BURN_RED,      "nade_red_burn")
+EFFECT(1, NADE_TRAIL_BURN_BLUE,     "nade_blue_burn")
+EFFECT(1, NADE_TRAIL_BURN_YELLOW,   "nade_yellow_burn")
+EFFECT(1, NADE_TRAIL_BURN_PINK,     "nade_pink_burn")
+EFFECT(1, NADE_TRAIL_BURN_NEUTRAL,  "nade_neutral_burn")
+entity EFFECT_NADE_TRAIL_BURN(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_NADE_TRAIL_BURN_RED;
+        case NUM_TEAM_2:    return EFFECT_NADE_TRAIL_BURN_BLUE;
+        case NUM_TEAM_3:    return EFFECT_NADE_TRAIL_BURN_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_NADE_TRAIL_BURN_PINK;
+        default:            return EFFECT_NADE_TRAIL_BURN_NEUTRAL;
+    }
+}
 
 EFFECT(0, ICEORGLASS,               "iceorglass")
 EFFECT(0, ICEFIELD,                 "icefield")
@@ -137,20 +199,43 @@ EFFECT(0, HEALING,                  "healing_fx")
 EFFECT(1, LASER_BEAM_FAST,          "nex242_misc_laser_beam_fast")
 EFFECT(0, RESPAWN_GHOST,            "respawn_ghost")
 
-EFFECT(0, FLAG_RED_TOUCH,           "redflag_touch")
-EFFECT(0, FLAG_BLUE_TOUCH,          "blueflag_touch")
-EFFECT(0, FLAG_YELLOW_TOUCH,        "yellowflag_touch")
-EFFECT(0, FLAG_PINK_TOUCH,          "pinkflag_touch")
-EFFECT(0, FLAG_NEUTRAL_TOUCH,       "neutralflag_touch")
-EFFECT(1, RED_PASS,                 "red_pass")
-EFFECT(1, BLUE_PASS,                "blue_pass")
-EFFECT(1, YELLOW_PASS,              "yellow_pass")
-EFFECT(1, PINK_PASS,                "pink_pass")
-EFFECT(1, NEUTRAL_PASS,             "neutral_pass")
-EFFECT(0, RED_CAP,                  "red_cap")
-EFFECT(0, BLUE_CAP,                 "blue_cap")
-EFFECT(0, YELLOW_CAP,               "yellow_cap")
-EFFECT(0, PINK_CAP,                 "pink_cap")
+EFFECT(0, FLAG_TOUCH_RED,           "redflag_touch")
+EFFECT(0, FLAG_TOUCH_BLUE,          "blueflag_touch")
+EFFECT(0, FLAG_TOUCH_YELLOW,        "yellowflag_touch")
+EFFECT(0, FLAG_TOUCH_PINK,          "pinkflag_touch")
+EFFECT(0, FLAG_TOUCH_NEUTRAL,       "neutralflag_touch")
+entity EFFECT_FLAG_TOUCH(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_FLAG_TOUCH_RED;
+        case NUM_TEAM_2:    return EFFECT_FLAG_TOUCH_BLUE;
+        case NUM_TEAM_3:    return EFFECT_FLAG_TOUCH_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_FLAG_TOUCH_PINK;
+        default:            return EFFECT_FLAG_TOUCH_NEUTRAL;
+    }
+}
+
+EFFECT(1, PASS_RED,                 "red_pass")
+EFFECT(1, PASS_BLUE,                "blue_pass")
+EFFECT(1, PASS_YELLOW,              "yellow_pass")
+EFFECT(1, PASS_PINK,                "pink_pass")
+EFFECT(1, PASS_NEUTRAL,             "neutral_pass")
+
+EFFECT(0, CAP_RED,                  "red_cap")
+EFFECT(0, CAP_BLUE,                 "blue_cap")
+EFFECT(0, CAP_YELLOW,               "yellow_cap")
+EFFECT(0, CAP_PINK,                 "pink_cap")
+EFFECT(0, CAP_NEUTRAL,              "neutral_cap")
+entity EFFECT_CAP(int teamid)
+{
+    switch (teamid) {
+        case NUM_TEAM_1:    return EFFECT_CAP_RED;
+        case NUM_TEAM_2:    return EFFECT_CAP_BLUE;
+        case NUM_TEAM_3:    return EFFECT_CAP_YELLOW;
+        case NUM_TEAM_4:    return EFFECT_CAP_PINK;
+        default:            return EFFECT_CAP_NEUTRAL;
+    }
+}
 
 EFFECT(0, ITEM_PICKUP,              "item_pickup")
 EFFECT(0, ITEM_RESPAWN,             "item_respawn")
@@ -187,3 +272,22 @@ EFFECT(1, TR_SLIGHTBLOOD,           "TR_SLIGHTBLOOD")
 EFFECT(1, TR_KNIGHTSPIKE,           "TR_KNIGHTSPIKE")
 EFFECT(1, TR_VORESPIKE,             "TR_VORESPIKE")
 EFFECT(0, TE_SPARK,                 "TE_SPARK")
+
+EFFECT(1, ROCKETMINSTA_LASER_RED,       "rocketminsta_laser_red")
+EFFECT(1, ROCKETMINSTA_LASER_BLUE,      "rocketminsta_laser_blue")
+EFFECT(1, ROCKETMINSTA_LASER_YELLOW,    "rocketminsta_laser_yellow")
+EFFECT(1, ROCKETMINSTA_LASER_PINK,      "rocketminsta_laser_pink")
+EFFECT(1, ROCKETMINSTA_LASER_NEUTRAL,   "rocketminsta_laser_neutral")
+entity EFFECT_ROCKETMINSTA_LASER(int teamid)
+{
+    entity e;
+    switch (teamid) {
+        case NUM_TEAM_1:    e = EFFECT_ROCKETMINSTA_LASER_RED; break;
+        case NUM_TEAM_2:    e = EFFECT_ROCKETMINSTA_LASER_BLUE; break;
+        case NUM_TEAM_3:    e = EFFECT_ROCKETMINSTA_LASER_YELLOW; break;
+        case NUM_TEAM_4:    e = EFFECT_ROCKETMINSTA_LASER_PINK; break;
+        default:            e = EFFECT_ROCKETMINSTA_LASER_NEUTRAL; break;
+    }
+    if (particleeffectnum(e) < 0 || Team_TeamToNumber(teamid) == -1) { e = EFFECT_TR_NEXUIZPLASMA; }
+    return e;
+}
index fc225cdb7d40ecf648da2b802ecd504fba8631cc..8a9e314020bd16f100774837050c14d3ed3019a5 100644 (file)
@@ -11,4 +11,14 @@ void Dump_Items()
     ));
 }
 
+string Item_Model(string item_mdl)
+{
+    string output = strcat("models/items/", item_mdl);
+#ifdef SVQC
+    MUTATOR_CALLHOOK(ItemModel, item_mdl, output);
+    output = item_model_output;
+#endif
+    return output;
+}
+
 #endif
index 2e33119fb089920e71c69ccf07051223dc945496..3f8c603e7ab2aabeb75c74f438a00e73bba7593b 100644 (file)
@@ -11,6 +11,10 @@ REGISTER_REGISTRY(RegisterItems)
 
 void Dump_Items();
 
+#ifndef MENUQC
+string Item_Model(string item_mdl);
+#endif
+
 #endif
 
 #include "inventory.qh"
index 2d487a7b51be6723a030f44af5e14d5997da9883..16673711eea4b463b17c76d37702148dfa72176b 100644 (file)
@@ -3,8 +3,14 @@
     #include "../../../server/t_items.qh"
 #endif
 
+#ifndef MENUQC
+MODEL(Bullets_ITEM, Item_Model("a_bullets.mdl"));
+#endif
+
 REGISTER_ITEM(Bullets, Ammo) {
-    this.m_model    =   "a_bullets.mdl";
+#ifndef MENUQC
+    this.m_model    =   MDL_Bullets_ITEM;
+#endif
     this.m_name     =   "bullets";
     this.m_icon     =   "ammo_bullets";
 #ifdef SVQC
@@ -12,8 +18,15 @@ REGISTER_ITEM(Bullets, Ammo) {
     this.m_itemid   =   IT_NAILS;
 #endif
 }
+
+#ifndef MENUQC
+MODEL(Cells_ITEM, Item_Model("a_cells.md3"));
+#endif
+
 REGISTER_ITEM(Cells, Ammo) {
-    this.m_model    =   "a_cells.md3";
+#ifndef MENUQC
+    this.m_model    =   MDL_Cells_ITEM;
+#endif
     this.m_name     =   "cells";
     this.m_icon     =   "ammo_cells";
 #ifdef SVQC
@@ -21,8 +34,15 @@ REGISTER_ITEM(Cells, Ammo) {
     this.m_itemid   =   IT_CELLS;
 #endif
 }
+
+#ifndef MENUQC
+MODEL(Plasma_ITEM, Item_Model("a_cells.md3"));
+#endif
+
 REGISTER_ITEM(Plasma, Ammo) {
-    this.m_model    =   "a_cells.md3";
+#ifndef MENUQC
+    this.m_model    =   MDL_Plasma_ITEM;
+#endif
     this.m_name     =   "plasma";
     this.m_icon     =   "ammo_plasma";
 #ifdef SVQC
@@ -30,8 +50,15 @@ REGISTER_ITEM(Plasma, Ammo) {
     this.m_itemid   =   IT_PLASMA;
 #endif
 }
+
+#ifndef MENUQC
+MODEL(Rockets_ITEM, Item_Model("a_rockets.md3"));
+#endif
+
 REGISTER_ITEM(Rockets, Ammo) {
-    this.m_model    =   "a_rockets.md3";
+#ifndef MENUQC
+    this.m_model    =   MDL_Rockets_ITEM;
+#endif
     this.m_name     =   "rockets";
     this.m_icon     =   "ammo_rockets";
 #ifdef SVQC
@@ -39,8 +66,15 @@ REGISTER_ITEM(Rockets, Ammo) {
     this.m_itemid   =   IT_ROCKETS;
 #endif
 }
+
+#ifndef MENUQC
+MODEL(Shells_ITEM, Item_Model("a_shells.md3"));
+#endif
+
 REGISTER_ITEM(Shells, Ammo) {
-    this.m_model    =   "a_shells.md3";
+#ifndef MENUQC
+    this.m_model    =   MDL_Shells_ITEM;
+#endif
     this.m_name     =   "shells";
     this.m_icon     =   "ammo_shells";
 #ifdef SVQC
index e7965803e2115e1e2f7f631fae6680a878d2eeaa..13a774ebcec18f693120f19e7b89982d688fe788 100644 (file)
@@ -3,8 +3,14 @@
     #include "../../../server/t_items.qh"
 #endif
 
+#ifndef MENUQC
+MODEL(ArmorSmall_ITEM, Item_Model("item_armor_small.md3"));
+#endif
+
 REGISTER_ITEM(ArmorSmall, Armor) {
-    this.m_model                =   "item_armor_small.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_ArmorSmall_ITEM;
+#endif
     this.m_sound                =   "misc/armor1.wav";
     this.m_name                 =   "5 Armor";
     this.m_icon                 =   "armor";
@@ -16,8 +22,14 @@ REGISTER_ITEM(ArmorSmall, Armor) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(ArmorMedium_ITEM, Item_Model("item_armor_medium.md3"));
+#endif
+
 REGISTER_ITEM(ArmorMedium, Armor) {
-    this.m_model                =   "item_armor_medium.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_ArmorMedium_ITEM;
+#endif
     this.m_sound                =   "misc/armor10.wav";
     this.m_name                 =   "25 Armor";
     this.m_icon                 =   "armor";
@@ -29,8 +41,14 @@ REGISTER_ITEM(ArmorMedium, Armor) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(ArmorLarge_ITEM, Item_Model("item_armor_big.md3"));
+#endif
+
 REGISTER_ITEM(ArmorLarge, Armor) {
-    this.m_model                =   "item_armor_big.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_ArmorLarge_ITEM;
+#endif
     this.m_sound                =   "misc/armor17_5.wav";
     this.m_name                 =   "50 Armor";
     this.m_icon                 =   "armor";
@@ -44,8 +62,14 @@ REGISTER_ITEM(ArmorLarge, Armor) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(ArmorMega_ITEM, Item_Model("item_armor_large.md3"));
+#endif
+
 REGISTER_ITEM(ArmorMega, Armor) {
-    this.m_model                =   "item_armor_large.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_ArmorMega_ITEM;
+#endif
     this.m_sound                =   "misc/armor25.wav";
     this.m_name                 =   "100 Armor";
     this.m_icon                 =   "item_large_armor";
index bb9d90eb44cdb9c2af8fc1d62cb54ec8665318a8..b81bde7afc22d1b0bd2152f990d5746725e215b3 100644 (file)
@@ -3,8 +3,14 @@
     #include "../../../server/t_items.qh"
 #endif
 
+#ifndef MENUQC
+MODEL(HealthSmall_ITEM, Item_Model("g_h1.md3"));
+#endif
+
 REGISTER_ITEM(HealthSmall, Health) {
-    this.m_model                =   "g_h1.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_HealthSmall_ITEM;
+#endif
     this.m_sound                =   "misc/minihealth.wav";
     this.m_name                 =   "5 Health";
     this.m_icon                 =   "health";
@@ -16,8 +22,14 @@ REGISTER_ITEM(HealthSmall, Health) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(HealthMedium_ITEM, Item_Model("g_h25.md3"));
+#endif
+
 REGISTER_ITEM(HealthMedium, Health) {
-    this.m_model                =   "g_h25.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_HealthMedium_ITEM;
+#endif
     this.m_sound                =   "misc/mediumhealth.wav";
     this.m_name                 =   "25 Health";
     this.m_icon                 =   "health";
@@ -29,8 +41,14 @@ REGISTER_ITEM(HealthMedium, Health) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(HealthLarge_ITEM, Item_Model("g_h50.md3"));
+#endif
+
 REGISTER_ITEM(HealthLarge, Health) {
-    this.m_model                =   "g_h50.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_HealthLarge_ITEM;
+#endif
     this.m_sound                =   "misc/mediumhealth.wav";
     this.m_name                 =   "50 Health";
     this.m_icon                 =   "health";
@@ -44,8 +62,14 @@ REGISTER_ITEM(HealthLarge, Health) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(HealthMega_ITEM, Item_Model("g_h100.md3"));
+#endif
+
 REGISTER_ITEM(HealthMega, Health) {
-    this.m_model                =   "g_h100.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_HealthMega_ITEM;
+#endif
     this.m_sound                =   "misc/megahealth.wav";
     this.m_name                 =   "100 Health";
     this.m_icon                 =   "item_mega_health";
index 3b4cfbc141c9a6b1798612f7b8ef7238162f20eb..63019aebe8bbf50800da4967ce6421144bb1d906 100644 (file)
@@ -6,8 +6,14 @@
 #include "ammo.qh"
 #include "powerup.qh"
 
+#ifndef MENUQC
+MODEL(Jetpack_ITEM, Item_Model("g_jetpack.md3"));
+#endif
+
 REGISTER_ITEM(Jetpack, Powerup) {
-    this.m_model                =   "g_jetpack.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_Jetpack_ITEM;
+#endif
     this.m_name                 =   "Jet pack";
     this.m_icon                 =   "jetpack";
     this.m_color                =   '0.5 0.5 0.5';
@@ -20,8 +26,14 @@ REGISTER_ITEM(Jetpack, Powerup) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(JetpackFuel_ITEM, Item_Model("g_fuel.md3"));
+#endif
+
 REGISTER_ITEM(JetpackFuel, Ammo) {
-    this.m_model    =   "g_fuel.md3";
+#ifndef MENUQC
+    this.m_model    =   MDL_JetpackFuel_ITEM;
+#endif
     this.m_name     =   "Fuel";
     this.m_icon     =   "ammo_fuel";
 #ifdef SVQC
@@ -30,8 +42,14 @@ REGISTER_ITEM(JetpackFuel, Ammo) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(JetpackRegen_ITEM, Item_Model("g_fuelregen.md3"));
+#endif
+
 REGISTER_ITEM(JetpackRegen, Pickup) {
-    this.m_model                =   "g_fuelregen.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_JetpackRegen_ITEM;
+#endif
     this.m_name                 =   "Fuel regenerator";
     this.m_icon                 =   "fuelregen";
     this.m_color                =   '1 0.5 0';
index 793230e359f831222ad7c309a7a7b001cbe332a0..6f60337c195a7ab7d79c43a04f5ec937e771ab67 100644 (file)
@@ -2,7 +2,9 @@
 #define PICKUP_H
 #include "../item.qh"
 CLASS(Pickup, GameItem)
-    ATTRIB(Pickup, m_model, string, string_null)
+#ifndef MENUQC
+    ATTRIB(Pickup, m_model, Model, NULL)
+#endif
     ATTRIB(Pickup, m_sound, string, "misc/itempickup.wav")
     ATTRIB(Pickup, m_name, string, string_null)
     METHOD(Pickup, show, void(entity this));
index fcfe2afb93a5a7c4b44183dfd6c654595f9c1c77..f411d748a8d5eaeb891ec8eace2d2dd76725695e 100644 (file)
@@ -4,8 +4,15 @@
 #ifndef SVQC
 .int m_itemid;
 #endif
+
+#ifndef MENUQC
+MODEL(Strength_ITEM, Item_Model("g_strength.md3"));
+#endif
+
 REGISTER_ITEM(Strength, Powerup) {
-    this.m_model            =   "g_strength.md3";
+#ifndef MENUQC
+    this.m_model            =   MDL_Strength_ITEM;
+#endif
     this.m_sound            =   "misc/powerup.wav";
     this.m_name             =   "Strength Powerup";
     this.m_icon             =   "strength";
@@ -14,8 +21,15 @@ REGISTER_ITEM(Strength, Powerup) {
     this.m_waypointblink    =   2;
     this.m_itemid           =   IT_STRENGTH;
 }
+
+#ifndef MENUQC
+MODEL(Shield_ITEM, Item_Model("g_invincible.md3"));
+#endif
+
 REGISTER_ITEM(Shield, Powerup) {
-    this.m_model            =   "g_invincible.md3";
+#ifndef MENUQC
+    this.m_model            =   MDL_Shield_ITEM;
+#endif
     this.m_sound            =   "misc/powerup_shield.wav";
     this.m_name             =   "Shield";
     this.m_icon             =   "shield";
index b88d219916edc4bd764e085467e1a9a0ec099701..38614c7d4629481c9c8fafeb6b029b533e263491 100644 (file)
@@ -42,27 +42,6 @@ bool minigame_hud_mouse_in(vector pos, vector sz)
               mousepos_y >= pos_y && mousepos_y < pos_y + sz_y ;
 }
 
-void initialize_minigames()
-{
-       entity last_minig = world;
-       entity minig;
-       #define MINIGAME(name,nicename) \
-               minig = spawn(); \
-               minig.classname = "minigame_descriptor"; \
-               minig.netname = strzone(strtolower(#name)); \
-               minig.message = nicename; \
-               minig.minigame_hud_board = name##_hud_board; \
-               minig.minigame_hud_status = name##_hud_status; \
-               minig.minigame_event = name##_client_event; \
-               if ( !last_minig ) minigame_descriptors = minig; \
-               else last_minig.list_next = minig; \
-               last_minig = minig;
-
-       REGISTERED_MINIGAMES
-
-       #undef MINIGAME
-}
-
 string minigame_texture_skin(string skinname, string name)
 {
        return sprintf("gfx/hud/%s/minigames/%s", skinname, name);
@@ -95,7 +74,7 @@ MINIGAME_SIMPLELINKED_ENTITIES
 
 void minigame_autoclean_entity(entity e)
 {
-       LOG_TRACE("CL Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n");
+       LOG_DEBUG("CL Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n");
        remove(e);
 }
 
@@ -235,7 +214,7 @@ void ent_read_minigame()
                        minigame_read_owner();
                        float ent = ReadLong();
                        self.minigame_playerslot = ent;
-                       LOG_TRACE("Player: ",GetPlayerName(ent-1),"\n");
+                       LOG_DEBUG("Player: ",GetPlayerName(ent-1),"\n");
 
                        activate = (ent == player_localnum+1 && self.owner && self.owner != active_minigame);
 
@@ -258,9 +237,9 @@ void ent_read_minigame()
 
        if ( sf & MINIG_SF_CREATE )
        {
-               LOG_TRACE("CL Reading entity: ",ftos(num_for_edict(self)),
+               LOG_DEBUG("CL Reading entity: ",ftos(num_for_edict(self)),
                        " classname:",self.classname," enttype:",ftos(self.enttype) );
-               LOG_TRACE(" sf:",ftos(sf)," netname:",self.netname,"\n\n");
+               LOG_DEBUG(" sf:",ftos(sf)," netname:",self.netname,"\n\n");
        }
 }
 #undef ReadString
index a839b1106194a7156bd56d669f4aefc720686cba..76d10986405891fa3d8e902983d33ce5ed6e0bb9 100644 (file)
@@ -79,9 +79,6 @@ string minigame_texture(string name);
 // For minigame_player: player server slot, don't use for anything else
 .float minigame_playerslot;
 
-// register all minigames
-void initialize_minigames();
-
 // client-side minigame session cleanup
 void deactivate_minigame();
 
@@ -118,4 +115,25 @@ void HUD_MinigameMenu_CustomEntry(entity parent, string message, string event_ar
        entityvar=world; \
        while( (entityvar = findentity(entityvar,owner,active_minigame)) )
 
+
+void RegisterMinigames();
+const int MINIGAMES_MAX = 24;
+entity MINIGAMES[MINIGAMES_MAX], MINIGAMES_first, MINIGAMES_last;
+int MINIGAMES_COUNT;
+#define REGISTER_MINIGAME(name,nicename) \
+    REGISTER(RegisterMinigames, MINIGAME, MINIGAMES, MINIGAMES_COUNT, name, m_id, spawn()); \
+    void name##_hud_board(vector, vector); \
+    void name##_hud_status(vector, vector); \
+    int name##_client_event(entity, string, ...); \
+    REGISTER_INIT_POST(MINIGAME, name) { \
+        this.classname = "minigame_descriptor"; \
+        this.netname = strzone(strtolower(#name)); \
+        this.message = nicename; \
+        this.minigame_hud_board = name##_hud_board; \
+               this.minigame_hud_status = name##_hud_status; \
+               this.minigame_event = name##_client_event; \
+    } \
+    REGISTER_INIT(MINIGAME, name)
+REGISTER_REGISTRY(RegisterMinigames)
+
 #endif
index 11470ec136acc3929cbd6721a720f8356e06d822..b0dba86c1ed9525cddb9f6f29b7818b3a9931c06 100644 (file)
@@ -211,18 +211,17 @@ void HUD_MinigameMenu_ClickCreate()
 {SELFPARAM();
        if ( HUD_MinigameMenu_Click_ExpandCollapse() )
        {
-               entity e;
                entity curr;
                entity prev = self;
-               for ( e = minigame_descriptors; e != world; e = e.list_next )
+               FOREACH(MINIGAMES, true, LAMBDA(
                {
                        curr = HUD_MinigameMenu_SpawnSubEntry(
-                               e.message, HUD_MinigameMenu_ClickCreate_Entry,  self );
-                       curr.netname = e.netname;
-                       curr.model = strzone(minigame_texture(strcat(e.netname,"/icon")));
+                               it.message, HUD_MinigameMenu_ClickCreate_Entry,  self );
+                       curr.netname = it.netname;
+                       curr.model = strzone(minigame_texture(strcat(it.netname,"/icon")));
                        HUD_MinigameMenu_InsertEntry( curr, prev );
                        prev = curr;
-               }
+               }));
        }
 }
 
index afcc93d4821bb69c0c8b60e9d7783118301617a9..d3874e7aa77cb42b79bc8c42230982cb0a4781f6 100644 (file)
@@ -65,25 +65,9 @@ that .owner is set to the minigame session entity and .minigame_autoclean is tru
 #include "ttt.qc"
 #include "c4.qc"
 #include "pong.qc"
-#include "qto.qc"
 #include "ps.qc"
 #include "pp.qc"
-
-/**
- * Registration:
- *     MINIGAME(id,"Name")
- *             id    (QuakeC symbol) Game identifier, used to find the functions explained above
- *             "Name"(String)        Human readable name for the game, shown in the UI
- */
-#define REGISTERED_MINIGAMES \
-       MINIGAME(nmm, "Nine Men's Morris") \
-       MINIGAME(ttt, "Tic Tac Toe") \
-       MINIGAME(pong,"Pong") \
-       MINIGAME(c4,  "Connect Four") \
-       MINIGAME(qto, "Quinto") \
-       MINIGAME(ps,  "Peg Solitaire") \
-       MINIGAME(pp,  "Push-Pull") \
-       /*empty line*/
+#include "snake.qc"
 
 /**
  * Set up automatic entity read/write functionality
index 31388d0f38a3b6457868fd3609e6cf77967f676b..98020972a742ee5a59e4eef24e69a7a483f6e69c 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(c4, "Connect Four");
+
 const float C4_TURN_PLACE = 0x0100; // player has to place a piece on the board
 const float C4_TURN_WIN   = 0x0200; // player has won
 const float C4_TURN_DRAW  = 0x0400; // no moves are possible
index 2bd4a4267fa22484af7dd6549711105b723272d6..1e4da05075ad20c76b11587a69f4a2e5b3105782 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(nmm, "Nine Men's Morris");
+
 const int NMM_TURN_PLACE = 0x0100; // player has to place a piece on the board
 const int NMM_TURN_MOVE  = 0x0200; // player has to move a piece by one tile
 const int NMM_TURN_FLY   = 0x0400; // player has to move a piece anywhere
index e295c7cd64ec867ac56af8813d0517262feb0fb8..540f7ecf2f1d506b30a28e98f045c3783f9c4e0e 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(pong, "Pong");
+
 // minigame flags
 const int PONG_STATUS_WAIT = 0x0010; // waiting for players to join
 const int PONG_STATUS_PLAY = 0x0020; // playing
index 01b257a82a94b4a17cbf9fdc763bcc2e03f1b5cf..efce0e66b6be5030a96beb0446cdd2c3378a4b66 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(pp, "Push-Pull");
+
 const int PP_TURN_PLACE = 0x0100; // player has to place a piece on the board
 const int PP_TURN_WIN   = 0x0200; // player has won
 const int PP_TURN_DRAW  = 0x0400; // players have equal scores
index 2b8de29920a416d687298b036769c2313de8141e..54be75cd46f51ba2c62756d99ec8716cb6764fd0 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(ps, "Peg Solitaire");
+
 const float PS_TURN_MOVE  = 0x0100; // player has to click on a piece on the board
 const float PS_TURN_WIN   = 0x0200; // player has won
 const float PS_TURN_DRAW  = 0x0400; // player can make no more moves
diff --git a/qcsrc/common/minigames/minigame/qto.qc b/qcsrc/common/minigames/minigame/qto.qc
deleted file mode 100644 (file)
index 76fa3ce..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-const float QTO_TURN_MOVE  = 0x0100; // player has to click on a piece on the board
-const float QTO_TURN_WIN   = 0x0200; // player has won
-const float QTO_TURN_TYPE  = 0x0f00; // turn type mask
-
-const int QTO_SF_PLAYERSCORE = MINIG_SF_CUSTOM;
-
-const int QTO_LET_CNT = 5;
-const int QTO_NUM_CNT = 5;
-
-const int QTO_TILE_SIZE = 8;
-
-.int qto_moves;
-
-// find same game piece given its tile name
-entity qto_find_piece(entity minig, string tile)
-{
-       entity e = world;
-       while ( ( e = findentity(e,owner,minig) ) )
-               if ( e.classname == "minigame_board_piece" && e.netname == tile )
-                       return e;
-       return world;
-}
-
-// Checks if the given piece completes a row
-bool qto_winning_piece(entity minigame)
-{
-       //int number = minigame_tile_number(piece.netname);
-       //int letter = minigame_tile_letter(piece.netname);
-
-       entity e = world;
-       while ( ( e = findentity(e,owner,minigame) ) )
-               if ( e.classname == "minigame_board_piece" )
-               {
-                       if(!e.cnt)
-                               return false;
-               }
-
-       return true;
-}
-
-// check if the tile name is valid (5x5 grid)
-bool qto_valid_tile(string tile)
-{
-       if ( !tile )
-               return false;
-       float number = minigame_tile_number(tile);
-       float letter = minigame_tile_letter(tile);
-       return 0 <= number && number < QTO_NUM_CNT && 0 <= letter && letter < QTO_LET_CNT;
-}
-
-void qto_setup_pieces(entity minigame)
-{
-       int i, t;
-       for(i = 0; i < QTO_NUM_CNT; ++i)
-       for(t = 0; t < QTO_LET_CNT; ++t)
-       {
-               entity piece = msle_spawn(minigame,"minigame_board_piece");
-               piece.team = 1; // init default team?
-               piece.cnt = 0; // initialize cnt
-               piece.netname = strzone(minigame_tile_buildname(t,i));
-               minigame_server_sendflags(piece,MINIG_SF_ALL);
-       }
-
-       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
-}
-
-void qto_add_score(entity minigame, int thescore)
-{
-#ifdef SVQC
-       if(!minigame)
-               return;
-       if(minigame.minigame_players)
-       {
-               minigame.minigame_players.qto_moves += thescore;
-               minigame.minigame_players.SendFlags |= QTO_SF_PLAYERSCORE;
-       }
-#endif
-}
-
-// make a move
-void qto_move(entity minigame, entity player, string pos )
-{
-       if ( minigame.minigame_flags & QTO_TURN_MOVE )
-       if ( pos )
-       {
-               if ( qto_valid_tile(pos) )
-               if ( qto_find_piece(minigame, pos) )
-               {
-                       entity piece;
-               #define DO_JUNK \
-                       if(piece) \
-                       { \
-                               piece.cnt = (piece.cnt) ? 0 : 1; \
-                               minigame_server_sendflags(piece,MINIG_SF_UPDATE); \
-                       }
-
-                       int number = minigame_tile_number(pos);
-                       int letter = minigame_tile_letter(pos);
-                       piece = qto_find_piece(minigame, pos);
-                       DO_JUNK
-                       piece = qto_find_piece(minigame, minigame_tile_buildname(letter-1,number));
-                       DO_JUNK
-                       piece = qto_find_piece(minigame, minigame_tile_buildname(letter+1,number));
-                       DO_JUNK
-                       piece = qto_find_piece(minigame, minigame_tile_buildname(letter,number-1));
-                       DO_JUNK
-                       piece = qto_find_piece(minigame, minigame_tile_buildname(letter,number+1));
-                       DO_JUNK
-
-                       qto_add_score(minigame,1); // add 1 move score
-
-                       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
-
-                       if ( qto_winning_piece(minigame) )
-                       {
-                               minigame.minigame_flags = QTO_TURN_WIN;
-                       }
-                       else
-                               minigame.minigame_flags = QTO_TURN_MOVE;
-               }
-       }
-}
-
-// restart match
-void qto_restart_match(entity minigame, entity player)
-{
-       minigame.minigame_flags = QTO_TURN_MOVE;
-       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
-       entity e = world;
-       while ( ( e = findentity(e,owner,minigame) ) )
-               if ( e.classname == "minigame_board_piece" )
-                       remove(e);
-
-       qto_setup_pieces(minigame);
-#ifdef SVQC
-       if(minigame.minigame_players)
-       {
-               minigame.minigame_players.qto_moves = 0;
-               minigame.minigame_players.SendFlags |= QTO_SF_PLAYERSCORE;
-       }
-#endif
-}
-
-#ifdef SVQC
-
-
-// required function, handle server side events
-int qto_server_event(entity minigame, string event, ...)
-{
-       switch(event)
-       {
-               case "start":
-               {
-                       qto_setup_pieces(minigame);
-                       minigame.minigame_flags = QTO_TURN_MOVE;
-                       return true;
-               }
-               case "end":
-               {
-                       entity e = world;
-                       while( (e = findentity(e, owner, minigame)) )
-                       if(e.classname == "minigame_board_piece")
-                       {
-                               if(e.netname) { strunzone(e.netname); }
-                               remove(e);
-                       }
-                       return false;
-               }
-               case "join":
-               {
-                       int pl_num = minigame_count_players(minigame);
-
-                       // Don't allow more than 1 player
-                       if(pl_num >= 1) { return false; }
-
-                       // Team 1 by default
-                       return 1;
-               }
-               case "cmd":
-               {
-                       switch(argv(0))
-                       {
-                               case "move":
-                                       qto_move(minigame, ...(0,entity), ...(1,int) == 2 ? argv(1) : string_null );
-                                       return true;
-                               case "restart":
-                                       qto_restart_match(minigame,...(0,entity));
-                                       return true;
-                       }
-
-                       return false;
-               }
-               case "network_send":
-               {
-                       entity sent = ...(0,entity);
-                       int sf = ...(1,int);
-                       if ( sent.classname == "minigame_board_piece" && (sf & MINIG_SF_UPDATE) )
-                       {
-                               WriteByte(MSG_ENTITY,sent.cnt);
-                       }
-                       else if ( sent.classname == "minigame_player" && (sf & QTO_SF_PLAYERSCORE ) )
-                       {
-                               WriteLong(MSG_ENTITY,sent.qto_moves);
-                       }
-                       return false;
-               }
-       }
-
-       return false;
-}
-
-
-#elif defined(CSQC)
-
-string qto_curr_pos; // identifier of the tile under the mouse
-vector qto_boardpos; // HUD board position
-vector qto_boardsize;// HUD board size
-
-// Required function, draw the game board
-void qto_hud_board(vector pos, vector mySize)
-{
-       minigame_hud_fitsqare(pos, mySize);
-       qto_boardpos = pos;
-       qto_boardsize = mySize;
-
-       minigame_hud_simpleboard(pos,mySize,minigame_texture("qto/board"));
-
-       vector tile_size = minigame_hud_denormalize_size('1 1 0' / QTO_TILE_SIZE,pos,mySize);
-       vector tile_pos;
-
-       bool valid = qto_valid_tile(qto_curr_pos);
-       int number = minigame_tile_number(qto_curr_pos);
-       int letter = minigame_tile_letter(qto_curr_pos);
-       string pos1 = minigame_tile_buildname(letter-1,number);
-       string pos2 = minigame_tile_buildname(letter+1,number);
-       string pos3 = minigame_tile_buildname(letter,number-1);
-       string pos4 = minigame_tile_buildname(letter,number+1);
-
-       entity e;
-       FOREACH_MINIGAME_ENTITY(e)
-       {
-               if ( e.classname == "minigame_board_piece" )
-               {
-                       tile_pos = minigame_tile_pos(e.netname,QTO_NUM_CNT,QTO_LET_CNT);
-                       tile_pos = minigame_hud_denormalize(tile_pos,pos,mySize);
-
-                       vector tile_color = '0.4 0.4 0.4';
-
-                       if(valid)
-                       switch(e.netname)
-                       {
-                               case qto_curr_pos:
-                               case pos1: case pos2: case pos3: case pos4:
-                                       tile_color = '0.8 0.8 0.8';
-                                       break;
-                       }
-
-                       minigame_drawpic_centered( tile_pos,
-                                       minigame_texture(strcat("qto/piece", ftos(e.cnt))),
-                                       tile_size, tile_color, panel_fg_alpha, DRAWFLAG_NORMAL );
-               }
-       }
-}
-
-
-// Required function, draw the game status panel
-void qto_hud_status(vector pos, vector mySize)
-{
-       HUD_Panel_DrawBg(1);
-       vector ts;
-       ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message,
-               hud_fontsize * 2, '0.25 0.47 0.72', panel_fg_alpha, DRAWFLAG_NORMAL,0.5);
-
-       pos_y += ts_y;
-       mySize_y -= ts_y;
-
-       vector player_fontsize = hud_fontsize * 1.75;
-       ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
-       ts_x = mySize_x;
-       vector mypos;
-       vector tile_size = '48 48 0';
-
-       mypos = pos;
-       drawfill(mypos,eX*mySize_x+eY*player_fontsize_y,'1 1 1',0.5,DRAWFLAG_ADDITIVE);
-       mypos_y += player_fontsize_y;
-       drawfill(mypos,eX*mySize_x+eY*tile_size_y,'1 1 1',0.25,DRAWFLAG_ADDITIVE);
-
-       entity e;
-       FOREACH_MINIGAME_ENTITY(e)
-       {
-               if ( e.classname == "minigame_player" )
-               {
-                       mypos = pos;
-                       minigame_drawcolorcodedstring_trunc(mySize_x,mypos,
-                               GetPlayerName(e.minigame_playerslot-1),
-                               player_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-
-                       mypos_y += player_fontsize_y;
-                       //drawpic( mypos,
-                       //              minigame_texture("qto/piece"),
-                       //              tile_size, '1 0 0', panel_fg_alpha, DRAWFLAG_NORMAL );
-
-                       //mypos_x += tile_size_x;
-
-                       drawstring(mypos,sprintf(_("Moves: %s"), ftos(e.qto_moves)),'32 32 0',
-                                          '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-               }
-       }
-}
-
-// Turn a set of flags into a help message
-string qto_turn_to_string(int turnflags)
-{
-       if ( turnflags & QTO_TURN_WIN )
-               return _("Well done, you win!");
-
-       if ( turnflags & QTO_TURN_MOVE )
-               return _("Turn all the angry faces into happy faces");
-
-       return "";
-}
-
-// Make the correct move
-void qto_make_move(entity minigame)
-{
-       if ( minigame.minigame_flags == QTO_TURN_MOVE )
-       {
-               minigame_cmd("move ",qto_curr_pos);
-       }
-}
-
-void qto_set_curr_pos(string s)
-{
-       if ( qto_curr_pos )
-               strunzone(qto_curr_pos);
-       if ( s )
-               s = strzone(s);
-       qto_curr_pos = s;
-}
-
-// Required function, handle client events
-int qto_client_event(entity minigame, string event, ...)
-{
-       switch(event)
-       {
-               case "activate":
-               {
-                       qto_set_curr_pos("");
-                       minigame.message = qto_turn_to_string(minigame.minigame_flags);
-                       return false;
-               }
-               case "key_pressed":
-               {
-                       //if((minigame.minigame_flags & QTO_TURN_TEAM) == minigame_self.team)
-                       {
-                               switch ( ...(0,int) )
-                               {
-                                       case K_RIGHTARROW:
-                                       case K_KP_RIGHTARROW:
-                                               if ( ! qto_curr_pos )
-                                                       qto_set_curr_pos("a3");
-                                               else
-                                                       qto_set_curr_pos( minigame_relative_tile(qto_curr_pos,1,0,QTO_NUM_CNT,QTO_LET_CNT));
-                                               return true;
-                                       case K_LEFTARROW:
-                                       case K_KP_LEFTARROW:
-                                               if ( ! qto_curr_pos )
-                                                       qto_set_curr_pos("c3");
-                                               else
-                                                       qto_set_curr_pos(minigame_relative_tile(qto_curr_pos,-1,0,QTO_NUM_CNT,QTO_LET_CNT));
-                                               return true;
-                                       case K_UPARROW:
-                                       case K_KP_UPARROW:
-                                               if ( ! qto_curr_pos )
-                                                       qto_set_curr_pos("a1");
-                                               else
-                                                       qto_set_curr_pos(minigame_relative_tile(qto_curr_pos,0,1,QTO_NUM_CNT,QTO_LET_CNT));
-                                               return true;
-                                       case K_DOWNARROW:
-                                       case K_KP_DOWNARROW:
-                                               if ( ! qto_curr_pos )
-                                                       qto_set_curr_pos("a3");
-                                               else
-                                                       qto_set_curr_pos(minigame_relative_tile(qto_curr_pos,0,-1,QTO_NUM_CNT,QTO_LET_CNT));
-                                               return true;
-                                       case K_ENTER:
-                                       case K_KP_ENTER:
-                                       case K_SPACE:
-                                               qto_make_move(minigame);
-                                               return true;
-                               }
-                       }
-
-                       return false;
-               }
-               case "mouse_pressed":
-               {
-                       if(...(0,int) == K_MOUSE1)
-                       {
-                               qto_make_move(minigame);
-                               return true;
-                       }
-
-                       return false;
-               }
-               case "mouse_moved":
-               {
-                       vector mouse_pos = minigame_hud_normalize(mousepos,qto_boardpos,qto_boardsize);
-                       if ( minigame.minigame_flags == QTO_TURN_MOVE )
-                       {
-                               qto_set_curr_pos(minigame_tile_name(mouse_pos,QTO_NUM_CNT,QTO_LET_CNT));
-                       }
-                       if ( ! qto_valid_tile(qto_curr_pos) )
-                               qto_set_curr_pos("");
-
-                       return true;
-               }
-               case "network_receive":
-               {
-                       entity sent = ...(0,entity);
-                       int sf = ...(1,int);
-                       if ( sent.classname == "minigame" )
-                       {
-                               if ( sf & MINIG_SF_UPDATE )
-                               {
-                                       sent.message = qto_turn_to_string(sent.minigame_flags);
-                                       if ( sent.minigame_flags & minigame_self.team )
-                                               minigame_prompt();
-                               }
-                       }
-                       else if(sent.classname == "minigame_board_piece")
-                       {
-                               if(sf & MINIG_SF_UPDATE)
-                               {
-                                       sent.cnt = ReadByte();
-                               }
-                       }
-                       else if ( sent.classname == "minigame_player" && (sf & QTO_SF_PLAYERSCORE ) )
-                       {
-                               sent.qto_moves = ReadLong();
-                       }
-
-                       return false;
-               }
-               case "menu_show":
-               {
-                       HUD_MinigameMenu_CustomEntry(...(0,entity),_("Restart"),"restart");
-                       return false;
-               }
-               case "menu_click":
-               {
-                       if(...(0,string) == "restart")
-                               minigame_cmd("restart");
-                       return false;
-               }
-       }
-
-       return false;
-}
-
-#endif
diff --git a/qcsrc/common/minigames/minigame/snake.qc b/qcsrc/common/minigames/minigame/snake.qc
new file mode 100644 (file)
index 0000000..c7bf6ae
--- /dev/null
@@ -0,0 +1,621 @@
+REGISTER_MINIGAME(snake, "Snake");
+
+const float SNAKE_TURN_MOVE  = 0x0100; // the snake is moving, player must control it
+const float SNAKE_TURN_LOSS  = 0x0200; // they did it?!
+const float SNAKE_TURN_WAIT  = 0x0400; // the snake is waiting for the player to make their first move and begin the game
+const float SNAKE_TURN_TYPE  = 0x0f00; // turn type mask
+
+const int SNAKE_SF_PLAYERSCORE = MINIG_SF_CUSTOM;
+
+const int SNAKE_LET_CNT = 15;
+const int SNAKE_NUM_CNT = 15;
+
+const int SNAKE_TILE_SIZE = 15;
+
+bool autocvar_sv_minigames_snake_wrap = false;
+float autocvar_sv_minigames_snake_delay_initial = 0.7;
+float autocvar_sv_minigames_snake_delay_multiplier = 50;
+float autocvar_sv_minigames_snake_delay_min = 0.1;
+
+.int snake_score;
+.entity snake_head;
+
+.float snake_delay;
+.float snake_nextmove;
+.vector snake_dir;
+
+// find same game piece given its tile name
+entity snake_find_piece(entity minig, string tile)
+{
+       entity e = world;
+       while ( ( e = findentity(e,owner,minig) ) )
+               if ( e.classname == "minigame_board_piece" && e.netname == tile )
+                       return e;
+       return world;
+}
+
+// find same game piece given its cnt
+entity snake_find_cnt(entity minig, int tile)
+{
+       entity e = world;
+       while ( ( e = findentity(e,owner,minig) ) )
+               if ( e.classname == "minigame_board_piece" && e.cnt == tile )
+                       return e;
+       return world;
+}
+
+// check if the tile name is valid (15x15 grid)
+bool snake_valid_tile(string tile)
+{
+       if ( !tile )
+               return false;
+       int number = minigame_tile_number(tile);
+       int letter = minigame_tile_letter(tile);
+       return 0 <= number && number < SNAKE_NUM_CNT && 0 <= letter && letter < SNAKE_LET_CNT;
+}
+
+void snake_new_mouse(entity minigame)
+{
+       RandomSelection_Init();
+       int i, j;
+       for(i = 0; i < SNAKE_LET_CNT; ++i)
+       for(j = 0; j < SNAKE_NUM_CNT; ++j)
+       {
+               string pos = minigame_tile_buildname(i, j);
+               if(!snake_find_piece(minigame, pos))
+                       RandomSelection_Add(world, 0, pos, 1, 1);
+       }
+
+       entity piece = msle_spawn(minigame,"minigame_board_piece");
+       piece.team = 1;
+       piece.netname = strzone(RandomSelection_chosen_string);
+       minigame_server_sendflags(piece,MINIG_SF_ALL);
+
+       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
+}
+
+void snake_setup_pieces(entity minigame)
+{
+       int targnum = bound(1, floor(random() * SNAKE_NUM_CNT), SNAKE_NUM_CNT - 1);
+       int targlet = bound(1, floor(random() * SNAKE_LET_CNT), SNAKE_LET_CNT - 1);
+
+       entity piece = msle_spawn(minigame,"minigame_board_piece");
+       piece.team = 1; // init default team?
+       piece.netname = strzone(minigame_tile_buildname(targlet,targnum));
+       piece.cnt = 1;
+       minigame_server_sendflags(piece,MINIG_SF_ALL);
+
+       minigame.snake_head = piece;
+
+       snake_new_mouse(minigame);
+
+       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
+}
+
+void snake_add_score(entity minigame, int thescore)
+{
+#ifdef SVQC
+       if(!minigame)
+               return;
+       if(minigame.minigame_players)
+       {
+               minigame.minigame_players.snake_score += thescore;
+               minigame.minigame_players.SendFlags |= SNAKE_SF_PLAYERSCORE;
+       }
+#endif
+}
+
+void snake_move_body(entity minigame, bool ate_mouse)
+{
+       entity tail = world;
+       string tailpos = string_null;
+       vector taildir = '0 0 0';
+
+       int i, pieces = 0;
+       for(i = (SNAKE_NUM_CNT * SNAKE_LET_CNT); i >= 2; --i)
+       {
+               entity piece = snake_find_cnt(minigame, i);
+               entity nextpiece = snake_find_cnt(minigame, i - 1);
+               if(!piece)
+                       continue;
+
+               pieces++;
+
+               if(!tail)
+               {
+                       tail = piece;
+                       tailpos = piece.netname;
+                       taildir = piece.snake_dir;
+               }
+
+               if(piece.netname) { strunzone(piece.netname); }
+               piece.netname = strzone(nextpiece.netname);
+               piece.snake_dir = nextpiece.snake_dir;
+               minigame_server_sendflags(piece, MINIG_SF_ALL);
+       }
+
+       // just a head
+       if(!pieces)
+       {
+               tail = minigame.snake_head;
+               tailpos = minigame.snake_head.netname;
+               taildir = minigame.snake_head.snake_dir;
+       }
+
+       if(tail && ate_mouse)
+       {
+               int newcnt = tail.cnt + 1;
+               minigame.snake_delay = max(autocvar_sv_minigames_snake_delay_min, autocvar_sv_minigames_snake_delay_initial - (newcnt / autocvar_sv_minigames_snake_delay_multiplier));
+               snake_add_score(minigame, 1);
+
+               entity piece = msle_spawn(minigame,"minigame_board_piece");
+               piece.cnt = newcnt;
+               piece.team = 1;
+               piece.snake_dir = taildir;
+               piece.netname = strzone(tailpos);
+               minigame_server_sendflags(piece,MINIG_SF_ALL);
+
+               minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
+       }
+}
+
+void snake_move_head(entity minigame)
+{
+       entity head = minigame.snake_head;
+       string newpos;
+
+       if(autocvar_sv_minigames_snake_wrap)
+               newpos = minigame_relative_tile(head.netname, minigame.snake_dir_x, minigame.snake_dir_y, SNAKE_NUM_CNT, SNAKE_LET_CNT);
+       else
+       {
+               int myx = minigame_tile_letter(head.netname);
+               int myy = minigame_tile_number(head.netname);
+
+               myx += minigame.snake_dir_x;
+               myy += minigame.snake_dir_y;
+
+               newpos = minigame_tile_buildname(myx, myy);
+       }
+
+       if(!snake_valid_tile(newpos) || (snake_find_piece(minigame, newpos)).cnt)
+       {
+               minigame.minigame_flags = SNAKE_TURN_LOSS;
+               minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
+               return;
+       }
+
+       bool ate_mouse = false;
+       entity piece = snake_find_piece(minigame, newpos);
+       if(piece && !piece.cnt)
+               ate_mouse = true;
+
+       // move the body first, then set the new head position?
+       snake_move_body(minigame, ate_mouse);
+
+       if(ate_mouse)
+       {
+               if(piece.netname) { strunzone(piece.netname); }
+               remove(piece);
+
+               snake_new_mouse(minigame);
+       }
+
+       if(head.netname) { strunzone(head.netname); }
+       head.netname = strzone(newpos);
+       minigame_server_sendflags(head,MINIG_SF_ALL);
+}
+
+// make a move
+void snake_move(entity minigame, entity player, string dxs, string dys )
+{
+       if ( (minigame.minigame_flags & SNAKE_TURN_MOVE) || (minigame.minigame_flags & SNAKE_TURN_WAIT) )
+       if ( dxs || dys )
+       {
+               //if ( snake_valid_tile(pos) )
+               //if ( snake_find_piece(minigame, pos) )
+               {
+                       int dx = ((dxs) ? bound(-1, stof(dxs), 1) : 0);
+                       int dy = ((dys) ? bound(-1, stof(dys), 1) : 0);
+
+                       int myl = minigame_tile_letter(minigame.snake_head.netname);
+                       int myn = minigame_tile_number(minigame.snake_head.netname);
+
+                       entity head = snake_find_piece(minigame, minigame_tile_buildname(myl + dx, myn + dy));
+                       if(head && head.cnt == 2)
+                               return; // nope!
+
+                       if(minigame.minigame_flags & SNAKE_TURN_WAIT)
+                               minigame.snake_nextmove = time;
+                       minigame.minigame_flags = SNAKE_TURN_MOVE;
+                       minigame.snake_dir_x = dx;
+                       minigame.snake_dir_y = dy;
+                       minigame.snake_dir_z = 0;
+                       minigame.snake_head.snake_dir = minigame.snake_dir;
+                       minigame_server_sendflags(minigame.snake_head,MINIG_SF_UPDATE);
+                       minigame_server_sendflags(minigame,MINIG_SF_UPDATE);
+               }
+       }
+}
+
+#ifdef SVQC
+
+
+// required function, handle server side events
+int snake_server_event(entity minigame, string event, ...)
+{
+       switch(event)
+       {
+               case "start":
+               {
+                       snake_setup_pieces(minigame);
+                       minigame.snake_delay = autocvar_sv_minigames_snake_delay_initial;
+                       minigame.minigame_flags = SNAKE_TURN_WAIT;
+                       return true;
+               }
+               case "end":
+               {
+                       entity e = world;
+                       while( (e = findentity(e, owner, minigame)) )
+                       if(e.classname == "minigame_board_piece")
+                       {
+                               if(e.netname) { strunzone(e.netname); }
+                               remove(e);
+                       }
+                       minigame.snake_head = world;
+                       return false;
+               }
+               case "join":
+               {
+                       int pl_num = minigame_count_players(minigame);
+
+                       // Don't allow more than 1 player
+                       // not sure if this should be a multiplayer game (might get crazy)
+                       if(pl_num >= 1) { return false; }
+
+                       // Team 1 by default
+                       return 1;
+               }
+               case "frame":
+               {
+                       if(minigame.minigame_flags & SNAKE_TURN_MOVE)
+                       if(time >= minigame.snake_nextmove)
+                       {
+                               snake_move_head(minigame);
+                               minigame.snake_nextmove = time + minigame.snake_delay;
+                       }
+                       return false;
+               }
+               case "cmd":
+               {
+                       switch(argv(0))
+                       {
+                               case "move": 
+                                       snake_move(minigame, ...(0,entity), ((...(1,int)) >= 2 ? argv(1) : string_null), ((...(1,int)) == 3 ? argv(2) : string_null)); 
+                                       return true;
+                       }
+
+                       return false;
+               }
+               case "network_send":
+               {
+                       entity sent = ...(0,entity);
+                       int sf = ...(1,int);
+                       if ( sent.classname == "minigame_board_piece" && (sf & MINIG_SF_UPDATE) )
+                       {
+                               WriteByte(MSG_ENTITY,sent.cnt);
+                               WriteCoord(MSG_ENTITY,sent.snake_dir_x);
+                               WriteCoord(MSG_ENTITY,sent.snake_dir_y);
+                       }
+                       else if ( sent.classname == "minigame_player" && (sf & SNAKE_SF_PLAYERSCORE ) )
+                       {
+                               WriteLong(MSG_ENTITY,sent.snake_score);
+                       }
+                       else if ( sent.classname == "minigame" && (sf & MINIG_SF_UPDATE ) )
+                       {
+                               WriteByte(MSG_ENTITY,autocvar_sv_minigames_snake_wrap);
+                       }
+                       return false;
+               }
+       }
+       
+       return false;
+}
+
+
+#elif defined(CSQC)
+
+vector snake_boardpos; // HUD board position
+vector snake_boardsize;// HUD board size
+
+bool snake_wrap;
+
+// Required function, draw the game board
+void snake_hud_board(vector pos, vector mySize)
+{
+       minigame_hud_fitsqare(pos, mySize);
+       snake_boardpos = pos;
+       snake_boardsize = mySize;
+       
+       minigame_hud_simpleboard(pos,mySize,minigame_texture("snake/board"));
+
+       vector tile_size = minigame_hud_denormalize_size('1 1 0' / SNAKE_TILE_SIZE,pos,mySize);
+       vector tile_pos;
+
+       entity tail = world;
+       int i;
+       for(i = (SNAKE_NUM_CNT * SNAKE_LET_CNT); i >= 2; --i)
+       {
+               entity piece = snake_find_cnt(active_minigame, i);
+               if(piece)
+               {
+                       tail = piece;
+                       break;
+               }
+       }
+
+       entity e;
+       FOREACH_MINIGAME_ENTITY(e)
+       {
+               if ( e.classname == "minigame_board_piece" )
+               {
+                       tile_pos = minigame_tile_pos(e.netname,SNAKE_NUM_CNT,SNAKE_LET_CNT);
+                       tile_pos = minigame_hud_denormalize(tile_pos,pos,mySize);
+                       string thepiece = "snake/mouse";
+                       if(e.cnt)
+                               thepiece = "snake/body";
+                       if(tail && e.cnt == tail.cnt)
+                               thepiece = "snake/tail";
+                       if(e.cnt == 1)
+                       {
+                               int dx = minigame_tile_letter(e.netname) + e.snake_dir_x * 2;
+                               int dy = minigame_tile_number(e.netname) + e.snake_dir_y * 2;
+                               entity mouse = snake_find_piece(active_minigame, minigame_tile_buildname(dx, dy));
+                               thepiece = "snake/head";
+                               if(mouse && !mouse.cnt)
+                               {
+                                       float myang = 0;
+                                       int myx = minigame_tile_letter(e.netname);
+                                       int myy = minigame_tile_number(e.netname);
+                                       if(myx - 2 == dx)
+                                               myang = M_PI*3/2;
+                                       if(myx + 2 == dx)
+                                               myang = M_PI/2;
+                                       if(myy - 2 == dy)
+                                               myang = M_PI;
+
+                                       int newx = minigame_tile_letter(e.netname) + e.snake_dir_x;
+                                       int newy = minigame_tile_number(e.netname) + e.snake_dir_y;
+                                       string newpos = minigame_tile_buildname(newx, newy);
+
+                                       vector my_pos = minigame_tile_pos(newpos,SNAKE_NUM_CNT,SNAKE_LET_CNT);
+                                       my_pos = minigame_hud_denormalize(my_pos,pos,mySize);
+
+                                       drawrotpic(my_pos, myang, minigame_texture("snake/tongue"),
+                                                       tile_size, tile_size/2, '1 1 1',
+                                                       panel_fg_alpha, DRAWFLAG_NORMAL );
+                               }
+                       }
+
+                       if(e.cnt == 1 || e.cnt == tail.cnt)
+                       {
+                               vector thedir = e.snake_dir;
+                               float theang = 0;
+                               if(e.cnt == tail.cnt)
+                               {
+                                       int thex = minigame_tile_letter(e.netname);
+                                       int they = minigame_tile_number(e.netname);
+                                       entity t = snake_find_cnt(active_minigame, e.cnt - 1);
+                                       int tx = minigame_tile_letter(t.netname);
+                                       int ty = minigame_tile_number(t.netname);
+
+                                       if(thex - 1 == tx)
+                                       {
+                                               thedir_y = 0;
+                                               thedir_x = -1;
+                                       }
+                                       if(they + 1 == ty)
+                                       {
+                                               thedir_x = 0;
+                                               thedir_y = 1;
+                                       }
+                                       if(they - 1 == ty)
+                                       {
+                                               thedir_x = 0;
+                                               thedir_y = -1;
+                                       }
+                               }
+
+                               if(thedir_y == -1)
+                                       theang = M_PI;
+                               if(thedir_x == 1)
+                                       theang = M_PI/2;
+                               if(thedir_x == -1)
+                                       theang = M_PI*3/2;
+
+                               drawrotpic(tile_pos, theang, minigame_texture(thepiece),
+                                                       tile_size, tile_size/2, '1 1 1',
+                                                       panel_fg_alpha, DRAWFLAG_NORMAL );
+                       }
+                       else
+                       {
+                               minigame_drawpic_centered( tile_pos,  
+                                               minigame_texture(thepiece),
+                                               tile_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL );
+                       }
+               }
+       }
+
+       if ( active_minigame.minigame_flags & SNAKE_TURN_LOSS )
+       {
+               int scores = 0;
+               FOREACH_MINIGAME_ENTITY(e)
+                       if(e.classname == "minigame_player")
+                               scores = e.snake_score;
+
+               vector winfs = hud_fontsize*2;
+               string scores_text;
+               scores_text = strcat("Score: ", ftos(scores));
+               
+               vector win_pos = pos+eY*(mySize_y-winfs_y)/2;
+               vector win_sz;
+               win_sz = minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos,
+                       sprintf("Game over! %s", scores_text), 
+                       winfs, 0, DRAWFLAG_NORMAL, 0.5);
+               
+               drawfill(win_pos-eY*hud_fontsize_y,win_sz+2*eY*hud_fontsize_y,'0.3 0.3 1',0.8,DRAWFLAG_ADDITIVE);
+               
+               minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos,
+                       sprintf("Game over! %s", scores_text), 
+                       winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5);
+       }
+}
+
+
+// Required function, draw the game status panel
+void snake_hud_status(vector pos, vector mySize)
+{
+       HUD_Panel_DrawBg(1);
+       vector ts;
+       ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message,
+               hud_fontsize * 2, '0.25 0.47 0.72', panel_fg_alpha, DRAWFLAG_NORMAL,0.5);
+       
+       pos_y += ts_y;
+       mySize_y -= ts_y;
+       
+       vector player_fontsize = hud_fontsize * 1.75;
+       ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
+       ts_x = mySize_x;
+       vector mypos;
+       vector tile_size = '48 48 0';
+
+       mypos = pos;
+       drawfill(mypos,eX*mySize_x+eY*player_fontsize_y,'1 1 1',0.5,DRAWFLAG_ADDITIVE);
+       mypos_y += player_fontsize_y;
+       drawfill(mypos,eX*mySize_x+eY*tile_size_y,'1 1 1',0.25,DRAWFLAG_ADDITIVE);
+
+       entity e;
+       FOREACH_MINIGAME_ENTITY(e)
+       {
+               if ( e.classname == "minigame_player" )
+               {
+                       mypos = pos;
+                       minigame_drawcolorcodedstring_trunc(mySize_x,mypos,
+                               GetPlayerName(e.minigame_playerslot-1),
+                               player_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       
+                       mypos_y += player_fontsize_y;
+                       //drawpic( mypos,  
+                       //              minigame_texture("snake/piece"),
+                       //              tile_size, '1 0 0', panel_fg_alpha, DRAWFLAG_NORMAL );
+                       
+                       //mypos_x += tile_size_x;
+
+                       drawstring(mypos,ftos(e.snake_score),tile_size,
+                                          '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+               }
+       }
+}
+
+// Turn a set of flags into a help message
+string snake_turn_to_string(int turnflags)
+{
+       if ( turnflags & SNAKE_TURN_LOSS )
+               return _("Game over!");
+       
+       if ( turnflags & SNAKE_TURN_WAIT )
+               return _("Press an arrow key to begin the game");
+
+       if ( turnflags & SNAKE_TURN_MOVE )
+               if(snake_wrap)
+                       return _("Avoid the snake's body, collect the mice!");
+               else
+                       return _("Avoid the screen edges and the snake's body, collect the mice!");
+       
+       return "";
+}
+
+// Make the correct move
+void snake_set_direction(entity minigame, int dx, int dy)
+{
+       //if ( minigame.minigame_flags == SNAKE_TURN_MOVE )
+       //{
+               minigame_cmd("move ",ftos(dx), " ", ftos(dy));
+       //}
+}
+
+// Required function, handle client events
+int snake_client_event(entity minigame, string event, ...)
+{
+       switch(event)
+       {
+               case "activate":
+               {
+                       minigame.message = snake_turn_to_string(minigame.minigame_flags);
+                       return false;
+               }
+               case "key_pressed":
+               {
+                       //if((minigame.minigame_flags & SNAKE_TURN_TEAM) == minigame_self.team)
+                       {
+                               switch ( ...(0,int) )
+                               {
+                                       case K_RIGHTARROW:
+                                       case K_KP_RIGHTARROW:
+                                               snake_set_direction(minigame, 1, 0);
+                                               return true;
+                                       case K_LEFTARROW:
+                                       case K_KP_LEFTARROW:
+                                               snake_set_direction(minigame, -1, 0);
+                                               return true;
+                                       case K_UPARROW:
+                                       case K_KP_UPARROW:
+                                               snake_set_direction(minigame, 0, 1);
+                                               return true;
+                                       case K_DOWNARROW:
+                                       case K_KP_DOWNARROW:
+                                               snake_set_direction(minigame, 0, -1);
+                                               return true;
+                               }
+                       }
+
+                       return false;
+               }
+               case "network_receive":
+               {
+                       entity sent = ...(0,entity);
+                       int sf = ...(1,int);
+                       if ( sent.classname == "minigame" )
+                       {
+                               if ( sf & MINIG_SF_UPDATE )
+                               {
+                                       snake_wrap = ReadByte();
+                                       sent.message = snake_turn_to_string(sent.minigame_flags);
+                                       //if ( sent.minigame_flags & minigame_self.team )
+                                               minigame_prompt();
+                               }
+                       }
+                       else if(sent.classname == "minigame_board_piece")
+                       {
+                               if(sf & MINIG_SF_UPDATE)
+                               {
+                                       sent.cnt = ReadByte();
+                                       sent.snake_dir_x = ReadCoord();
+                                       sent.snake_dir_y = ReadCoord();
+                                       sent.snake_dir_z = 0;
+                                       if(sent.cnt == 1)
+                                               minigame.snake_head = sent; // hax
+                               }
+                       }
+                       else if ( sent.classname == "minigame_player" && (sf & SNAKE_SF_PLAYERSCORE ) )
+                       {
+                               sent.snake_score = ReadLong();
+                       }
+
+                       return false;
+               }
+       }
+
+       return false;
+}
+
+#endif
\ No newline at end of file
index f2253c2a4b7c2da56fc7489a65b9829ac5389152..8c5005ed259f301e924a19c781ec2080db2e064a 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(ttt, "Tic Tac Toe");
+
 const int TTT_TURN_PLACE = 0x0100; // player has to place a piece on the board
 const int TTT_TURN_WIN   = 0x0200; // player has won
 const int TTT_TURN_DRAW  = 0x0400; // no moves are possible
index c2392ae0e0a733bd154e56ca7bdb6cd1a7075ab5..6a24d37ad8033a17036e671a0e0de5dacc8dcadb 100644 (file)
@@ -2,10 +2,11 @@
 
 entity minigame_get_descriptor(string id)
 {
-       entity e;
-       for ( e = minigame_descriptors; e != world; e = e.list_next )
-               if ( e.netname == id )
-                       return e;
+       FOREACH(MINIGAMES, true, LAMBDA(
+       {
+               if(it.netname == id)
+                       return it;
+       }));
        return world;
 }
 
index 536ac5018753af104d1cbb34fc3300efcdc6a506..7425149f389d9b484c38d089ebef97c2b750f6df 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef MINIGAMES_H
 #define MINIGAMES_H
 
-entity minigame_descriptors;
-
 // previous node in a doubly linked list
 .entity list_prev;
 // next node in a linked list
index 1bd9609dede6adfbe57056456d2da92779119485..73ad876cfe2da65435350ddb5718f46bcb99d7cc 100644 (file)
@@ -163,6 +163,14 @@ int minigame_addplayer(entity minigame_session, entity player)
        return mgteam;
 }
 
+void minigame_frame()
+{
+       entity minig = self;
+
+       minig.minigame_event(minig,"frame");
+       minig.nextthink = time + 0.1;
+}
+
 entity start_minigame(entity player, string minigame )
 {
        if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) )
@@ -175,6 +183,8 @@ entity start_minigame(entity player, string minigame )
                minig.classname = "minigame";
                minig.netname = strzone(strcat(e.netname,"_",ftos(num_for_edict(minig))));
                minig.descriptor = e;
+               minig.think = minigame_frame;
+               minig.nextthink = time;
                minig.minigame_event = e.minigame_event;
                minig.minigame_event(minig,"start");
                GameLogEcho(strcat(":minigame:start:",minig.netname));
@@ -263,25 +273,6 @@ void end_minigames()
        }
 }
 
-void initialize_minigames()
-{
-       entity last_minig = world;
-       entity minig;
-       #define MINIGAME(name,nicename) \
-               minig = spawn(); \
-               minig.classname = "minigame_descriptor"; \
-               minig.netname = #name; \
-               minig.message = nicename; \
-               minig.minigame_event = name##_server_event; \
-               if ( !last_minig ) minigame_descriptors = minig; \
-               else last_minig.list_next = minig; \
-               last_minig = minig;
-
-       REGISTERED_MINIGAMES
-
-       #undef MINIGAME
-}
-
 string invite_minigame(entity inviter, entity player)
 {
        if ( !inviter || !inviter.active_minigame )
@@ -359,9 +350,10 @@ void ClientCommand_minigame(int request, int argc, string command)
                }
                else if ( minig_cmd == "list" )
                {
-                       entity e;
-                       for ( e = minigame_descriptors; e != world; e = e.list_next )
-                               sprint(self,e.netname," (",e.message,") ","\n");
+                       FOREACH(MINIGAMES, true, LAMBDA(
+                       {
+                               sprint(self,it.netname," (",it.message,") ","\n");
+                       }));
                        return;
                }
                else if ( minig_cmd == "list-sessions" )
index 246440d39e5d0f84f03f06c0353033f03f5f4967..43b392f743a843caf5ecf26be5996be40a431536 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef SV_MINIGAMES_H
 #define SV_MINIGAMES_H
 
-/// Initialize the minigame system
-void initialize_minigames();
-
 /// Create a new minigame session
 /// \return minigame session entity
 entity start_minigame(entity player, string minigame );
@@ -49,4 +46,20 @@ entity minigame_sessions;
 
 bool minigame_SendEntity(entity to, int sf);
 
+void RegisterMinigames();
+const int MINIGAMES_MAX = 24;
+entity MINIGAMES[MINIGAMES_MAX], MINIGAMES_first, MINIGAMES_last;
+int MINIGAMES_COUNT;
+#define REGISTER_MINIGAME(name,nicename) \
+    REGISTER(RegisterMinigames, MINIGAME, MINIGAMES, MINIGAMES_COUNT, name, m_id, spawn()); \
+    int name##_server_event(entity, string, ...); \
+    REGISTER_INIT_POST(MINIGAME, name) { \
+        this.classname = "minigame_descriptor"; \
+        this.netname = strzone(strtolower(#name)); \
+        this.message = nicename; \
+               this.minigame_event = name##_server_event; \
+    } \
+    REGISTER_INIT(MINIGAME, name)
+REGISTER_REGISTRY(RegisterMinigames)
+
 #endif
index c668959655db0c25c19b8214afafffb91cd62e19..0d17f43ab4ef1b9b1dbe5e28bc73db8c9f677c3b 100644 (file)
@@ -18,10 +18,7 @@ CLASS(Model, Object)
     }
     METHOD(Model, model_precache, void(entity this)) {
         string s = this.model_str();
-        int fh = fopen(s, FILE_READ);
-        if (fh >= 0) {
-            fclose(fh);
-        } else if (s && s != "" && s != "null") {
+        if (s != "" && s != "null" && !fexists(s)) {
             LOG_WARNINGF("Missing model: \"%s\"\n", s);
             return;
         }
index d2881e9ba98d8d1ff5336af4a656d5e0143ba4c0..433fed6830e23c050bb1a9aa69678cb4f420ba7a 100644 (file)
@@ -91,7 +91,7 @@ void M_Mage_Attack_Spike_Explode()
 {SELFPARAM();
        self.event_damage = func_null;
 
-       sound(self, CH_SHOTS, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM);
 
        self.realowner.mage_spike = world;
 
@@ -258,7 +258,7 @@ void M_Mage_Defend_Heal()
 
 void M_Mage_Attack_Push()
 {SELFPARAM();
-       sound(self, CH_SHOTS, W_Sound("tagexp1"), 1, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_TAGEXP1, 1, ATTEN_NORM);
        RadiusDamage (self, self, (autocvar_g_monster_mage_attack_push_damage), (autocvar_g_monster_mage_attack_push_damage), (autocvar_g_monster_mage_attack_push_radius), world, world, (autocvar_g_monster_mage_attack_push_force), DEATH_MONSTER_MAGE, self.enemy);
        Send_Effect(EFFECT_TE_EXPLOSION, self.origin, '0 0 0', 1);
 
@@ -343,7 +343,7 @@ float M_Mage_Attack(float attack_type)
        return false;
 }
 
-void spawnfunc_monster_mage() { Monster_Spawn(MON_MAGE.monsterid); }
+spawnfunc(monster_mage) { Monster_Spawn(MON_MAGE.monsterid); }
 
 #endif // SVQC
 
@@ -422,8 +422,6 @@ bool M_Mage(int req)
                }
                case MR_PRECACHE:
                {
-                       precache_sound (W_Sound("grenade_impact"));
-                       precache_sound (W_Sound("tagexp1"));
                        return true;
                }
                #endif
index ea7fbbf7cc7fb17346ca57bc0a7ba4ed6e8c46a7..fe6078303cb5cacd1b488e0bccb38d0b8f6e6490 100644 (file)
@@ -50,7 +50,7 @@ void M_Shambler_Attack_Smash()
 {SELFPARAM();
        makevectors(self.angles);
        Send_Effect(EFFECT_EXPLOSION_MEDIUM, (self.origin + (v_forward * 150)) - ('0 0 1' * self.maxs.z), '0 0 0', 1);
-       sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
 
        // RadiusDamage does NOT support custom starting location, which means we must use this hack...
 
@@ -75,7 +75,7 @@ void M_Shambler_Attack_Lightning_Explode()
 {SELFPARAM();
        entity head;
 
-       sound(self, CH_SHOTS, W_Sound("electro_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTEN_NORM);
        Send_Effect(EFFECT_ELECTRO_IMPACT, '0 0 0', '0 0 0', 1);
 
        self.event_damage = func_null;
@@ -211,7 +211,7 @@ float M_Shambler_Attack(float attack_type)
        return false;
 }
 
-void spawnfunc_monster_shambler() { Monster_Spawn(MON_SHAMBLER.monsterid); }
+spawnfunc(monster_shambler) { Monster_Spawn(MON_SHAMBLER.monsterid); }
 #endif // SVQC
 
 bool M_Shambler(int req)
index fb71c2f22279b199fa8f0f1c518f6de506f88ca5..ba2b12695d8d9a2eb85273814b162cc161a6ac00 100644 (file)
@@ -63,7 +63,7 @@ void M_Spider_Attack_Web()
 {SELFPARAM();
        monster_makevectors(self.enemy);
 
-       sound(self, CH_SHOTS, W_Sound("electro_fire2"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_ELECTRO_FIRE2, VOL_BASE, ATTEN_NORM);
 
        entity proj = spawn ();
        proj.classname = "plasma";
@@ -124,7 +124,7 @@ bool M_Spider_Attack(int attack_type)
        return false;
 }
 
-void spawnfunc_monster_spider() { Monster_Spawn(MON_SPIDER.monsterid); }
+spawnfunc(monster_spider) { Monster_Spawn(MON_SPIDER.monsterid); }
 #endif // SVQC
 
 bool M_Spider(int req)
@@ -176,7 +176,6 @@ bool M_Spider(int req)
                }
                case MR_PRECACHE:
                {
-                       precache_sound (W_Sound("electro_fire2"));
                        return true;
                }
                #endif
index af174603d26b7e273aee653547c4bc2bf2d25755..d65bcf648da3ce62286f1d852f9ec2b858d87d01 100644 (file)
@@ -101,7 +101,7 @@ float M_Wyvern_Attack(float attack_type)
        return false;
 }
 
-void spawnfunc_monster_wyvern() { Monster_Spawn(MON_WYVERN.monsterid); }
+spawnfunc(monster_wyvern) { Monster_Spawn(MON_WYVERN.monsterid); }
 #endif // SVQC
 
 bool M_Wyvern(int req)
index ed169c99d736058e8dce676d6bd2c7046b1f0c0b..6242a757d081af4610645932402fa44c1e703b8f 100644 (file)
@@ -138,7 +138,7 @@ float M_Zombie_Attack(float attack_type)
        return false;
 }
 
-void spawnfunc_monster_zombie() { Monster_Spawn(MON_ZOMBIE.monsterid); }
+spawnfunc(monster_zombie) { Monster_Spawn(MON_ZOMBIE.monsterid); }
 #endif // SVQC
 
 bool M_Zombie(int req)
index 8eab200a6d9748d37269910dd06603ec2e1690a3..52e5af984753c8fbcdd43e898ac28165bac80433 100644 (file)
@@ -39,6 +39,7 @@ void monster_dropitem()
 
        vector org = self.origin + ((self.mins + self.maxs) * 0.5);
        entity e = spawn();
+       e.spawnfunc_checked = true;
 
        e.monster_loot = self.monster_loot;
 
@@ -49,7 +50,7 @@ void monster_dropitem()
        {
                setself(e);
                e.noalign = true;
-               e.monster_loot();
+               e.monster_loot(e);
                e.gravity = 1;
                e.movetype = MOVETYPE_TOSS;
                e.reset = SUB_Remove;
@@ -118,7 +119,7 @@ bool Monster_ValidTarget(entity mon, entity player)
                makevectors (mon.angles);
                dot = normalize (player.origin - mon.origin) * v_forward;
 
-               if(dot <= 0.3) { return false; }
+               if(dot <= autocvar_g_monsters_target_infront_range) { return false; }
        }
 
        return true; // this target is valid!
@@ -1045,7 +1046,7 @@ void Monster_Dead(entity attacker, float gibbed)
 
 void Monster_Damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
 {SELFPARAM();
-       if((self.spawnflags & MONSTERFLAG_INVINCIBLE) && deathtype != DEATH_KILL)
+       if((self.spawnflags & MONSTERFLAG_INVINCIBLE) && deathtype != DEATH_KILL && !ITEM_DAMAGE_NEEDKILL(deathtype))
                return;
 
        if(self.frozen && deathtype != DEATH_KILL && deathtype != DEATH_NADE_ICE_FREEZE)
@@ -1085,7 +1086,7 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty
        self.dmg_time = time;
 
        if(sound_allowed(MSG_BROADCAST, attacker) && deathtype != DEATH_DROWN)
-               spamsound (self, CH_PAIN, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM);  // FIXME: PLACEHOLDER
+               spamsound (self, CH_PAIN, SND(BODYIMPACT1), VOL_BASE, ATTEN_NORM);  // FIXME: PLACEHOLDER
 
        self.velocity += force * self.damageforcescale;
 
index fedcf9fe571d6445a60fbc9ad10cffcce8844a25..7a05c85ea3b05071fdeb4fe14d8d2c443bd51cc3 100644 (file)
@@ -63,6 +63,19 @@ void Casing_Draw()
     }
 }
 
+SOUND(BRASS1, W_Sound("brass1"));
+SOUND(BRASS2, W_Sound("brass2"));
+SOUND(BRASS3, W_Sound("brass3"));
+Sound SND_BRASS_RANDOM() {
+    return SOUNDS[SND_BRASS1.m_id + floor(prandom() * 3)];
+}
+SOUND(CASINGS1, W_Sound("casings1"));
+SOUND(CASINGS2, W_Sound("casings2"));
+SOUND(CASINGS3, W_Sound("casings3"));
+Sound SND_CASINGS_RANDOM() {
+    return SOUNDS[SND_CASINGS1.m_id + floor(prandom() * 3)];
+}
+
 void Casing_Touch()
 {SELFPARAM();
     if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
@@ -78,16 +91,14 @@ void Casing_Touch()
         {
             if (time >= self.nextthink)
             {
-                string s;
-                int f = floor(prandom() * 3) + 1;
-
+                Sound s;
                 switch (self.state)
                 {
                     case 1:
-                        s = W_Sound(strcat("casings", itos(f)));
+                        s = SND_CASINGS_RANDOM();
                         break;
                     default:
-                        s = W_Sound(strcat("brass", itos(f)));
+                        s = SND_BRASS_RANDOM();
                         break;
                 }
 
@@ -163,13 +174,4 @@ MUTATOR_HOOKFUNCTION(casings, CSQC_Parse_TempEntity)
     RubbleLimit("casing", autocvar_cl_casings_maxcount, Casing_Delete);
 }
 
-STATIC_INIT(Casings)
-{
-    precache_sound(W_Sound("brass1"));
-    precache_sound(W_Sound("brass2"));
-    precache_sound(W_Sound("brass3"));
-    precache_sound(W_Sound("casings1"));
-    precache_sound(W_Sound("casings2"));
-    precache_sound(W_Sound("casings3"));
-}
 #endif
index d7ca5a3351585f82148d90d6457d184ff13f3b8c..4d859b1fcab1438db82826be497093395af67a11 100644 (file)
@@ -232,10 +232,15 @@ void DrawItemsTimeItem(vector myPos, vector mySize, float ar, entity item, float
         HUD_Panel_DrawProgressBar(p_pos, p_size, autocvar_hud_panel_itemstime_progressbar_name, t/autocvar_hud_panel_itemstime_progressbar_maxtime, 0, autocvar_hud_panel_itemstime_iconalign, color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
     }
 
-    if (t > 0 && autocvar_hud_panel_itemstime_text)
-        drawstring_aspect(numpos, ftos(t), eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
-    else
-        picpos.x = myPos.x + mySize.x / 2 - mySize.y / 2;
+    if(autocvar_hud_panel_itemstime_text)
+    {
+        if(t > 0)
+            drawstring_aspect(numpos, ftos(t), eX * ((ar - 1)/ar) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+        else if(precache_pic("gfx/hud/default/checkmark")) // COMPAT: check if this image exists, as 0.8.1 clients lack it
+            drawpic_aspect_skin(numpos, "checkmark", eX * (ar - 1) * mySize_y + eY * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL);
+        else // legacy code, if the image is missing just center the icon
+            picpos.x = myPos.x + mySize.x / 2 - mySize.y / 2;
+    }
     if (item_availableTime)
         drawpic_aspect_skin_expanding(picpos, item.m_icon, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL, item_availableTime);
     drawpic_aspect_skin(picpos, item.m_icon, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * picalpha, DRAWFLAG_NORMAL);
index 9ec6c291451c20a80d683138178121afbbac88c0..ba189c9bf8dc38cb416107cf24682f67e89eea05 100644 (file)
@@ -127,8 +127,8 @@ string Nade_TrailEffect(float proj, float nade_team)
     ));
     switch (proj)
     {
-        case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team));
-        case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn");
+        case PROJECTILE_NADE:       return EFFECT_NADE_TRAIL(nade_team).eent_eff_name;
+        case PROJECTILE_NADE_BURN:  return EFFECT_NADE_TRAIL_BURN(nade_team).eent_eff_name;
     }
     return "";
 }
index 626c42c7d61d590c5d4e00f71b34041220e64edc..f2195698190f19aa8e7e2aaa64f93c131905929d 100644 (file)
@@ -1286,7 +1286,7 @@ void Local_Notification_sound(
                ));
                #endif
 
-               sound(
+               _sound(
                        world,
                        soundchannel,
                        sprintf(
diff --git a/qcsrc/common/sounds/sounds.inc b/qcsrc/common/sounds/sounds.inc
new file mode 100644 (file)
index 0000000..7993450
--- /dev/null
@@ -0,0 +1,276 @@
+// Global list of sounds
+// TODO: remove uses of _sound
+
+string W_Sound(string w_snd);
+
+SOUND(ARC_FIRE, W_Sound("arc_fire"));
+SOUND(ARC_LOOP, W_Sound("arc_loop"));
+SOUND(ARC_LOOP_OVERHEAT, W_Sound("arc_loop_overheat"));
+SOUND(ARC_STOP, W_Sound("arc_stop"));
+SOUND(CAMPINGRIFLE_FIRE2, W_Sound("campingrifle_fire2"));
+SOUND(CAMPINGRIFLE_FIRE, W_Sound("campingrifle_fire"));
+SOUND(CRYLINK_FIRE2, W_Sound("crylink_fire2"));
+SOUND(CRYLINK_FIRE, W_Sound("crylink_fire"));
+SOUND(CRYLINK_IMPACT2, W_Sound("crylink_impact2"));
+SOUND(CRYLINK_IMPACT, W_Sound("crylink_impact"));
+SOUND(CRYLINK_LINKJOIN, W_Sound("crylink_linkjoin"));
+SOUND(DRYFIRE, W_Sound("dryfire"));
+SOUND(ELECTRO_BOUNCE, W_Sound("electro_bounce"));
+SOUND(ELECTRO_FIRE2, W_Sound("electro_fire2"));
+SOUND(ELECTRO_FIRE, W_Sound("electro_fire"));
+SOUND(ELECTRO_FLY, W_Sound("electro_fly"));
+SOUND(ELECTRO_IMPACT, W_Sound("electro_impact"));
+SOUND(ELECTRO_IMPACT_COMBO, W_Sound("electro_impact_combo"));
+SOUND(FIREBALL_FIRE2, W_Sound("fireball_fire2"));
+SOUND(FIREBALL_FIRE, W_Sound("fireball_fire"));
+SOUND(FIREBALL_FLY2, W_Sound("fireball_fly2"));
+SOUND(FIREBALL_FLY, W_Sound("fireball_fly"));
+SOUND(FIREBALL_IMPACT2, W_Sound("fireball_impact2"));
+SOUND(FIREBALL_PREFIRE2, W_Sound("fireball_prefire2"));
+SOUND(FLAC_FIRE, W_Sound("flac_fire"));
+SOUND(GRENADE_BOUNCE1, W_Sound("grenade_bounce1"));
+SOUND(GRENADE_BOUNCE2, W_Sound("grenade_bounce2"));
+SOUND(GRENADE_BOUNCE3, W_Sound("grenade_bounce3"));
+SOUND(GRENADE_BOUNCE4, W_Sound("grenade_bounce4"));
+SOUND(GRENADE_BOUNCE5, W_Sound("grenade_bounce5"));
+SOUND(GRENADE_BOUNCE6, W_Sound("grenade_bounce6"));
+Sound SND_GRENADE_BOUNCE_RANDOM() {
+    return SOUNDS[SND_GRENADE_BOUNCE1.m_id + rint(random() * 5)];
+}
+SOUND(GRENADE_FIRE, W_Sound("grenade_fire"));
+SOUND(GRENADE_IMPACT, W_Sound("grenade_impact"));
+SOUND(GRENADE_STICK, W_Sound("grenade_stick"));
+SOUND(HAGAR_BEEP, W_Sound("hagar_beep"));
+SOUND(HAGAR_FIRE, W_Sound("hagar_fire"));
+SOUND(HAGAR_LOAD, W_Sound("hagar_load"));
+SOUND(HAGEXP1, W_Sound("hagexp1"));
+SOUND(HAGEXP2, W_Sound("hagexp2"));
+SOUND(HAGEXP3, W_Sound("hagexp3"));
+Sound SND_HAGEXP_RANDOM() {
+    return SOUNDS[SND_HAGEXP1.m_id + rint(random() * 2)];
+}
+
+SOUND(HOOKBOMB_FIRE, W_Sound("hookbomb_fire"));
+SOUND(HOOKBOMB_IMPACT, W_Sound("hookbomb_impact"));
+SOUND(HOOK_FIRE, W_Sound("hook_fire"));
+SOUND(HOOK_IMPACT, W_Sound("hook_impact"));
+SOUND(LASERGUN_FIRE, W_Sound("lasergun_fire"));
+SOUND(LASERIMPACT, W_Sound("laserimpact"));
+SOUND(LGBEAM_FLY, W_Sound("lgbeam_fly"));
+SOUND(MINE_DET, W_Sound("mine_det"));
+SOUND(MINE_EXP, W_Sound("mine_exp"));
+SOUND(MINE_FIRE, W_Sound("mine_fire"));
+SOUND(MINE_STICK, W_Sound("mine_stick"));
+SOUND(MINE_TRIGGER, W_Sound("mine_trigger"));
+SOUND(MINSTANEXFIRE, W_Sound("minstanexfire"));
+SOUND(NEXCHARGE, W_Sound("nexcharge"));
+SOUND(NEXFIRE, W_Sound("nexfire"));
+SOUND(NEXIMPACT, W_Sound("neximpact"));
+SOUND(NEXWHOOSH1, W_Sound("nexwhoosh1"));
+SOUND(NEXWHOOSH2, W_Sound("nexwhoosh2"));
+SOUND(NEXWHOOSH3, W_Sound("nexwhoosh3"));
+Sound SND_NEXWHOOSH_RANDOM() {
+    return SOUNDS[SND_NEXWHOOSH1.m_id + rint(random() * 2)];
+}
+SOUND(RELOAD, W_Sound("reload")); // until weapons have individual reload sounds, precache the reload sound here
+
+SOUND(RIC1, W_Sound("ric1"));
+SOUND(RIC2, W_Sound("ric2"));
+SOUND(RIC3, W_Sound("ric3"));
+Sound SND_RIC_RANDOM() {
+    return SOUNDS[SND_RIC1.m_id + rint(random() * 2)];
+}
+
+SOUND(ROCKET_DET, W_Sound("rocket_det"));
+SOUND(ROCKET_FIRE, W_Sound("rocket_fire"));
+SOUND(ROCKET_FLY, W_Sound("rocket_fly"));
+SOUND(ROCKET_IMPACT, W_Sound("rocket_impact"));
+SOUND(ROCKET_MODE, W_Sound("rocket_mode"));
+SOUND(SEEKEREXP1, W_Sound("seekerexp1"));
+SOUND(SEEKEREXP2, W_Sound("seekerexp2"));
+SOUND(SEEKEREXP3, W_Sound("seekerexp3"));
+SOUND(SEEKER_FIRE, W_Sound("seeker_fire"));
+SOUND(SHOTGUN_FIRE, W_Sound("shotgun_fire"));
+SOUND(SHOTGUN_MELEE, W_Sound("shotgun_melee"));
+SOUND(STRENGTH_FIRE, W_Sound("strength_fire"));
+SOUND(TAGEXP1, W_Sound("tagexp1"));
+SOUND(TAGEXP2, W_Sound("tagexp2"));
+SOUND(TAGEXP3, W_Sound("tagexp3"));
+SOUND(TAG_FIRE, W_Sound("tag_fire"));
+SOUND(TAG_IMPACT, W_Sound("tag_impact"));
+SOUND(TAG_ROCKET_FLY, W_Sound("tag_rocket_fly"));
+SOUND(UNAVAILABLE, W_Sound("unavailable"));
+SOUND(UZI_FIRE, W_Sound("uzi_fire"));
+SOUND(WEAPONPICKUP, W_Sound("weaponpickup"));
+SOUND(WEAPONPICKUP_NEW_TOYS, W_Sound("weaponpickup_new_toys"));
+SOUND(WEAPON_SWITCH, W_Sound("weapon_switch"));
+
+SOUND(CTF_CAPTURE_NEUTRAL, "ctf/capture.ogg");
+SOUND(CTF_CAPTURE_RED, "ctf/red_capture.wav");
+SOUND(CTF_CAPTURE_BLUE, "ctf/blue_capture.wav");
+SOUND(CTF_CAPTURE_YELLOW, "ctf/yellow_capture.ogg");
+SOUND(CTF_CAPTURE_PINK, "ctf/pink_capture.ogg");
+Sound SND_CTF_CAPTURE(int teamid) {
+    switch (teamid) {
+        case NUM_TEAM_1:    return SND_CTF_CAPTURE_RED;
+        case NUM_TEAM_2:    return SND_CTF_CAPTURE_BLUE;
+        case NUM_TEAM_3:    return SND_CTF_CAPTURE_YELLOW;
+        case NUM_TEAM_4:    return SND_CTF_CAPTURE_PINK;
+        default:            return SND_CTF_CAPTURE_NEUTRAL;
+    }
+}
+
+SOUND(CTF_DROPPED_NEUTRAL,  "ctf/neutral_dropped.wav");
+SOUND(CTF_DROPPED_RED,      "ctf/red_dropped.wav");
+SOUND(CTF_DROPPED_BLUE,     "ctf/blue_dropped.wav");
+SOUND(CTF_DROPPED_YELLOW,   "ctf/yellow_dropped.wav");
+SOUND(CTF_DROPPED_PINK,     "ctf/pink_dropped.wav");
+Sound SND_CTF_DROPPED(int teamid) {
+    switch (teamid) {
+        case NUM_TEAM_1:    return SND_CTF_DROPPED_RED;
+        case NUM_TEAM_2:    return SND_CTF_DROPPED_BLUE;
+        case NUM_TEAM_3:    return SND_CTF_DROPPED_YELLOW;
+        case NUM_TEAM_4:    return SND_CTF_DROPPED_PINK;
+        default:            return SND_CTF_DROPPED_NEUTRAL;
+    }
+}
+
+SOUND(CTF_PASS, "ctf/pass.wav");
+SOUND(CTF_RESPAWN, "ctf/flag_respawn.wav");
+
+SOUND(CTF_RETURNED_NEUTRAL,  "ctf/return.wav");
+SOUND(CTF_RETURNED_RED,      "ctf/red_returned.wav");
+SOUND(CTF_RETURNED_BLUE,     "ctf/blue_returned.wav");
+SOUND(CTF_RETURNED_YELLOW,   "ctf/yellow_returned.wav");
+SOUND(CTF_RETURNED_PINK,     "ctf/pink_returned.wav");
+Sound SND_CTF_RETURNED(int teamid) {
+    switch (teamid) {
+        case NUM_TEAM_1:    return SND_CTF_RETURNED_RED;
+        case NUM_TEAM_2:    return SND_CTF_RETURNED_BLUE;
+        case NUM_TEAM_3:    return SND_CTF_RETURNED_YELLOW;
+        case NUM_TEAM_4:    return SND_CTF_RETURNED_PINK;
+        default:            return SND_CTF_RETURNED_NEUTRAL;
+    }
+}
+
+SOUND(CTF_TAKEN_NEUTRAL,  "ctf/neutral_taken.wav");
+SOUND(CTF_TAKEN_RED,      "ctf/red_taken.wav");
+SOUND(CTF_TAKEN_BLUE,     "ctf/blue_taken.wav");
+SOUND(CTF_TAKEN_YELLOW,   "ctf/yellow_taken.wav");
+SOUND(CTF_TAKEN_PINK,     "ctf/pink_taken.wav");
+Sound SND_CTF_TAKEN(int teamid) {
+    switch (teamid) {
+        case NUM_TEAM_1:    return SND_CTF_TAKEN_RED;
+        case NUM_TEAM_2:    return SND_CTF_TAKEN_BLUE;
+        case NUM_TEAM_3:    return SND_CTF_TAKEN_YELLOW;
+        case NUM_TEAM_4:    return SND_CTF_TAKEN_PINK;
+        default:            return SND_CTF_TAKEN_NEUTRAL;
+    }
+}
+
+SOUND(CTF_TOUCH, "ctf/touch.wav");
+
+SOUND(DOM_CLAIM, "domination/claim.wav");
+
+SOUND(KA_DROPPED, "keepaway/dropped.wav");
+SOUND(KA_PICKEDUP, "keepaway/pickedup.wav");
+SOUND(KA_RESPAWN, "keepaway/respawn.wav");
+SOUND(KA_TOUCH, "keepaway/touch.wav");
+
+SOUND(KH_ALARM, "kh/alarm.wav");
+SOUND(KH_CAPTURE, "kh/capture.wav");
+SOUND(KH_COLLECT, "kh/collect.wav");
+SOUND(KH_DESTROY, "kh/destroy.wav");
+SOUND(KH_DROP, "kh/drop.wav");
+
+SOUND(NB_BOUNCE, "nexball/bounce.ogg");
+SOUND(NB_DROP, "nexball/drop.ogg");
+SOUND(NB_SHOOT1, "nexball/shoot1.ogg");
+SOUND(NB_SHOOT2, "nexball/shoot2.ogg");
+SOUND(NB_STEAL, "nexball/steal.ogg");
+
+SOUND(ONS_CONTROLPOINT_BUILD, "onslaught/controlpoint_build.ogg");
+SOUND(ONS_CONTROLPOINT_BUILT, "onslaught/controlpoint_built.ogg");
+SOUND(ONS_CONTROLPOINT_UNDERATTACK, "onslaught/controlpoint_underattack.ogg");
+SOUND(ONS_DAMAGEBLOCKEDBYSHIELD, "onslaught/damageblockedbyshield.wav");
+SOUND(ONS_ELECTRICITY_EXPLODE, "onslaught/electricity_explode.ogg");
+SOUND(ONS_GENERATOR_DECAY, "onslaught/generator_decay.ogg");
+SOUND(ONS_GENERATOR_UNDERATTACK, "onslaught/generator_underattack.ogg");
+SOUND(ONS_HIT1, "onslaught/ons_hit1.ogg");
+SOUND(ONS_HIT2, "onslaught/ons_hit2.ogg");
+SOUND(ONS_SPARK1, "onslaught/ons_spark1.ogg");
+SOUND(ONS_SPARK2, "onslaught/ons_spark2.ogg");
+SOUND(ONS_SHOCKWAVE, "onslaught/shockwave.ogg");
+
+SOUND(PORTO_BOUNCE, "porto/bounce.ogg");
+SOUND(PORTO_CREATE, "porto/create.ogg");
+SOUND(PORTO_EXPIRE, "porto/expire.ogg");
+SOUND(PORTO_EXPLODE, "porto/explode.ogg");
+SOUND(PORTO_FIRE, "porto/fire.ogg");
+SOUND(PORTO_UNSUPPORTED, "porto/unsupported.ogg");
+
+SOUND(TUR_PHASER, "turrets/phaser.ogg");
+
+SOUND(VEH_ALARM, "vehicles/alarm.wav");
+SOUND(VEH_ALARM_SHIELD, "vehicles/alarm_shield.wav");
+SOUND(VEH_MISSILE_ALARM, "vehicles/missile_alarm.wav");
+
+SOUND(VEH_BUMBLEBEE_FIRE, W_Sound("flacexp3"));
+
+SOUND(VEH_RACER_BOOST, "vehicles/racer_boost.wav");
+SOUND(VEH_RACER_IDLE, "vehicles/racer_idle.wav");
+SOUND(VEH_RACER_MOVE, "vehicles/racer_move.wav");
+
+SOUND(VEH_RAPTOR_FLY, "vehicles/raptor_fly.wav");
+SOUND(VEH_RAPTOR_SPEED, "vehicles/raptor_speed.wav");
+
+SOUND(VEH_SPIDERBOT_DIE, "vehicles/spiderbot_die.wav");
+SOUND(VEH_SPIDERBOT_IDLE, "vehicles/spiderbot_idle.wav");
+SOUND(VEH_SPIDERBOT_JUMP, "vehicles/spiderbot_jump.wav");
+SOUND(VEH_SPIDERBOT_LAND, "vehicles/spiderbot_land.wav");
+SOUND(VEH_SPIDERBOT_STRAFE, "vehicles/spiderbot_strafe.wav");
+SOUND(VEH_SPIDERBOT_WALK, "vehicles/spiderbot_walk.wav");
+
+SOUND(NADE_BEEP, "overkill/grenadebip.ogg");
+
+SOUND(BUFF_LOST, "relics/relic_effect.wav");
+
+SOUND(POWEROFF, "misc/poweroff.wav");
+SOUND(POWERUP, "misc/powerup.ogg");
+SOUND(SHIELD_RESPAWN, "misc/shield_respawn.wav");
+SOUND(STRENGTH_RESPAWN, "misc/strength_respawn.wav");
+
+SOUND(ARMOR25, "misc/armor25.wav");
+SOUND(ARMORIMPACT, "misc/armorimpact.wav");
+SOUND(BODYIMPACT1, "misc/bodyimpact1.wav");
+SOUND(BODYIMPACT2, "misc/bodyimpact2.wav");
+
+SOUND(ITEMPICKUP, "misc/itempickup.ogg");
+SOUND(ITEMRESPAWNCOUNTDOWN, "misc/itemrespawncountdown.ogg");
+SOUND(ITEMRESPAWN, "misc/itemrespawn.ogg");
+SOUND(MEGAHEALTH, "misc/megahealth.ogg");
+
+SOUND(LAVA, "player/lava.wav");
+SOUND(SLIME, "player/slime.wav");
+
+SOUND(GIB, "misc/gib.wav");
+SOUND(GIB_SPLAT01, "misc/gib_splat01.wav");
+SOUND(GIB_SPLAT02, "misc/gib_splat02.wav");
+SOUND(GIB_SPLAT03, "misc/gib_splat03.wav");
+SOUND(GIB_SPLAT04, "misc/gib_splat04.wav");
+Sound SND_GIB_SPLAT_RANDOM() {
+    return SOUNDS[SND_GIB_SPLAT01.m_id + floor(prandom() * 4)];
+}
+
+SOUND(HIT, "misc/hit.wav");
+SOUND(TYPEHIT, "misc/typehit.wav");
+
+SOUND(SPAWN, "misc/spawn.ogg");
+
+SOUND(TALK, "misc/talk.wav");
+
+SOUND(TELEPORT, "misc/teleport.ogg");
+
+SOUND(INVSHOT, "misc/invshot.wav");
+
+SOUND(JETPACK_FLY, "misc/jetpack_fly.ogg");
diff --git a/qcsrc/common/sounds/sounds.qh b/qcsrc/common/sounds/sounds.qh
new file mode 100644 (file)
index 0000000..c9838b2
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef SOUNDS_H
+#define SOUNDS_H
+
+#include "../teams.qh"
+
+// Play all sounds via sound7, for access to the extra channels.
+// Otherwise, channels 8 to 15 would be blocked for a weird QW feature.
+#ifdef SVQC
+    #define _sound(e, c, s, v, a) do { \
+        entity __e = e; \
+        if (!sound_allowed(MSG_BROADCAST, __e)) break; \
+        sound7(__e, c, s, v, a, 0, 0); \
+    } while (0)
+#else
+    #define _sound(e, c, s, v, a) sound7(e, c, s, v, a, 0, 0)
+#endif
+#define sound(e, c, s, v, a) _sound(e, c, s.sound_str(), v, a)
+// Used in places where a string is required
+#define SND(id) (SND_##id.sound_str())
+
+void RegisterSounds();
+const int MAX_SOUNDS = 128;
+entity SOUNDS[MAX_SOUNDS], SOUNDS_first, SOUNDS_last;
+int SOUNDS_COUNT;
+
+CLASS(Sound, Object)
+    ATTRIB(Sound, m_id, int, 0)
+    ATTRIB(Sound, sound_str, string(), func_null)
+    CONSTRUCTOR(Sound, string() path)
+    {
+        CONSTRUCT(Sound);
+        this.sound_str = path;
+    }
+    METHOD(Sound, sound_precache, void(entity this)) {
+        string s = this.sound_str();
+        if (s && s != "" && !fexists(strcat("sound/", s))) {
+            LOG_WARNINGF("Missing sound: \"%s\"\n", s);
+            return;
+        }
+        LOG_TRACEF("precache_sound(\"%s\")\n", s);
+        precache_sound(s);
+    }
+ENDCLASS(Sound)
+
+#define SOUND(name, path) \
+    string SND_##name##_get() { return path; } \
+    REGISTER(RegisterSounds, SND, SOUNDS, SOUNDS_COUNT, name, m_id, NEW(Sound, SND_##name##_get))
+REGISTER_REGISTRY(RegisterSounds)
+
+STATIC_INIT(RegisterSounds_precache) {
+    FOREACH(SOUNDS, true, LAMBDA({
+        it.sound_precache(it);
+    }));
+}
+
+SOUND(Null, "misc/null.wav");
+#include "sounds.inc"
+
+#endif
index 298043bb573ae1b07e410ea3d3d8bac9c613cb20..8c7000d933ee1c8fd4418912dd8b7e0bbcc909d2 100644 (file)
@@ -28,8 +28,8 @@ noise : path/name of looping .wav file to play.
 dmg : Do this mutch dmg every .dmgtime intervall when blocked
 dmgtime : See above.
 */
-void spawnfunc_func_bobbing()
-{SELFPARAM();
+spawnfunc(func_bobbing)
+{
        entity controller;
        if (self.noise != "")
        {
index 0430db2d4104e49901f32b80549e144f8fcba45c..af9a6b4233124190ad4ab1a417d8f6562739190b 100644 (file)
@@ -162,7 +162,7 @@ void func_breakable_behave_restore()
        self.nextthink = 0; // cancel auto respawn
        func_breakable_colormod();
        if (self.noise1)
-               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
 }
 
 void func_breakable_init_for_player(entity player)
@@ -207,7 +207,7 @@ void func_breakable_destroy()
        func_breakable_destroyed();
 
        if(self.noise)
-               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
 
        if(self.dmg)
                RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, world, self.dmg_force, DEATH_HURTTRIGGER, world);
@@ -266,8 +266,8 @@ void func_breakable_reset()
 }
 
 // destructible walls that can be used to trigger target_objective_decrease
-void spawnfunc_func_breakable()
-{SELFPARAM();
+spawnfunc(func_breakable)
+{
        float n, i;
        if(!self.health)
                self.health = 100;
@@ -335,7 +335,7 @@ void spawnfunc_func_breakable()
 }
 
 // for use in maps with a "model" key set
-void spawnfunc_misc_breakablemodel() {
-       spawnfunc_func_breakable();
+spawnfunc(misc_breakablemodel) {
+       spawnfunc_func_breakable(this);
 }
 #endif
index b641d9446252890935a608795aff02c1ebb62829..75cfb94c690cf09d51c5ad8eaa1211bf5012043c 100644 (file)
@@ -2,7 +2,7 @@
 #define TRIGGERS_FUNC_BREAKABLE_H
 
 #ifdef SVQC
-void spawnfunc_func_breakable();
+spawnfunc(func_breakable);
 #endif
 
 #endif
index 228b3f810aa5c3b62b91a8508cbd9a545ddcfcf4..ab1cff538ef2e1bbbd6c020208578ce326ae7a03 100644 (file)
@@ -44,7 +44,7 @@ void button_fire()
                return;
 
        if (self.noise != "")
-               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
 
        self.state = STATE_UP;
        SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, button_wait);
@@ -112,8 +112,8 @@ When a button is touched, it moves some distance in the direction of it's angle,
 2) metallic click
 3) in-out
 */
-void spawnfunc_func_button()
-{SELFPARAM();
+spawnfunc(func_button)
+{
        SetMovedir ();
 
        if (!InitMovingBrushTrigger())
index 4f5a7d6ea591f50b5ffbbf9bca9a3cb6874874a1..32c12299e08e7b58726be45d072f2760f4904a65 100644 (file)
@@ -129,15 +129,15 @@ void conveyor_init()
        self.SendFlags |= 1;
 }
 
-void spawnfunc_trigger_conveyor()
+spawnfunc(trigger_conveyor)
 {
        SetMovedir();
        EXACTTRIGGER_INIT;
        conveyor_init();
 }
 
-void spawnfunc_func_conveyor()
-{SELFPARAM();
+spawnfunc(func_conveyor)
+{
        SetMovedir();
        InitMovingBrushTrigger();
        self.movetype = MOVETYPE_NONE;
index 8d19a740c26dbd6b6c89dccd0fab7b874abc454b..fed8e9fa424515b9c3aa8aa5aa3f5029e07b3529 100644 (file)
@@ -87,7 +87,7 @@ void door_blocked()
 void door_hit_top()
 {SELFPARAM();
        if (self.noise1 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.state = STATE_TOP;
        if (self.spawnflags & DOOR_TOGGLE)
                return;         // don't come down automatically
@@ -104,14 +104,14 @@ void door_hit_top()
 void door_hit_bottom()
 {SELFPARAM();
        if (self.noise1 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.state = STATE_BOTTOM;
 }
 
 void door_go_down()
 {SELFPARAM();
        if (self.noise2 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        if (self.max_health)
        {
                self.takedamage = DAMAGE_YES;
@@ -134,7 +134,7 @@ void door_go_up()
        }
 
        if (self.noise2 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        self.state = STATE_UP;
        SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, door_hit_top);
 
@@ -180,7 +180,7 @@ float door_check_keys(void)
                if (other.key_door_messagetime <= time)
                {
 
-                       play2(other, "misc/talk.wav");
+                       play2(other, SND(TALK));
                        Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(door.itemkeys));
                        other.key_door_messagetime = time + 2;
                }
@@ -190,7 +190,7 @@ float door_check_keys(void)
                // no keys were used
                if (other.key_door_messagetime <= time)
                {
-                       play2(other, "misc/talk.wav");
+                       play2(other, SND(TALK));
                        Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(door.itemkeys));
 
                        other.key_door_messagetime = time + 2;
@@ -202,7 +202,7 @@ float door_check_keys(void)
        {
 #ifdef SVQC
                // door is now unlocked
-               play2(other, "misc/talk.wav");
+               play2(other, SND(TALK));
                Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_UNLOCKED);
 #endif
                return true;
@@ -321,7 +321,7 @@ void door_touch()
        {
                if (IS_CLIENT(other))
                        centerprint(other, self.owner.message);
-               play2(other, "misc/talk.wav");
+               play2(other, SND(TALK));
        }
 #endif
 }
@@ -367,7 +367,7 @@ void door_generic_plat_blocked()
 void door_rotating_hit_top()
 {SELFPARAM();
        if (self.noise1 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.state = STATE_TOP;
        if (self.spawnflags & DOOR_TOGGLE)
                return;         // don't come down automatically
@@ -378,7 +378,7 @@ void door_rotating_hit_top()
 void door_rotating_hit_bottom()
 {SELFPARAM();
        if (self.noise1 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating
        {
                self.pos2 = '0 0 0' - self.pos2;
@@ -390,7 +390,7 @@ void door_rotating_hit_bottom()
 void door_rotating_go_down()
 {SELFPARAM();
        if (self.noise2 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        if (self.max_health)
        {
                self.takedamage = DAMAGE_YES;
@@ -412,7 +412,7 @@ void door_rotating_go_up()
                return;
        }
        if (self.noise2 != "")
-               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        self.state = STATE_UP;
        SUB_CalcAngleMove (self.pos2, TSPEED_LINEAR, self.speed, door_rotating_hit_top);
 
@@ -723,8 +723,8 @@ void door_reset()
 #ifdef SVQC
 
 // spawnflags require key (for now only func_door)
-void spawnfunc_func_door()
-{SELFPARAM();
+spawnfunc(func_door)
+{
        // Quake 1 keys compatibility
        if (self.spawnflags & SPAWNFLAGS_GOLD_KEY)
                self.itemkeys |= ITEM_KEY_BIT(0);
index fbe579c1361805da9d34027a20040c9df64f59aa..e01a7e73e299e6288652471a283eb9a4cb03a25c 100644 (file)
@@ -44,8 +44,8 @@ void door_rotating_init_startopen()
 }
 
 
-void spawnfunc_func_door_rotating()
-{SELFPARAM();
+spawnfunc(func_door_rotating)
+{
 
        //if (!self.deathtype) // map makers can override this
        //      self.deathtype = " got in the way";
index b793228784822068ec579e1b29924c95c5c5a789..8686c671f7c097c3a5307ecca54e478ef2b3734b 100644 (file)
@@ -35,7 +35,7 @@ void fd_secret_use()
        // Make a sound, wait a little...
 
        if (self.noise1 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.SUB_NEXTTHINK = self.SUB_LTIME + 0.1;
 
        temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
@@ -60,7 +60,7 @@ void fd_secret_use()
        self.dest2 = self.dest1 + v_forward * self.t_length;
        SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move1);
        if (self.noise2 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
 }
 
 void fd_secret_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
@@ -74,14 +74,14 @@ void fd_secret_move1()
        self.SUB_NEXTTHINK = self.SUB_LTIME + 1.0;
        self.think = fd_secret_move2;
        if (self.noise3 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
 }
 
 // Start moving sideways w/sound...
 void fd_secret_move2()
 {SELFPARAM();
        if (self.noise2 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        SUB_CalcMove(self.dest2, TSPEED_LINEAR, self.speed, fd_secret_move3);
 }
 
@@ -89,7 +89,7 @@ void fd_secret_move2()
 void fd_secret_move3()
 {SELFPARAM();
        if (self.noise3 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
        if (!(self.spawnflags & SECRET_OPEN_ONCE))
        {
                self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
@@ -101,7 +101,7 @@ void fd_secret_move3()
 void fd_secret_move4()
 {SELFPARAM();
        if (self.noise2 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move5);
 }
 
@@ -111,13 +111,13 @@ void fd_secret_move5()
        self.SUB_NEXTTHINK = self.SUB_LTIME + 1.0;
        self.think = fd_secret_move6;
        if (self.noise3 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
 }
 
 void fd_secret_move6()
 {SELFPARAM();
        if (self.noise2 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
        SUB_CalcMove(self.oldorigin, TSPEED_LINEAR, self.speed, fd_secret_done);
 }
 
@@ -130,7 +130,7 @@ void fd_secret_done()
                //self.th_pain = fd_secret_use;
        }
        if (self.noise3 != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
 }
 
 void secret_blocked()
@@ -161,7 +161,7 @@ void secret_touch()
        {
                if (IS_CLIENT(other))
                        centerprint(other, self.message);
-               play2(other, "misc/talk.wav");
+               play2(other, SND(TALK));
        }
 }
 
@@ -194,8 +194,8 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
 3) base
 */
 
-void spawnfunc_func_door_secret()
-{SELFPARAM();
+spawnfunc(func_door_secret)
+{
        /*if (!self.deathtype) // map makers can override this
                self.deathtype = " got in the way";*/
 
index 552fffe5a11deae6142a74b2e82a71bd0a4fe72c..2b3d07f6ea41dbc57dc441861290f00895fb5502 100644 (file)
@@ -39,8 +39,8 @@ void func_fourier_controller_think()
                self.owner.velocity = (v - self.owner.origin) * 10;
 }
 
-void spawnfunc_func_fourier()
-{SELFPARAM();
+spawnfunc(func_fourier)
+{
        entity controller;
        if (self.noise != "")
        {
index fc3d47210e7e3c76d4d43b42e50da36202d7484b..3785299e24444b361cf01bf23377e3a44fa5d94d 100644 (file)
@@ -39,8 +39,8 @@ void func_ladder_link()
        //self.model = "null";
 }
 
-void spawnfunc_func_ladder()
-{SELFPARAM();
+spawnfunc(func_ladder)
+{
        self.mdl = self.model;
        EXACTTRIGGER_INIT;
        self.touch = func_ladder_touch;
@@ -48,8 +48,8 @@ void spawnfunc_func_ladder()
        func_ladder_link();
 }
 
-void spawnfunc_func_water()
-{SELFPARAM();
+spawnfunc(func_water)
+{
        self.mdl = self.model;
        EXACTTRIGGER_INIT;
        self.touch = func_ladder_touch;
index b23541e03a479986afea7255282f5e0290b07103..d8bab869e2f743310b01163fb23c96c3e773c941 100644 (file)
@@ -21,8 +21,8 @@ void func_pendulum_controller_think()
        }
 }
 
-void spawnfunc_func_pendulum()
-{SELFPARAM();
+spawnfunc(func_pendulum)
+{
        entity controller;
        if (self.noise != "")
        {
index f2c57be21ec223e5d4ec12feed5a1abf73a878a9..de4c53cb53f69b6a0b265204bec44c5f79c8fec7 100644 (file)
@@ -59,8 +59,8 @@ void plat_link()
        //Net_LinkEntity(self, 0, false, plat_send);
 }
 
-void spawnfunc_func_plat()
-{SELFPARAM();
+spawnfunc(func_plat)
+{
        if (self.sounds == 0)
                self.sounds = 2;
 
index 3c11b2a5b675cef977ed8a0764871c5bc9c41694..04ab77f7fd70a4d3fd93f64b2cf26174416a7806 100644 (file)
@@ -112,8 +112,8 @@ void pointparticles_reset()
                self.state = 0;
 }
 
-void spawnfunc_func_pointparticles()
-{SELFPARAM();
+spawnfunc(func_pointparticles)
+{
        if(self.model != "")
                _setmodel(self, self.model);
        if(self.noise != "")
@@ -157,8 +157,8 @@ void spawnfunc_func_pointparticles()
        self.nextthink = time;
 }
 
-void spawnfunc_func_sparks()
-{SELFPARAM();
+spawnfunc(func_sparks)
+{
        // self.cnt is the amount of sparks that one burst will spawn
        if(self.cnt < 1) {
                self.cnt = 25.0; // nice default value
@@ -179,7 +179,7 @@ void spawnfunc_func_sparks()
        self.wait = 0;
        self.cnt = 0; // use mdl
 
-       spawnfunc_func_pointparticles();
+       spawnfunc_func_pointparticles(this);
 }
 #elif defined(CSQC)
 
@@ -230,7 +230,7 @@ void Draw_PointParticles()
                        if(self.noise != "")
                        {
                                setorigin(self, p);
-                               sound(self, CH_AMBIENT, self.noise, VOL_BASE * self.volume, self.atten);
+                               _sound(self, CH_AMBIENT, self.noise, VOL_BASE * self.volume, self.atten);
                        }
                        self.just_toggled = 0;
                }
index 8c00f9ce21fc2c8c828fdee03e66370fd22b1cdb..25085ae4aa880e934304b9f96c8db1ee0533e041 100644 (file)
@@ -26,8 +26,8 @@ Keys:
 "count"
  adjusts density, this many particles fall every second for a 1024x1024 area, default is 2000
 */
-void spawnfunc_func_rain()
-{SELFPARAM();
+spawnfunc(func_rain)
+{
        self.dest = self.velocity;
        self.velocity = '0 0 0';
        if (!self.dest)
@@ -64,8 +64,8 @@ Keys:
 "count"
  adjusts density, this many particles fall every second for a 1024x1024 area, default is 2000
 */
-void spawnfunc_func_snow()
-{SELFPARAM();
+spawnfunc(func_snow)
+{
        self.dest = self.velocity;
        self.velocity = '0 0 0';
        if (!self.dest)
index 2e3c7851a8f9090f926aa4d0cdc804e479d0a4b6..be2c7ed9c3d3828c972cfb592d764223f69c9d87 100644 (file)
@@ -26,8 +26,8 @@ dmg     : Do this mutch dmg every .dmgtime intervall when blocked
 dmgtime : See above.
 */
 
-void spawnfunc_func_rotating()
-{SELFPARAM();
+spawnfunc(func_rotating)
+{
        if (self.noise != "")
        {
                precache_sound(self.noise);
index 0c329cdb273eeb0e8166d41c36032ff436c774e0..859cdf53df00517d0f9c45cd56d5d6464dacc5d4 100644 (file)
@@ -1,6 +1,6 @@
 #ifdef SVQC
-void spawnfunc_func_stardust()
-{SELFPARAM();
+spawnfunc(func_stardust)
+{
        self.effects = EF_STARDUST;
 
        CSQCMODEL_AUTOINIT(self);
index 4149b538dcf9b24626e0b5afa279fd5b83e2586b..4284d24031e6d609f16428e146707ce1d5366747 100644 (file)
@@ -98,7 +98,7 @@ void train_next()
        }
 
        if(self.noise != "")
-               sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
+               _sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
 }
 
 #ifdef SVQC
@@ -183,8 +183,8 @@ speed : speed the train moves (can be overridden by each spawnfunc_path_corner)
 target : targetname of first spawnfunc_path_corner (starts here)
 */
 #ifdef SVQC
-void spawnfunc_func_train()
-{SELFPARAM();
+spawnfunc(func_train)
+{
        if (self.noise != "")
                precache_sound(self.noise);
 
index 32355004bed1d33ba21648cbf62f2196ecaa0d99..57d3a0636fafefb5f7036c2c0ef2f5cfa1e235f8 100644 (file)
@@ -98,8 +98,8 @@ void func_vectormamamam_findtarget()
        controller.think = func_vectormamamam_controller_think;
 }
 
-void spawnfunc_func_vectormamamam()
-{SELFPARAM();
+spawnfunc(func_vectormamamam)
+{
        if (self.noise != "")
        {
                precache_sound(self.noise);
index 390fd2c79c2949871b0e66a6b1aed731b098e922..ccac77b6c9c402b7340c68ad12263531a066a486 100644 (file)
@@ -26,8 +26,8 @@ void corner_link()
        //Net_LinkEntity(self, false, 0, corner_send);
 }
 
-void spawnfunc_path_corner()
-{SELFPARAM();
+spawnfunc(path_corner)
+{
        // setup values for overriding train movement
        // if a second value does not exist, both start and end speeds are the single value specified
        set_platmovetype(self, self.platmovetype);
index 02c9dcc277c740dd41852ce16d69338cce7bd161..842248a4b31f0acc93a7b91f32a784dea7c1978c 100644 (file)
@@ -62,8 +62,8 @@ void follow_init()
        }
 }
 
-void spawnfunc_misc_follow()
-{SELFPARAM();
+spawnfunc(misc_follow)
+{
        InitializeEntity(self, follow_init, INITPRIO_FINDTARGET);
 }
 #endif
index 52d2caf65aada325c89e45404952dc4dde407b90..ec4a9e277a09e5bf5770180dc718bb6781541d90 100644 (file)
@@ -203,8 +203,8 @@ void laser_reset()
                self.state = 0;
 }
 
-void spawnfunc_misc_laser()
-{SELFPARAM();
+spawnfunc(misc_laser)
+{
        if(self.mdl)
        {
                if(self.mdl == "none")
index a3c9783537bb9632d691def050eeedb8bf8fa220..00752cfa59c5faa92a39756d31272ceec224e03a 100644 (file)
@@ -1,7 +1,7 @@
 #ifdef SVQC
 
-void spawnfunc_info_teleport_destination (void)
-{SELFPARAM();
+spawnfunc(info_teleport_destination)
+{
        self.classname = "info_teleport_destination";
 
        self.mangle = self.angles;
@@ -17,14 +17,14 @@ void spawnfunc_info_teleport_destination (void)
                objerror ("^3Teleport destination without a targetname");
 }
 
-void spawnfunc_misc_teleporter_dest (void)
+spawnfunc(misc_teleporter_dest)
 {
-       spawnfunc_info_teleport_destination();
+       spawnfunc_info_teleport_destination(this);
 }
 
-void spawnfunc_target_teleporter (void)
+spawnfunc(target_teleporter)
 {
-       spawnfunc_info_teleport_destination();
+       spawnfunc_info_teleport_destination(this);
 }
 
 #endif
index b4f387470c64bea1c3e1e47fd17dbab141293e7d..dc568cae09224c001b4b1ba5c61f48bb5dede01a 100644 (file)
@@ -65,7 +65,7 @@ void plat_spawn_inside_trigger()
 
 void plat_hit_top()
 {SELFPARAM();
-       sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+       _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.state = 1;
 
        self.SUB_THINK = plat_go_down;
@@ -74,20 +74,20 @@ void plat_hit_top()
 
 void plat_hit_bottom()
 {SELFPARAM();
-       sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+       _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
        self.state = 2;
 }
 
 void plat_go_down()
 {SELFPARAM();
-       sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
+       _sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
        self.state = 3;
        SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, plat_hit_bottom);
 }
 
 void plat_go_up()
 {SELFPARAM();
-       sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
+       _sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
        self.state = 4;
        SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, plat_hit_top);
 }
index 8dc694e621e918e8e5a8049736f608f02da3950b..51e360e0c587c277dfecfd56f4a88e7a5d32d70c 100644 (file)
@@ -3,8 +3,9 @@
 .entity chlevel_targ;
 
 
-void spawnfunc_target_changelevel_use()
-{SELFPARAM();
+void target_changelevel_use()
+{
+       SELFPARAM();
        if(self.spawnflags & 2)
        {
                // simply don't react if a non-player triggers it
@@ -35,9 +36,9 @@ void spawnfunc_target_changelevel_use()
                localcmd(strcat("changelevel ", self.chmap, "\n"));
 }
 
-void spawnfunc_target_changelevel()
-{SELFPARAM();
-       self.use = spawnfunc_target_changelevel_use;
+spawnfunc(target_changelevel)
+{
+       self.use = target_changelevel_use;
 
        if(!self.count) { self.count = 0.7; }
 }
index 554032ee60cc7221b129b36e7b880aaca60cc60a..14512c794cfc960d92555e9e327c4c25f6c71d40 100644 (file)
@@ -1,13 +1,13 @@
 #ifdef SVQC
-void spawnfunc_target_location()
-{SELFPARAM();
+spawnfunc(target_location)
+{
     self.classname = "target_location";
     // location name in netname
     // eventually support: count, teamgame selectors, line of sight?
 }
 
-void spawnfunc_info_location()
-{SELFPARAM();
+spawnfunc(info_location)
+{
     self.classname = "target_location";
     self.message = self.netname;
 }
index 33261eabdbefc82206a2165da4d382053acddf4b..2748ed6f63af351807fa7ce56d3911d7e7c2145f 100644 (file)
@@ -46,8 +46,8 @@ void target_music_use()
        entity head;
        FOR_EACH_SPEC(head) if(head.enemy == activator) { msg_entity = head; target_music_sendto(MSG_ONE, 1); }
 }
-void spawnfunc_target_music()
-{SELFPARAM();
+spawnfunc(target_music)
+{
        self.use = target_music_use;
        self.reset = target_music_reset;
        if(!self.volume)
@@ -125,8 +125,8 @@ void trigger_music_use()
        self.cnt = !self.cnt;
        self.SendFlags |= 0x80;
 }
-void spawnfunc_trigger_music()
-{SELFPARAM();
+spawnfunc(trigger_music)
+{
        if(self.model != "")
                _setmodel(self, self.model);
        if(!self.volume)
@@ -182,9 +182,9 @@ void TargetMusic_Advance()
                if(vol != vol0)
                {
                        if(vol0 < 0)
-                               sound(e, CH_BGM_SINGLE, e.noise, vol, ATTEN_NONE); // restart
+                               _sound(e, CH_BGM_SINGLE, e.noise, vol, ATTEN_NONE); // restart
                        else
-                               sound(e, CH_BGM_SINGLE, "", vol, ATTEN_NONE);
+                               _sound(e, CH_BGM_SINGLE, "", vol, ATTEN_NONE);
                        e.lastvol = vol;
                }
        }
@@ -223,7 +223,7 @@ void Net_TargetMusic()
                        strunzone(e.noise);
                e.noise = strzone(noi);
                precache_sound(e.noise);
-               sound(e, CH_BGM_SINGLE, e.noise, 0, ATTEN_NONE);
+               _sound(e, CH_BGM_SINGLE, e.noise, 0, ATTEN_NONE);
                if(getsoundtime(e, CH_BGM_SINGLE) < 0)
                {
                        LOG_TRACEF("Cannot initialize sound %s\n", e.noise);
@@ -310,7 +310,7 @@ void Ent_ReadTriggerMusic()
                if(self.noise != s)
                {
                        precache_sound(self.noise);
-                       sound(self, CH_BGM_SINGLE, self.noise, 0, ATTEN_NONE);
+                       _sound(self, CH_BGM_SINGLE, self.noise, 0, ATTEN_NONE);
                        if(getsoundtime(self, CH_BGM_SINGLE) < 0)
                        {
                                LOG_TRACEF("Cannot initialize sound %s\n", self.noise);
index 591b971d504a58bf9bcdcff9d44c8e5d9a6fef30..10fe3c764afb24b3152cd052346cecc2457b7e42 100644 (file)
@@ -280,6 +280,7 @@ void target_spawn_use()
                if(!target_spawn_cancreate())
                        return;
                e = spawn();
+               e.spawnfunc_checked = true;
                target_spawn_useon(e);
                e.target_spawn_id = self.target_spawn_id;
        }
@@ -332,8 +333,8 @@ void initialize_field_db()
        }
 }
 
-void spawnfunc_target_spawn()
-{SELFPARAM();
+spawnfunc(target_spawn)
+{
        initialize_field_db();
        self.use = target_spawn_use;
        self.message = strzone(strreplace("'", "\"", self.message));
index e0701dc14f3273487baec91a8d19543f0b1d1e08..0b3767ff654c856a13d9e6a515dc13020c5abd4f 100644 (file)
@@ -10,9 +10,9 @@ void target_speaker_use_activator()
        {
                var .string sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1));
                if(GetPlayerSoundSampleField_notFound)
-                       snd = "misc/null.wav";
+                       snd = SND(Null);
                else if(activator.(sample) == "")
-                       snd = "misc/null.wav";
+                       snd = SND(Null);
                else
                {
                        tokenize_console(activator.(sample));
@@ -36,9 +36,9 @@ void target_speaker_use_on()
        {
                var .string sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1));
                if(GetPlayerSoundSampleField_notFound)
-                       snd = "misc/null.wav";
+                       snd = SND(Null);
                else if(activator.(sample) == "")
-                       snd = "misc/null.wav";
+                       snd = SND(Null);
                else
                {
                        tokenize_console(activator.(sample));
@@ -52,13 +52,13 @@ void target_speaker_use_on()
        }
        else
                snd = self.noise;
-       sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten);
+       _sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten);
        if(self.spawnflags & 3)
                self.use = target_speaker_use_off;
 }
 void target_speaker_use_off()
 {SELFPARAM();
-       sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASE * self.volume, self.atten);
+       sound(self, CH_TRIGGER_SINGLE, SND_Null, VOL_BASE * self.volume, self.atten);
        self.use = target_speaker_use_on;
 }
 void target_speaker_reset()
@@ -75,8 +75,8 @@ void target_speaker_reset()
        }
 }
 
-void spawnfunc_target_speaker()
-{SELFPARAM();
+spawnfunc(target_speaker)
+{
        // TODO: "*" prefix to sound file name
        // TODO: wait and random (just, HOW? random is not a field)
        if(self.noise)
index 35d84da8df64de4a95e82f2debc9847bec413764..1d1816a7741e988f46f9ee70f6773efc5843fe6f 100644 (file)
@@ -73,8 +73,8 @@ void target_voicescript_next(entity pl)
        }
 }
 
-void spawnfunc_target_voicescript()
-{SELFPARAM();
+spawnfunc(target_voicescript)
+{
        // netname: directory of the sound files
        // message: list of "sound file" duration "sound file" duration, a *, and again a list
        //          foo1 4.1 foo2 4.0 foo3 -3.1 * fool1 1.1 fool2 7.1 fool3 9.1 fool4 3.7
index bc4398601920968c61cfd7fd9d25f879569461bc..94f2bd26bc99b897a88a45002f27a6a83a7b3f78 100644 (file)
@@ -79,7 +79,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
                if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps
                {
                        if(tflags & TELEPORT_FLAG_SOUND)
-                               sound (player, CH_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTEN_NORM);
+                               sound (player, CH_TRIGGER, SND_TELEPORT, VOL_BASE, ATTEN_NORM);
                        if(tflags & TELEPORT_FLAG_PARTICLES)
                        {
                                Send_Effect(EFFECT_TELEPORT, player.origin, '0 0 0', 1);
index 9eb7eb072bb3f2fa61d0048a12c127f8e7c34b2b..41f9f79ecc4d245d8c1f7790158a9efc11cfeb26 100644 (file)
@@ -36,8 +36,8 @@ If nomessage is not set, t will print "1 more.. " etc when triggered and "sequen
 
 After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself.
 */
-void spawnfunc_trigger_counter()
-{SELFPARAM();
+spawnfunc(trigger_counter)
+{
        self.wait = -1;
        if (!self.count)
                self.count = 2;
index a3e08e4d81f9f522a17008b82ee21e1a787c43aa..eb0c0af7754a252ce0ef5ac301f220314f345f34 100644 (file)
@@ -11,8 +11,8 @@ void delay_reset()
        self.nextthink = 0;
 }
 
-void spawnfunc_trigger_delay()
-{SELFPARAM();
+spawnfunc(trigger_delay)
+{
     if(!self.wait)
         self.wait = 1;
 
index 4545df19575afe5e4c17015c7feedc258e1908b7..a1f13d277e5f87e68d3391323596d0d9072cc659 100644 (file)
@@ -24,8 +24,8 @@ void trigger_disablerelay_use()
                LOG_INFO("Invalid use of trigger_disablerelay: ", ftos(a), " relays were on, ", ftos(b), " relays were off!\n");
 }
 
-void spawnfunc_trigger_disablerelay()
-{SELFPARAM();
+spawnfunc(trigger_disablerelay)
+{
        self.use = trigger_disablerelay_use;
 }
 #endif
index b5a2eb8b292d2120abe5dfc798ebd0b81b567c04..e039173fb01ea752cbfae4361181cb65895282c4 100644 (file)
@@ -9,11 +9,14 @@ void flipflop_use()
         SUB_UseTargets();
 }
 
-void spawnfunc_trigger_flipflop()
-{SELFPARAM();
+void _spawnfunc_trigger_flipflop();
+spawnfunc(trigger_flipflop)
+{
     if(self.spawnflags & 1)
         self.state = 1;
     self.use = flipflop_use;
-    self.reset = spawnfunc_trigger_flipflop; // perfect resetter
+    self.reset = _spawnfunc_trigger_flipflop; // perfect resetter
 }
+void _spawnfunc_trigger_flipflop() { SELFPARAM(); spawnfunc_trigger_flipflop(this); }
+
 #endif
index 1b72780e51c9f5cec6245a8dac5e456856153913..30e6ebae7015e6a25af19d7f8b82335b6571cec4 100644 (file)
@@ -6,10 +6,11 @@ void gamestart_use()
        remove(self);
 }
 
-void spawnfunc_trigger_gamestart()
-{SELFPARAM();
+void _spawnfunc_trigger_gamestart();
+spawnfunc(trigger_gamestart)
+{
        self.use = gamestart_use;
-       self.reset2 = spawnfunc_trigger_gamestart;
+       self.reset2 = _spawnfunc_trigger_gamestart;
 
        if(self.wait)
        {
@@ -19,4 +20,6 @@ void spawnfunc_trigger_gamestart()
        else
                InitializeEntity(self, gamestart_use, INITPRIO_FINDTARGET);
 }
+void _spawnfunc_trigger_gamestart() { SELFPARAM(); spawnfunc_trigger_gamestart(this); }
+
 #endif
index 659a336901e26665bb0ce56e14e1ee04327a252f..a6b3eedde651521db1a84c409b00940cec16c6a3 100644 (file)
@@ -80,13 +80,13 @@ void trigger_gravity_touch()
        {
                other.gravity = g;
                if(self.noise != "")
-                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+                       _sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                UpdateCSQCProjectile(self.owner);
        }
 }
 
-void spawnfunc_trigger_gravity()
-{SELFPARAM();
+spawnfunc(trigger_gravity)
+{
        if(self.gravity == 1)
                return;
 
index 323a4a160d2fb64cf36523fdfd58f3a624259219..5d4f2d0b3a2cf26a15508c630cc47bb19f90cc38 100644 (file)
@@ -19,14 +19,14 @@ void trigger_heal_touch()
                        {
                                other.health = min(other.health + self.health, self.max_health);
                                other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
-                               sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+                               _sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                        }
                }
        }
 }
 
-void spawnfunc_trigger_heal()
-{SELFPARAM();
+spawnfunc(trigger_heal)
+{
        self.active = ACTIVE_ACTIVE;
 
        EXACTTRIGGER_INIT;
index 7a12011931497bb4c141cecb0c7e7f1152aa1c5e..535ba8500d29743d138a27aca5ea980132110644 100644 (file)
@@ -57,8 +57,8 @@ defalt dmg = 5
 .entity trigger_hurt_next;
 entity trigger_hurt_last;
 entity trigger_hurt_first;
-void spawnfunc_trigger_hurt()
-{SELFPARAM();
+spawnfunc(trigger_hurt)
+{
        EXACTTRIGGER_INIT;
        self.active = ACTIVE_ACTIVE;
        self.touch = trigger_hurt_touch;
index 2b3bb5729a1461dae21a775b71a87f64ae9e0189..c40fed3a8387bc1da25a54f180de0efdafa3c197 100644 (file)
@@ -150,8 +150,8 @@ void trigger_impulse_link()
        //Net_LinkEntity(self, 0, false, trigger_impulse_send);
 }
 
-void spawnfunc_trigger_impulse()
-{SELFPARAM();
+spawnfunc(trigger_impulse)
+{
        self.active = ACTIVE_ACTIVE;
 
        EXACTTRIGGER_INIT;
index 5eb25221821def3f73fb5b13d22994f3fb337cd8..0695811e0f4143cb95567923700fd3719825b771 100644 (file)
@@ -182,7 +182,7 @@ void trigger_push_touch()
                {
                        // flash when activated
                        Send_Effect(EFFECT_JUMPPAD, other.origin, other.velocity, 1);
-                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+                       _sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                        self.pushltime = time + 0.2;
                }
                if(IS_REAL_CLIENT(other) || IS_BOT_CLIENT(other))
@@ -363,8 +363,8 @@ void trigger_push_link()
  *            values to target a point on the ceiling.
  *   movedir: if target is not set, this * speed * 10 is the velocity to be reached.
  */
-void spawnfunc_trigger_push()
-{SELFPARAM();
+spawnfunc(trigger_push)
+{
        SetMovedir ();
 
        EXACTTRIGGER_INIT;
@@ -406,9 +406,9 @@ void target_push_link()
        self.SendFlags |= 1; // update
 }
 
-void spawnfunc_target_push() { target_push_link(); }
-void spawnfunc_info_notnull() { target_push_link(); }
-void spawnfunc_target_position() { target_push_link(); }
+spawnfunc(target_push) { target_push_link(); }
+spawnfunc(info_notnull) { target_push_link(); }
+spawnfunc(target_position) { target_push_link(); }
 
 #endif
 
index bb0f4750eebbc2af005c12a86123bb02470270d7..efce0df62d95600473019f016e4ac656ad0699f9 100644 (file)
@@ -59,10 +59,10 @@ void trigger_push_findtarget();
  *   movedir: if target is not set, this * speed * 10 is the velocity to be reached.
  */
 #ifdef SVQC
-void spawnfunc_trigger_push();
+spawnfunc(trigger_push);
 
-void spawnfunc_target_push();
-void spawnfunc_info_notnull();
-void spawnfunc_target_position();
+spawnfunc(target_push);
+spawnfunc(info_notnull);
+spawnfunc(target_position);
 #endif
 #endif
index 17313f0aa85de43dda806660633a4055dcf10a73..365c6f5a908d01a7ea8a3f7f76a51ce2545e0b70 100644 (file)
@@ -132,8 +132,8 @@ wait: prevent triggering again for this amount of time (default: 5) - applies to
 If spawned without any key specified in itemkeys, this trigger will display an error and remove itself.
 message2 and noise2 will be resent to the player every 2 seconds while he is in the trigger zone.
 */
-void spawnfunc_trigger_keylock(void)
-{SELFPARAM();
+spawnfunc(trigger_keylock)
+{
        if(!self.itemkeys) { remove(self); return; }
 
        // set unlocked message
@@ -146,7 +146,7 @@ void spawnfunc_trigger_keylock(void)
                if(self.sounds == 1)
                        self.noise = "misc/secret.wav";
                else if(self.sounds == 2)
-                       self.noise = "misc/talk.wav";
+                       self.noise = SND(TALK);
                else //if (self.sounds == 3) {
                        self.noise = "misc/trigger1.wav";
        }
@@ -157,7 +157,7 @@ void spawnfunc_trigger_keylock(void)
 
        // set closed sourd
        if(self.noise2 == "")
-               self.noise2 = "misc/talk.wav";
+               self.noise2 = SND(TALK);
 
        // delay between triggering message2 and trigger2
        if(!self.wait) { self.wait = 5; }
index 0c8a7d359decbc8299181ea208087fea26761c82..c20514e1a61f8e9cff3b0355c77bee16d10fce4f 100644 (file)
@@ -162,8 +162,8 @@ string trigger_magicear_processmessage_forallears(entity source, float teamsay,
        return msgin;
 }
 
-void spawnfunc_trigger_magicear()
-{SELFPARAM();
+spawnfunc(trigger_magicear)
+{
        self.enemy = magicears;
        magicears = self;
 
index 5129ce35cdf11d20dfd2b567ca2b6f1efbb9d26c..d81f6e371958c9d3b8680567cf6817af849eefe7 100644 (file)
@@ -34,8 +34,8 @@ void monoflop_reset()
        self.nextthink = 0;
 }
 
-void spawnfunc_trigger_monoflop()
-{SELFPARAM();
+spawnfunc(trigger_monoflop)
+{
        if(!self.wait)
                self.wait = 1;
        if(self.spawnflags & 1)
index 007e6da2f5e980cfc89a807b338e907edeeba296..3261520d7a19e951ebdd198c7293facdf38a1de0 100644 (file)
@@ -32,7 +32,7 @@ void multi_trigger()
        }
 
        if (self.noise)
-               sound (self.enemy, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+               _sound (self.enemy, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
 
 // don't trigger again until reset
        self.takedamage = DAMAGE_NO;
@@ -139,8 +139,8 @@ sounds
 4)
 set "message" to text string
 */
-void spawnfunc_trigger_multiple()
-{SELFPARAM();
+spawnfunc(trigger_multiple)
+{
        self.reset = multi_reset;
        if (self.sounds == 1)
        {
@@ -149,8 +149,7 @@ void spawnfunc_trigger_multiple()
        }
        else if (self.sounds == 2)
        {
-               precache_sound ("misc/talk.wav");
-               self.noise = "misc/talk.wav";
+               self.noise = SND(TALK);
        }
        else if (self.sounds == 3)
        {
@@ -202,9 +201,9 @@ sounds
 4)
 set "message" to text string
 */
-void spawnfunc_trigger_once()
-{SELFPARAM();
-       self.wait = -1;
-       spawnfunc_trigger_multiple();
+spawnfunc(trigger_once)
+{
+       this.wait = -1;
+       spawnfunc_trigger_multiple(this);
 }
 #endif
index df14a518e61fb73faecab94a6bb58eb52dadc03b..5e72a96a2fe478d74523c3c53183524b873dda27 100644 (file)
@@ -2,5 +2,5 @@
 void multi_trigger();
 void multi_reset();
 
-void spawnfunc_trigger_once();
+spawnfunc(trigger_once);
 #endif
index d9c6c2e60c582fd18fce1ea67234e5af840cb074..78b3383fc0422f787fa68c075bd6bdd9c5514dd9 100644 (file)
@@ -55,8 +55,8 @@ respawntime: "off" cycle time (default: same as wait)
 -------- SPAWNFLAGS --------
 START_ON: assume it is already turned on (when targeted)
 */
-void spawnfunc_trigger_multivibrator()
-{SELFPARAM();
+spawnfunc(trigger_multivibrator)
+{
        if(!self.wait)
                self.wait = 1;
        if(!self.respawntime)
index 20962cd495d9de4cc3ce25eb4a30e396db6e16f3..178daad90e06b78904abc187d5e60f3f3aeda720 100644 (file)
@@ -1,10 +1,12 @@
 #ifdef SVQC
+void _spawnfunc_trigger_relay();
 /*QUAKED spawnfunc_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.  It can contain killtargets, targets, delays, and messages.
 */
-void spawnfunc_trigger_relay()
-{SELFPARAM();
+spawnfunc(trigger_relay)
+{
        self.use = SUB_UseTargets;
-       self.reset = spawnfunc_trigger_relay; // this spawnfunc resets fully
+       self.reset = _spawnfunc_trigger_relay; // this spawnfunc resets fully
 }
+void _spawnfunc_trigger_relay() { SELFPARAM(); spawnfunc_trigger_relay(this); }
 #endif
index b765151fd123faa685786bb3f3f66b1b4730ecab..147b6178a1e15abdeef8c6e924e295ce2137cfa1 100644 (file)
@@ -21,20 +21,20 @@ void relay_activators_use()
        setself(this);
 }
 
-void spawnfunc_relay_activate()
-{SELFPARAM();
+spawnfunc(relay_activate)
+{
        self.cnt = ACTIVE_ACTIVE;
        self.use = relay_activators_use;
 }
 
-void spawnfunc_relay_deactivate()
-{SELFPARAM();
+spawnfunc(relay_deactivate)
+{
        self.cnt = ACTIVE_NOT;
        self.use = relay_activators_use;
 }
 
-void spawnfunc_relay_activatetoggle()
-{SELFPARAM();
+spawnfunc(relay_activatetoggle)
+{
        self.cnt = ACTIVE_TOGGLE;
        self.use = relay_activators_use;
 }
index cadd95e5840abd319b53af727505d19a05cc9cc4..e45996bd855695593b1717e83e8b7f7551c700ad 100644 (file)
@@ -13,8 +13,8 @@ void trigger_relay_if_use()
                SUB_UseTargets();
 }
 
-void spawnfunc_trigger_relay_if()
-{SELFPARAM();
+spawnfunc(trigger_relay_if)
+{
        self.use = trigger_relay_if_use;
 }
 #endif
index f93287a920f4ad2c5a5187d17a03fad951e4b361..ab2b87aaa0da62276a72ed52f0cc74e81a119d1d 100644 (file)
@@ -26,8 +26,8 @@ void trigger_relay_teamcheck_reset()
        self.team = self.team_saved;
 }
 
-void spawnfunc_trigger_relay_teamcheck()
-{SELFPARAM();
+spawnfunc(trigger_relay_teamcheck)
+{
        self.team_saved = self.team;
        self.use = trigger_relay_teamcheck_use;
        self.reset = trigger_relay_teamcheck_reset;
index 27347d9e83ea1e63d2138446e1e4b4031329cc4a..d16d2773c193442fe04b83943e47b7c9ad8a5652 100644 (file)
@@ -51,8 +51,8 @@ killtarget: remove all entities with this targetname when triggered
 You should create a common/trigger textured brush covering the entrance to a secret room/area.
 Trigger secret can only be trigger by a player's touch and can not be a target itself.
 */
-void spawnfunc_trigger_secret()
-{SELFPARAM();
+spawnfunc(trigger_secret)
+{
        // FIXME: should it be disabled in most modes?
 
        // update secrets count
@@ -78,7 +78,7 @@ void spawnfunc_trigger_secret()
 
        // convert this trigger to trigger_once
        self.classname = "trigger_once";
-       spawnfunc_trigger_once();
+       spawnfunc_trigger_once(this);
 
        // take over the touch() function, so we can mark secret as found
        self.touch = trigger_secret_touch;
index b9a4acd1a411934b3a90500afdff44dbeafd77c5..2ae068d824f648bd3a98c776a708fbd23e1c018a 100644 (file)
@@ -21,7 +21,7 @@
 .entity swampslug;
 
 #ifdef SVQC
-void spawnfunc_trigger_swamp(void);
+spawnfunc(trigger_swamp);
 #endif
 void swamp_touch(void);
 void swampslug_think();
@@ -116,8 +116,8 @@ void swamp_link()
 Players gettin into the swamp will
 get slowd down and damaged
 */
-void spawnfunc_trigger_swamp(void)
-{SELFPARAM();
+spawnfunc(trigger_swamp)
+{
        // Init stuff
        EXACTTRIGGER_INIT;
        self.touch = swamp_touch;
index 129f4e387cbab7ca43b3e9ec93e3fca1b0ff4973..95bd7fbbd4ff0ab788035aff177c7e0d52d47e95 100644 (file)
@@ -47,8 +47,8 @@ void Teleport_Touch (void)
        WITH(entity, self, e, SUB_UseTargets());
 }
 
-void spawnfunc_trigger_teleport()
-{SELFPARAM();
+spawnfunc(trigger_teleport)
+{
        self.angles = '0 0 0';
 
        EXACTTRIGGER_INIT;
index de2d3aac287ef32783b120cd57a28ea49f0211aa..73d722cf0079a6490b52f8eb4d95da9c395b6ecf 100644 (file)
@@ -80,8 +80,8 @@ void viewloc_init()
        self.nextthink = time;
 }
 
-void spawnfunc_trigger_viewlocation()
-{SELFPARAM();
+spawnfunc(trigger_viewlocation)
+{
        // we won't check target2 here yet, as it may not even need to exist
        if(self.target == "") { LOG_INFO("^1FAIL!\n"); remove(self); return; }
 
@@ -114,21 +114,21 @@ void viewloc_link()
        Net_LinkEntity(self, false, 0, viewloc_send);
 }
 
-void spawnfunc_target_viewlocation_start()
-{SELFPARAM();
+spawnfunc(target_viewlocation_start)
+{
        self.classname = "target_viewlocation_start";
        self.cnt = 1;
        viewloc_link();
 }
-void spawnfunc_target_viewlocation_end()
-{SELFPARAM();
+spawnfunc(target_viewlocation_end)
+{
        self.classname = "target_viewlocation_end";
        self.cnt = 2;
        viewloc_link();
 }
 
 // compatibility
-void spawnfunc_target_viewlocation() { spawnfunc_target_viewlocation_start(); }
+spawnfunc(target_viewlocation) { spawnfunc_target_viewlocation_start(this); }
 
 #elif defined(CSQC)
 
index a44c688ed9544fb16c2e27647a8dd952807a39e3..73c5c49651259aaa9376945cc6e1c080df0bb91b 100644 (file)
@@ -173,7 +173,7 @@ void SUB_UseTargets()
        {
                centerprint(activator, self.message);
                if (self.noise == "")
-                       play2(activator, "misc/talk.wav");
+                       play2(activator, SND(TALK));
        }
 
 //
diff --git a/qcsrc/common/turrets/all.inc b/qcsrc/common/turrets/all.inc
new file mode 100644 (file)
index 0000000..04bb10f
--- /dev/null
@@ -0,0 +1,12 @@
+#include "unit/ewheel.qc"
+#include "unit/flac.qc"
+#include "unit/fusionreactor.qc"
+#include "unit/hellion.qc"
+#include "unit/hk.qc"
+#include "unit/machinegun.qc"
+#include "unit/mlrs.qc"
+#include "unit/phaser.qc"
+#include "unit/plasma.qc"
+#include "unit/plasma_dual.qc"
+#include "unit/tesla.qc"
+#include "unit/walker.qc"
diff --git a/qcsrc/common/turrets/all.qc b/qcsrc/common/turrets/all.qc
new file mode 100644 (file)
index 0000000..f0fc719
--- /dev/null
@@ -0,0 +1,5 @@
+#include "all.qh"
+
+#define IMPLEMENTATION
+#include "all.inc"
+#undef IMPLEMENTATION
index 04bb10f6a548e67da5fba28ed487c71a1300f52c..4f8a728028074f31aabfc02b9ae586532d77ca2a 100644 (file)
-#include "unit/ewheel.qc"
-#include "unit/flac.qc"
-#include "unit/fusionreactor.qc"
-#include "unit/hellion.qc"
-#include "unit/hk.qc"
-#include "unit/machinegun.qc"
-#include "unit/mlrs.qc"
-#include "unit/phaser.qc"
-#include "unit/plasma.qc"
-#include "unit/plasma_dual.qc"
-#include "unit/tesla.qc"
-#include "unit/walker.qc"
+#ifndef TURRETS_H
+#define TURRETS_H
+
+// turret requests
+#define TR_SETUP          1 // (BOTH) setup turret data
+#define TR_THINK                 2 // (SERVER) logic to run every frame
+#define TR_DEATH          3 // (SERVER) called when turret dies
+#define TR_PRECACHE       4 // (BOTH) precaches models/sounds used by this turret
+#define TR_ATTACK         5 // (SERVER) called when turret attacks
+#define TR_CONFIG         6 // (ALL)
+
+// functions:
+entity get_turretinfo(int id);
+
+// fields:
+.entity tur_head;
+
+// target selection flags
+.int target_select_flags;
+.int target_validate_flags;
+const int TFL_TARGETSELECT_NO = 2; // don't automatically find targets
+const int TFL_TARGETSELECT_LOS = 4; // require line of sight to find targets
+const int TFL_TARGETSELECT_PLAYERS = 8; // target players
+const int TFL_TARGETSELECT_MISSILES = 16; // target projectiles
+const int TFL_TARGETSELECT_TRIGGERTARGET = 32; // respond to turret_trigger_target events
+const int TFL_TARGETSELECT_ANGLELIMITS = 64; // apply extra angular limits to target selection
+const int TFL_TARGETSELECT_RANGELIMITS = 128; // limit target selection range
+const int TFL_TARGETSELECT_TEAMCHECK = 256; // don't attack teammates
+const int TFL_TARGETSELECT_NOBUILTIN = 512; // only attack targets when triggered
+const int TFL_TARGETSELECT_OWNTEAM = 1024; // only attack teammates
+const int TFL_TARGETSELECT_NOTURRETS = 2048; // don't attack other turrets
+const int TFL_TARGETSELECT_FOV = 4096; // extra limits to attack range
+const int TFL_TARGETSELECT_MISSILESONLY = 8192; // only attack missiles
+
+// aim flags
+.int aim_flags;
+const int TFL_AIM_NO = 1; // no aiming
+const int TFL_AIM_SPLASH = 2; // aim for ground around the target's feet
+const int TFL_AIM_LEAD = 4; // try to predict target movement
+const int TFL_AIM_SHOTTIMECOMPENSATE = 8; // compensate for shot traveltime when leading
+const int TFL_AIM_ZPREDICT = 16; // predict target's z position at impact
+const int TFL_AIM_SIMPLE = 32; // aim at player's current location
+
+// tracking flags
+.int track_flags;
+const int TFL_TRACK_NO = 2; // don't move head
+const int TFL_TRACK_PITCH = 4; // pitch head
+const int TFL_TRACK_ROTATE = 8; // rotate head
+
+// prefire checks
+.int firecheck_flags;
+const int TFL_FIRECHECK_DEAD = 4; // don't attack dead targets (zombies?)
+const int TFL_FIRECHECK_DISTANCES = 8; // another range check
+const int TFL_FIRECHECK_LOS = 16; // line of sight
+const int TFL_FIRECHECK_AIMDIST = 32; // consider distance impactpoint<->aimspot
+const int TFL_FIRECHECK_REALDIST = 64; // consider enemy origin<->impactpoint
+const int TFL_FIRECHECK_ANGLEDIST = 128; // consider angular diff head<->aimspot
+const int TFL_FIRECHECK_TEAMCHECK = 256; // don't attack teammates
+const int TFL_FIRECHECK_AFF = 512; // try to avoid any friendly fire
+const int TFL_FIRECHECK_AMMO_OWN = 1024; // own ammo needs to be larger than damage dealt
+const int TFL_FIRECHECK_AMMO_OTHER = 2048; // target's ammo needs to be less than max
+const int TFL_FIRECHECK_REFIRE = 4096; // check single attack finished delays
+const int TFL_FIRECHECK_NO = 16384; // no prefire checks
+
+// attack flags
+.int shoot_flags;
+const int TFL_SHOOT_NO = 64; // no attacking
+const int TFL_SHOOT_VOLLY = 2; // fire in vollies
+const int TFL_SHOOT_VOLLYALWAYS = 4; // always do a full volly, even if target is lost
+const int TFL_SHOOT_HITALLVALID = 8; // loop through all valid targets
+const int TFL_SHOOT_CLEARTARGET = 16; // lose target after attack (after volly is done if in volly mode)
+const int TFL_SHOOT_CUSTOM = 32; // custom attacking
+
+// turret capabilities
+.int turret_flags;
+const int TUR_FLAG_NONE = 0; // no abilities
+const int TUR_FLAG_SNIPER = 2; // sniping turret
+const int TUR_FLAG_SPLASH = 4; // can deal splash damage
+const int TUR_FLAG_HITSCAN = 8; // hit scan
+const int TUR_FLAG_MULTIGUN = 16; // multiple guns
+const int TUR_FLAG_GUIDED = 32; // laser guided projectiles
+const int TUR_FLAG_SLOWPROJ = 64; // turret fires slow projectiles
+const int TUR_FLAG_MEDPROJ = 128; // turret fires medium projectiles
+const int TUR_FLAG_FASTPROJ = 256; // turret fires fast projectiles
+const int TUR_FLAG_PLAYER = 512; // can damage players
+const int TUR_FLAG_MISSILE = 1024; // can damage missiles
+const int TUR_FLAG_SUPPORT = 2048; // supports other units
+const int TUR_FLAG_AMMOSOURCE = 4096; // can provide ammunition
+const int TUR_FLAG_RECIEVETARGETS = 8192; // can recieve targets from external sources
+const int TUR_FLAG_MOVE = 16384; // can move
+const int TUR_FLAG_ROAM = 32768; // roams around if not attacking
+const int TUR_FLAG_ISTURRET = 65536; // identifies this unit as a turret
+
+// ammo types
+#define ammo_flags currentammo
+const int TFL_AMMO_NONE = 64; // doesn't use ammo
+const int TFL_AMMO_ENERGY = 2; // uses power
+const int TFL_AMMO_BULLETS = 4; // uses bullets
+const int TFL_AMMO_ROCKETS = 8; // uses explosives
+const int TFL_AMMO_RECHARGE = 16; // regenerates ammo
+const int TFL_AMMO_RECIEVE = 32; // can recieve ammo from support units
+
+// damage flags
+.int damage_flags;
+const int TFL_DMG_NO = 256; // doesn't take damage
+const int TFL_DMG_YES = 2; // can be damaged
+const int TFL_DMG_TEAM = 4; // can be damaged by teammates
+const int TFL_DMG_RETALIATE = 8; // target attackers
+const int TFL_DMG_RETALIATE_TEAM = 16; // target attackers, even if on same team
+const int TFL_DMG_TARGETLOSS = 32; // loses target when damaged
+const int TFL_DMG_AIMSHAKE = 64; // damage throws off aim
+const int TFL_DMG_HEADSHAKE = 128; // damage shakes head
+const int TFL_DMG_DEATH_NORESPAWN = 256; // no re-spawning
+
+// spawn flags
+const int TSF_SUSPENDED = 1;
+const int TSF_TERRAINBASE = 2; // currently unused
+const int TSF_NO_AMMO_REGEN = 4; // disable builtin ammo regeneration
+const int TSF_NO_PATHBREAK = 8; // don't break path to chase enemies, will still fire at them if possible
+const int TSL_NO_RESPAWN = 16; // don't re-spawn
+const int TSL_ROAM = 32; // roam while idle
+
+// send flags
+const int TNSF_UPDATE       = 2;
+const int TNSF_STATUS       = 4;
+const int TNSF_SETUP        = 8;
+const int TNSF_ANG          = 16;
+const int TNSF_AVEL         = 32;
+const int TNSF_MOVE         = 64;
+.float anim_start_time;
+const int TNSF_ANIM         = 128;
+
+const int TNSF_FULL_UPDATE  = 16777215;
+
+
+// other useful macros
+#define TUR_ACTION(turrettype,mrequest) (get_turretinfo(turrettype)).turret_func(mrequest)
+#define TUR_NAME(turrettype) (get_turretinfo(turrettype)).turret_name
+
+// =====================
+//  Turret Registration
+// =====================
+
+float t_null(float dummy);
+void register_turret(entity e, float(float) func, float turretflags, vector min_s, vector max_s, string modelname, string headmodelname, string shortname, string mname);
+
+const int TUR_MAXCOUNT = 24;
+entity turret_info[TUR_MAXCOUNT], turret_info_first, turret_info_last;
+float TUR_COUNT;
+
+#define _REGISTER_TURRET(id, func, turretflags, min_s, max_s, modelname, headmodelname, shortname, mname) \
+       float func(float); \
+       REGISTER(RegisterTurrets, TUR, turret_info, TUR_COUNT, id, m_id, NEW(Turret)) { \
+               register_turret(this, func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname); \
+       }
+void RegisterTurrets();
+REGISTER_REGISTRY(RegisterTurrets)
+
+#ifdef MENUQC
+#define REGISTER_TURRET(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname) \
+       _REGISTER_TURRET(id,t_null,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname)
+#else
+#define REGISTER_TURRET(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname) \
+       _REGISTER_TURRET(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname)
+#endif
+
+float t_null(float dummy) { return 0; }
+
+CLASS(Turret, Object)
+    ATTRIB(Turret, m_id, int, 0)
+
+    ATTRIB(Turret, turretid, int, 0)
+    /** short name */
+    ATTRIB(Turret, netname, string, string_null)
+    /** human readable name */
+    ATTRIB(Turret, turret_name, string, string_null)
+    /** t_... */
+    ATTRIB(Turret, turret_func, float(float), t_null)
+    /** currently a copy of the model */
+    ATTRIB(Turret, mdl, string, string_null)
+    /** full name of model */
+    ATTRIB(Turret, model, string, string_null)
+    /** full name of tur_head model */
+    ATTRIB(Turret, head_model, string, string_null)
+    /** TODO: deprecate! */
+    ATTRIB(Turret, cvar_basename, string, string_null)
+
+    ATTRIB(Turret, spawnflags, int, 0)
+    /** turret hitbox size */
+    ATTRIB(Turret, mins, vector, '0 0 0')
+    /** turret hitbox size */
+    ATTRIB(Turret, maxs, vector, '0 0 0')
+
+    METHOD(Turret, display, void(entity this, void(string name, string icon) returns)) {
+        returns(this.turret_name, string_null);
+    }
+
+void register_turret(Turret e, float(float) func, float turretflags, vector min_s, vector max_s, string modelname, string headmodelname, string shortname, string mname)
+{
+       e.classname = "turret_info";
+       e.turretid = e.m_id;
+       e.netname = shortname;
+       e.turret_name = mname;
+       e.turret_func = func;
+       e.mdl = modelname;
+       e.cvar_basename = shortname;
+       e.spawnflags = turretflags;
+       e.mins = min_s;
+       e.maxs = max_s;
+       e.model = strzone(strcat("models/turrets/", modelname));
+       e.head_model = strzone(strcat("models/turrets/", headmodelname));
+}
+ENDCLASS(Turret)
+
+
+REGISTER_TURRET(Null,
+       t_null,
+       0,
+       '-0 -0 -0',
+       '0 0 0',
+       "",
+       "",
+       "",
+       "Turret"
+);
+
+entity get_turretinfo(float id)
+{
+       entity m;
+       if(id < 1 || id > TUR_COUNT - 1)
+               return TUR_Null;
+       m = turret_info[id];
+       if(m)
+               return m;
+       return TUR_Null;
+}
+
+#include "all.inc"
+
+#endif
index 2b0bd6f6763b338b8a3144f960c54348e7310b29..bb2bff22c8bf3179befb6610f7240773693126fe 100644 (file)
@@ -67,16 +67,16 @@ void turret_checkpoint_init()
     //tc_acum += 0.25;
 }
 
-void spawnfunc_turret_checkpoint()
-{SELFPARAM();
+spawnfunc(turret_checkpoint)
+{
     setorigin(self,self.origin);
     self.think = turret_checkpoint_init;
     self.nextthink = time + 0.2;
 }
 
 // Compat.
-void spawnfunc_walker_checkpoint()
-{SELFPARAM();
+spawnfunc(walker_checkpoint)
+{
     self.classname = "turret_checkpoint";
-    spawnfunc_turret_checkpoint();
+    spawnfunc_turret_checkpoint(this);
 }
index 232f546c125e2ec8f117de95870e8651bb3fce7e..b2a0fe1b53bcc798b1421299487f63a619dbe835 100644 (file)
@@ -1,3 +1,5 @@
+#include "all.qh"
+
 void turret_remove()
 {SELFPARAM();
        remove(self.tur_head);
@@ -216,7 +218,7 @@ void turret_construct()
        setsize(self, tur.mins, tur.maxs);
        setsize(self.tur_head, '0 0 0', '0 0 0');
 
-       if(self.turretid == TUR_EWHEEL)
+       if(self.turretid == TUR_EWHEEL.m_id)
                setattachment(self.tur_head, self, "");
        else
                setattachment(self.tur_head, self, "tag_head");
@@ -272,7 +274,7 @@ void turret_gibboom()
 {SELFPARAM();
        float i;
 
-       sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), self.origin, '0 0 0', 1);
 
        for (i = 1; i < 5; i = i + 1)
@@ -318,16 +320,16 @@ entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, flo
 
 void turret_die()
 {SELFPARAM();
-       sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), self.origin, '0 0 0', 1);
        if (!autocvar_cl_nogibs)
        {
                // Base
-               if(self.turretid == TUR_EWHEEL)
+               if(self.turretid == TUR_EWHEEL.m_id)
                        turret_gibtoss((get_turretinfo(self.turretid)).model, self.origin + '0 0 18', self.velocity + '0 0 400' + '0.1 0.1 1' * (random() * 400), '-1 -1 -1', true);
-               else if (self.turretid == TUR_WALKER)
+               else if (self.turretid == TUR_WALKER.m_id)
                        turret_gibtoss((get_turretinfo(self.turretid)).model, self.origin + '0 0 18', self.velocity + '0 0 300' + '0.1 0.1 1' * (random() * 200), '-1 -1 -1', true);
-               else if (self.turretid == TUR_TESLA)
+               else if (self.turretid == TUR_TESLA.m_id)
                        turret_gibtoss((get_turretinfo(self.turretid)).model, self.origin + '0 0 18', '0 0 200', '-1 -1 -1', false);
                else
                {
index 0f8ff9485117807a5f7e752a54b17eba6e3f3d42..f8ea64ad1151ce6bc873ca6a4feac7aba6a78d55 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef CL_TURRETS_H
 #define CL_TURRETS_H
 
+#include "all.qh"
+
 void ent_turret();
 
 #endif
index f35448e9c2212dd98506391dbced0b0133658e6d..1a8c2cbe7705e4bf9bf3f037eb37aa8d48107b97 100644 (file)
@@ -27,9 +27,8 @@ float T_Config_Queue_Compare(float root, float child, entity pass)
 
 void Dump_Turret_Settings(void)
 {
-       float i, x, totalsettings = 0;
-       for(i = TUR_FIRST; i <= TUR_LAST; ++i)
-       {
+       float x, totalsettings = 0;
+       FOREACH(turret_info, it != TUR_Null, LAMBDA({
                // step 1: clear the queue
                TUR_CONFIG_COUNT = 0;
                for(x = 0; x <= MAX_TUR_CONFIG; ++x)
@@ -50,7 +49,7 @@ void Dump_Turret_Settings(void)
                // step 5: debug info
                LOG_INFO(sprintf("#%d: %s: %d settings...\n", i, TUR_NAME(i), TUR_CONFIG_COUNT));
                totalsettings += TUR_CONFIG_COUNT;
-       }
+       }));
 
        // clear queue now that we're finished
        TUR_CONFIG_COUNT = 0;
@@ -58,5 +57,5 @@ void Dump_Turret_Settings(void)
                { tur_config_queue[x] = string_null; }
 
        // extra information
-       LOG_INFO(sprintf("Totals: %d turrets, %d settings\n", (i - 1), totalsettings));
+       LOG_INFO(sprintf("Totals: %d turrets, %d settings\n", (TUR_COUNT - 1), totalsettings));
 }
index 9c02d7ad91ec28f57adbb5ecf96ebd1472b326cb..c17061b22f0211422b48619fc1da96849e0ff222 100644 (file)
@@ -1,4 +1,5 @@
 #ifdef SVQC
+#include "all.qh"
 #include "../../server/autocvars.qh"
 
 // Generic aiming
@@ -457,7 +458,7 @@ entity turret_projectile(string _snd, float _size, float _health, float _death,
 {SELFPARAM();
        entity proj;
 
-       sound (self, CH_WEAPON_A, _snd, VOL_BASE, ATTEN_NORM);
+       _sound (self, CH_WEAPON_A, _snd, VOL_BASE, ATTEN_NORM);
        proj                             = spawn ();
        setorigin(proj, self.tur_shotorg);
        setsize(proj, '-0.5 -0.5 -0.5' * _size, '0.5 0.5 0.5' * _size);
index 8bba1c4a4a6e39ff3fcd11596b3224ec5aace3a9..1a4ade6806b29e0a713fdb63bb0c0b2da2a6e9ce 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef SV_TURRETS_H
 #define SV_TURRETS_H
 
+#include "all.qh"
+
 // turret fields
 .float ticrate; // interal ai think rate
 .vector aim_idle; // where to aim while idle
index 98c23c4584df4e98a4707c33f3121aee48ad55a5..625746341750754f0f6336550a1eff867aaf1430 100644 (file)
@@ -1,4 +1,4 @@
-void spawnfunc_turret_targettrigger();
+spawnfunc(turret_targettrigger);
 void turret_targettrigger_touch();
 
 void turret_targettrigger_touch()
@@ -27,8 +27,8 @@ void turret_targettrigger_touch()
 
 /*QUAKED turret_targettrigger (.5 .5 .5) ?
 */
-void spawnfunc_turret_targettrigger()
-{SELFPARAM();
+spawnfunc(turret_targettrigger)
+{
     if(!autocvar_g_turrets) { remove(self); return; }
 
     InitTrigger ();
diff --git a/qcsrc/common/turrets/turrets.qc b/qcsrc/common/turrets/turrets.qc
deleted file mode 100644 (file)
index 37c85ca..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "all.qh"
-
-// TURRET PLUGIN SYSTEM
-entity turret_info[TUR_MAXCOUNT];
-entity dummy_turret_info;
-
-void turrets_common_precache()
-{
-       precache_sound (W_Sound("rocket_impact"));
-
-#ifdef SVQC
-       precache_sound(W_Sound("rocket_impact"));
-#endif
-
-#ifdef TURRET_DEBUG
-       precache_model ("models/pathlib/goodsquare.md3");
-       precache_model ("models/pathlib/badsquare.md3");
-       precache_model ("models/pathlib/square.md3");
-       precache_model ("models/pathlib/edge.md3");
-#endif
-}
-
-void register_turret(float id, float(float) func, float turretflags, vector min_s, vector max_s, string modelname, string headmodelname, string shortname, string mname)
-{
-       entity e;
-       turret_info[id - 1] = e = spawn();
-       e.classname = "turret_info";
-       e.turretid = id;
-       e.netname = shortname;
-       e.turret_name = mname;
-       e.turret_func = func;
-       e.mdl = modelname;
-       e.cvar_basename = shortname;
-       e.spawnflags = turretflags;
-       e.mins = min_s;
-       e.maxs = max_s;
-       e.model = strzone(strcat("models/turrets/", modelname));
-       e.head_model = strzone(strcat("models/turrets/", headmodelname));
-
-       #ifndef MENUQC
-       turrets_common_precache();
-       #endif
-}
-float t_null(float dummy) { return 0; }
-void register_turrets_done()
-{
-       dummy_turret_info = spawn();
-       dummy_turret_info.classname = "turret_info";
-       dummy_turret_info.turretid = 0; // you can recognize dummies by this
-       dummy_turret_info.netname = "";
-       dummy_turret_info.turret_name = "Turret";
-       dummy_turret_info.turret_func = t_null;
-       dummy_turret_info.mdl = "";
-       dummy_turret_info.mins = '-0 -0 -0';
-       dummy_turret_info.maxs = '0 0 0';
-       dummy_turret_info.model = "";
-}
-entity get_turretinfo(float id)
-{
-       entity m;
-       if(id < TUR_FIRST || id > TUR_LAST)
-               return dummy_turret_info;
-       m = turret_info[id - 1];
-       if(m)
-               return m;
-       return dummy_turret_info;
-}
diff --git a/qcsrc/common/turrets/turrets.qh b/qcsrc/common/turrets/turrets.qh
deleted file mode 100644 (file)
index e1bf48c..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef TURRETS_H
-#define TURRETS_H
-
-// turret requests
-#define TR_SETUP          1 // (BOTH) setup turret data
-#define TR_THINK                 2 // (SERVER) logic to run every frame
-#define TR_DEATH          3 // (SERVER) called when turret dies
-#define TR_PRECACHE       4 // (BOTH) precaches models/sounds used by this turret
-#define TR_ATTACK         5 // (SERVER) called when turret attacks
-#define TR_CONFIG         6 // (ALL)
-
-// functions:
-entity get_turretinfo(int id);
-
-// fields:
-.entity tur_head;
-
-// target selection flags
-.int target_select_flags;
-.int target_validate_flags;
-const int TFL_TARGETSELECT_NO = 2; // don't automatically find targets
-const int TFL_TARGETSELECT_LOS = 4; // require line of sight to find targets
-const int TFL_TARGETSELECT_PLAYERS = 8; // target players
-const int TFL_TARGETSELECT_MISSILES = 16; // target projectiles
-const int TFL_TARGETSELECT_TRIGGERTARGET = 32; // respond to turret_trigger_target events
-const int TFL_TARGETSELECT_ANGLELIMITS = 64; // apply extra angular limits to target selection
-const int TFL_TARGETSELECT_RANGELIMITS = 128; // limit target selection range
-const int TFL_TARGETSELECT_TEAMCHECK = 256; // don't attack teammates
-const int TFL_TARGETSELECT_NOBUILTIN = 512; // only attack targets when triggered
-const int TFL_TARGETSELECT_OWNTEAM = 1024; // only attack teammates
-const int TFL_TARGETSELECT_NOTURRETS = 2048; // don't attack other turrets
-const int TFL_TARGETSELECT_FOV = 4096; // extra limits to attack range
-const int TFL_TARGETSELECT_MISSILESONLY = 8192; // only attack missiles
-
-// aim flags
-.int aim_flags;
-const int TFL_AIM_NO = 1; // no aiming
-const int TFL_AIM_SPLASH = 2; // aim for ground around the target's feet
-const int TFL_AIM_LEAD = 4; // try to predict target movement
-const int TFL_AIM_SHOTTIMECOMPENSATE = 8; // compensate for shot traveltime when leading
-const int TFL_AIM_ZPREDICT = 16; // predict target's z position at impact
-const int TFL_AIM_SIMPLE = 32; // aim at player's current location
-
-// tracking flags
-.int track_flags;
-const int TFL_TRACK_NO = 2; // don't move head
-const int TFL_TRACK_PITCH = 4; // pitch head
-const int TFL_TRACK_ROTATE = 8; // rotate head
-
-// prefire checks
-.int firecheck_flags;
-const int TFL_FIRECHECK_DEAD = 4; // don't attack dead targets (zombies?)
-const int TFL_FIRECHECK_DISTANCES = 8; // another range check
-const int TFL_FIRECHECK_LOS = 16; // line of sight
-const int TFL_FIRECHECK_AIMDIST = 32; // consider distance impactpoint<->aimspot
-const int TFL_FIRECHECK_REALDIST = 64; // consider enemy origin<->impactpoint
-const int TFL_FIRECHECK_ANGLEDIST = 128; // consider angular diff head<->aimspot
-const int TFL_FIRECHECK_TEAMCHECK = 256; // don't attack teammates
-const int TFL_FIRECHECK_AFF = 512; // try to avoid any friendly fire
-const int TFL_FIRECHECK_AMMO_OWN = 1024; // own ammo needs to be larger than damage dealt
-const int TFL_FIRECHECK_AMMO_OTHER = 2048; // target's ammo needs to be less than max
-const int TFL_FIRECHECK_REFIRE = 4096; // check single attack finished delays
-const int TFL_FIRECHECK_NO = 16384; // no prefire checks
-
-// attack flags
-.int shoot_flags;
-const int TFL_SHOOT_NO = 64; // no attacking
-const int TFL_SHOOT_VOLLY = 2; // fire in vollies
-const int TFL_SHOOT_VOLLYALWAYS = 4; // always do a full volly, even if target is lost
-const int TFL_SHOOT_HITALLVALID = 8; // loop through all valid targets
-const int TFL_SHOOT_CLEARTARGET = 16; // lose target after attack (after volly is done if in volly mode)
-const int TFL_SHOOT_CUSTOM = 32; // custom attacking
-
-// turret capabilities
-.int turret_flags;
-const int TUR_FLAG_NONE = 0; // no abilities
-const int TUR_FLAG_SNIPER = 2; // sniping turret
-const int TUR_FLAG_SPLASH = 4; // can deal splash damage
-const int TUR_FLAG_HITSCAN = 8; // hit scan
-const int TUR_FLAG_MULTIGUN = 16; // multiple guns
-const int TUR_FLAG_GUIDED = 32; // laser guided projectiles
-const int TUR_FLAG_SLOWPROJ = 64; // turret fires slow projectiles
-const int TUR_FLAG_MEDPROJ = 128; // turret fires medium projectiles
-const int TUR_FLAG_FASTPROJ = 256; // turret fires fast projectiles
-const int TUR_FLAG_PLAYER = 512; // can damage players
-const int TUR_FLAG_MISSILE = 1024; // can damage missiles
-const int TUR_FLAG_SUPPORT = 2048; // supports other units
-const int TUR_FLAG_AMMOSOURCE = 4096; // can provide ammunition
-const int TUR_FLAG_RECIEVETARGETS = 8192; // can recieve targets from external sources
-const int TUR_FLAG_MOVE = 16384; // can move
-const int TUR_FLAG_ROAM = 32768; // roams around if not attacking
-const int TUR_FLAG_ISTURRET = 65536; // identifies this unit as a turret
-
-// ammo types
-#define ammo_flags currentammo
-const int TFL_AMMO_NONE = 64; // doesn't use ammo
-const int TFL_AMMO_ENERGY = 2; // uses power
-const int TFL_AMMO_BULLETS = 4; // uses bullets
-const int TFL_AMMO_ROCKETS = 8; // uses explosives
-const int TFL_AMMO_RECHARGE = 16; // regenerates ammo
-const int TFL_AMMO_RECIEVE = 32; // can recieve ammo from support units
-
-// damage flags
-.int damage_flags;
-const int TFL_DMG_NO = 256; // doesn't take damage
-const int TFL_DMG_YES = 2; // can be damaged
-const int TFL_DMG_TEAM = 4; // can be damaged by teammates
-const int TFL_DMG_RETALIATE = 8; // target attackers
-const int TFL_DMG_RETALIATE_TEAM = 16; // target attackers, even if on same team
-const int TFL_DMG_TARGETLOSS = 32; // loses target when damaged
-const int TFL_DMG_AIMSHAKE = 64; // damage throws off aim
-const int TFL_DMG_HEADSHAKE = 128; // damage shakes head
-const int TFL_DMG_DEATH_NORESPAWN = 256; // no re-spawning
-
-// spawn flags
-const int TSF_SUSPENDED = 1;
-const int TSF_TERRAINBASE = 2; // currently unused
-const int TSF_NO_AMMO_REGEN = 4; // disable builtin ammo regeneration
-const int TSF_NO_PATHBREAK = 8; // don't break path to chase enemies, will still fire at them if possible
-const int TSL_NO_RESPAWN = 16; // don't re-spawn
-const int TSL_ROAM = 32; // roam while idle
-
-// send flags
-const int TNSF_UPDATE       = 2;
-const int TNSF_STATUS       = 4;
-const int TNSF_SETUP        = 8;
-const int TNSF_ANG          = 16;
-const int TNSF_AVEL         = 32;
-const int TNSF_MOVE         = 64;
-.float anim_start_time;
-const int TNSF_ANIM         = 128;
-
-const int TNSF_FULL_UPDATE  = 16777215;
-
-
-// entity properties of turretinfo:
-.int turretid; // TUR_...
-.string netname; // short name
-.string turret_name; // human readable name
-.float(float) turret_func; // m_...
-.string mdl; // currently a copy of the model
-.string model; // full name of model
-.string head_model; // full name of tur_head model
-.string cvar_basename; // TODO: deprecate!
-.float spawnflags;
-.vector mins, maxs; // turret hitbox size
-
-// other useful macros
-#define TUR_ACTION(turrettype,mrequest) (get_turretinfo(turrettype)).turret_func(mrequest)
-#define TUR_NAME(turrettype) (get_turretinfo(turrettype)).turret_name
-
-// =====================
-//  Turret Registration
-// =====================
-
-float t_null(float dummy);
-void register_turret(float id, float(float) func, float turretflags, vector min_s, vector max_s, string modelname, string headmodelname, string shortname, string mname);
-void register_turrets_done();
-
-const float TUR_MAXCOUNT = 24;
-const int TUR_FIRST = 1;
-float TUR_COUNT;
-float TUR_LAST;
-
-#define REGISTER_TURRET_2(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname) \
-       float id; \
-       float func(float); \
-       void RegisterTurrets_##id() \
-       { \
-               TUR_LAST = (id = TUR_FIRST + TUR_COUNT); \
-               ++TUR_COUNT; \
-               register_turret(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname); \
-       } \
-       ACCUMULATE_FUNCTION(RegisterTurrets, RegisterTurrets_##id)
-#ifdef MENUQC
-#define REGISTER_TURRET(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname) \
-       REGISTER_TURRET_2(TUR_##id,t_null,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname)
-#else
-#define REGISTER_TURRET(id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname) \
-       REGISTER_TURRET_2(TUR_##id,func,turretflags,min_s,max_s,modelname,headmodelname,shortname,mname)
-#endif
-
-#include "all.qh"
-
-#undef REGISTER_TURRET
-ACCUMULATE_FUNCTION(RegisterTurrets, register_turrets_done)
-
-#endif
index e61897cdd8d876d0841076d7443fa782e5518b7e..117e3478324c79a96864a30688a6ddeec925d192 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ EWHEEL,
 /* function   */ t_ewheel,
@@ -121,7 +121,7 @@ void ewheel_move_idle()
         movelib_beak_simple((autocvar_g_turrets_unit_ewheel_speed_stop));
 }
 
-void spawnfunc_turret_ewheel() { SELFPARAM(); if(!turret_initialize(TUR_EWHEEL)) remove(self); }
+spawnfunc(turret_ewheel) { if(!turret_initialize(TUR_EWHEEL.m_id)) remove(self); }
 
 float t_ewheel(float req)
 {SELFPARAM();
@@ -136,7 +136,7 @@ float t_ewheel(float req)
             {
                 turret_do_updates(self);
 
-                _mis = turret_projectile(W_Sound("lasergun_fire"), 1, 0, DEATH_TURRET_EWHEEL, PROJECTILE_BLASTER, TRUE, TRUE);
+                _mis = turret_projectile(SND(LASERGUN_FIRE), 1, 0, DEATH_TURRET_EWHEEL, PROJECTILE_BLASTER, TRUE, TRUE);
                 _mis.missile_flags = MIF_SPLASH;
 
                 Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
index 228049f4114bd6551aec8fdf1fb4073926a0c126..3b9330f7e445f2df9791059cd5fc1df06f5c6af5 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ FLAC,
 /* function   */ t_flac,
@@ -28,7 +28,7 @@ void turret_flac_projectile_think_explode()
     remove(self);
 }
 
-void spawnfunc_turret_flac() { SELFPARAM(); if(!turret_initialize(TUR_FLAC)) remove(self); }
+spawnfunc(turret_flac) { if(!turret_initialize(TUR_FLAC.m_id)) remove(self); }
 
 float t_flac(float req)
 {SELFPARAM();
@@ -40,7 +40,7 @@ float t_flac(float req)
 
             turret_tag_fire_update();
 
-            proj = turret_projectile(W_Sound("hagar_fire"), 5, 0, DEATH_TURRET_FLAC, PROJECTILE_HAGAR, TRUE, TRUE);
+            proj = turret_projectile(SND(HAGAR_FIRE), 5, 0, DEATH_TURRET_FLAC, PROJECTILE_HAGAR, TRUE, TRUE);
             Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
             proj.think   = turret_flac_projectile_think_explode;
             proj.nextthink  = time + self.tur_impacttime + (random() * 0.01 - random() * 0.01);
index 3ba1ff07476a9e03e568f395eeb7561b5bfbdc88..3b6389a96428a66be641f4012987dd652db9ef1f 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ FUSIONREACTOR,
 /* function   */ t_fusionreactor,
@@ -40,7 +40,7 @@ bool turret_fusionreactor_firecheck()
     return true;
 }
 
-void spawnfunc_turret_fusionreactor() { SELFPARAM(); if(!turret_initialize(TUR_FUSIONREACTOR)) remove(self); }
+spawnfunc(turret_fusionreactor) { if(!turret_initialize(TUR_FUSIONREACTOR.m_id)) remove(self); }
 
 float t_fusionreactor(float req)
 {SELFPARAM();
index f785f4e953e8c9121844dba663a5b88f68a40e76..a253d20ed102ee1aaba5fa06c21333d98373e5f5 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ HELLION,
 /* function   */ t_hellion,
@@ -76,7 +76,7 @@ void turret_hellion_missile_think()
     UpdateCSQCProjectile(self);
 }
 
-void spawnfunc_turret_hellion() { SELFPARAM(); if(!turret_initialize(TUR_HELLION)) remove(self); }
+spawnfunc(turret_hellion) { if(!turret_initialize(TUR_HELLION.m_id)) remove(self); }
 
 float t_hellion(float req)
 {SELFPARAM();
@@ -91,7 +91,7 @@ float t_hellion(float req)
             else
                 self.tur_shotorg = gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_fire2"));
 
-            missile = turret_projectile(W_Sound("rocket_fire"), 6, 10, DEATH_TURRET_HELLION, PROJECTILE_ROCKET, FALSE, FALSE);
+            missile = turret_projectile(SND(ROCKET_FIRE), 6, 10, DEATH_TURRET_HELLION, PROJECTILE_ROCKET, FALSE, FALSE);
             te_explosion (missile.origin);
             missile.think              = turret_hellion_missile_think;
             missile.nextthink  = time;
index f01275187db0ab496065187ff155d4713b38fd32..25235734badd158eeb3ff3f46a5e43d9b93cff94 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ HK,
 /* function   */ t_hk,
@@ -273,7 +273,7 @@ float turret_hk_addtarget(entity e_target,entity e_sender)
     return 0;
 }
 
-void spawnfunc_turret_hk() { SELFPARAM(); if(!turret_initialize(TUR_HK)) remove(self); }
+spawnfunc(turret_hk) { if(!turret_initialize(TUR_HK.m_id)) remove(self); }
 
 float t_hk(float req)
 {SELFPARAM();
@@ -283,7 +283,7 @@ float t_hk(float req)
         {
             entity missile;
 
-            missile = turret_projectile(W_Sound("rocket_fire"), 6, 10, DEATH_TURRET_HK, PROJECTILE_ROCKET, FALSE, FALSE);
+            missile = turret_projectile(SND(ROCKET_FIRE), 6, 10, DEATH_TURRET_HK, PROJECTILE_ROCKET, FALSE, FALSE);
             te_explosion (missile.origin);
 
             missile.think                      = turret_hk_missile_think;
index afecb7fa56a377d33f49c9df7ea03e8a799f702c..eeb889022b1610fb32c18d85bdea1a2a27dff18f 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ MACHINEGUN,
 /* function   */ t_machinegun,
@@ -11,7 +11,7 @@ REGISTER_TURRET(
 );
 #else
 #ifdef SVQC
-void spawnfunc_turret_machinegun() { SELFPARAM(); if(!turret_initialize(TUR_MACHINEGUN)) remove(self); }
+spawnfunc(turret_machinegun) { if(!turret_initialize(TUR_MACHINEGUN.m_id)) remove(self); }
 
 void W_MachineGun_MuzzleFlash(void);
 
@@ -48,7 +48,6 @@ float t_machinegun(float req)
         }
         case TR_PRECACHE:
         {
-            precache_sound (W_Sound("uzi_fire"));
             return true;
         }
     }
index 1a3c9220b84ca48b6fb75d0c9c986901a73955d4..7e130c6e18907d57182f8427525f332eb9b54c82 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ MLRS,
 /* function   */ t_mlrs,
@@ -11,7 +11,7 @@ REGISTER_TURRET(
 );
 #else
 #ifdef SVQC
-void spawnfunc_turret_mlrs() { SELFPARAM(); if(!turret_initialize(TUR_MLRS)) remove(self); }
+spawnfunc(turret_mlrs) { if(!turret_initialize(TUR_MLRS.m_id)) remove(self); }
 
 float t_mlrs(float req)
 {SELFPARAM();
@@ -22,7 +22,7 @@ float t_mlrs(float req)
             entity missile;
 
             turret_tag_fire_update();
-            missile = turret_projectile(W_Sound("rocket_fire"), 6, 10, DEATH_TURRET_MLRS, PROJECTILE_ROCKET, TRUE, TRUE);
+            missile = turret_projectile(SND(ROCKET_FIRE), 6, 10, DEATH_TURRET_MLRS, PROJECTILE_ROCKET, TRUE, TRUE);
             missile.nextthink = time + max(self.tur_impacttime,(self.shot_radius * 2) / self.shot_speed);
             missile.missile_flags = MIF_SPLASH;
             te_explosion (missile.origin);
index e1ddef3a9d359292e2e0ff09508e3b1e04681070..6eec37ab4d6532abaaa5e20d9b49480e18e11f25 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ PHASER,
 /* function   */ t_phaser,
@@ -26,7 +26,7 @@ void beam_think()
         self.owner.attack_finished_single = time + self.owner.shot_refire;
         self.owner.fireflag = 2;
         self.owner.tur_head.frame = 10;
-        sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
+        sound (self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
         remove(self);
         return;
     }
@@ -36,7 +36,7 @@ void beam_think()
     if (time - self.shot_spread > 0)
     {
         self.shot_spread = time + 2;
-        sound (self, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTEN_NORM);
+        sound (self, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
     }
 
 
@@ -57,7 +57,7 @@ void beam_think()
 
 }
 
-void spawnfunc_turret_phaser() { SELFPARAM(); if(!turret_initialize(TUR_PHASER)) remove(self); }
+spawnfunc(turret_phaser) { if(!turret_initialize(TUR_PHASER.m_id)) remove(self); }
 
 float t_phaser(float req)
 {SELFPARAM();
@@ -83,7 +83,7 @@ float t_phaser(float req)
             beam.enemy = self.enemy;
             beam.bot_dodge = true;
             beam.bot_dodgerating = beam.shot_dmg;
-            sound (beam, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTEN_NORM);
+            sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
             self.fireflag = 1;
 
             beam.attack_finished_single = self.attack_finished_single;
@@ -91,7 +91,7 @@ float t_phaser(float req)
 
             setattachment(beam,self.tur_head,"tag_fire");
 
-            soundat (self, trace_endpos, CH_SHOTS, W_Sound("neximpact"), VOL_BASE, ATTEN_NORM);
+            soundat (self, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
 
             if (self.tur_head.frame == 0)
                 self.tur_head.frame = 1;
@@ -137,7 +137,6 @@ float t_phaser(float req)
         }
         case TR_PRECACHE:
         {
-            precache_sound ("turrets/phaser.wav");
             return true;
         }
     }
index df986d79e04b8bd1ffab31babf101ad596f2abdb..59c0f850a76f5663cc81de0ffa53416d8da0400f 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ PLASMA,
 /* function   */ t_plasma,
@@ -11,7 +11,7 @@ REGISTER_TURRET(
 );
 #else
 #ifdef SVQC
-void spawnfunc_turret_plasma() { SELFPARAM(); if(!turret_initialize(TUR_PLASMA)) remove(self); }
+spawnfunc(turret_plasma) { if(!turret_initialize(TUR_PLASMA.m_id)) remove(self); }
 
 float t_plasma(float req)
 {SELFPARAM();
@@ -30,19 +30,14 @@ float t_plasma(float req)
                 Send_Effect(EFFECT_VORTEX_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 
                 // teamcolor / hit beam effect
-                vector v;
-                string s;
-                v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-                s = strcat("TE_TEI_G3", ((self.team) ? Static_Team_ColorName_Upper(self.team) : ""));
-
-                WarpZone_TrailParticles(world, _particleeffectnum(s), self.tur_shotorg, v);
-
+                vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+                WarpZone_TrailParticles(world, particleeffectnum(EFFECT_VAPORIZER(self.team)), self.tur_shotorg, v);
                 if (self.tur_head.frame == 0)
                     self.tur_head.frame = 1;
             }
             else
             {
-                entity missile = turret_projectile(W_Sound("hagar_fire"), 1, 0, DEATH_TURRET_PLASMA, PROJECTILE_ELECTRO_BEAM, TRUE, TRUE);
+                entity missile = turret_projectile(SND(HAGAR_FIRE), 1, 0, DEATH_TURRET_PLASMA, PROJECTILE_ELECTRO_BEAM, TRUE, TRUE);
                 missile.missile_flags = MIF_SPLASH;
 
                 Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
index f3bd32448f40538a94fc72243b95c118453e4aeb..edcf7ed21fd4c75ff6bda5c676617b4e56d04fd7 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ PLASMA_DUAL,
 /* function   */ t_plasma_dual,
@@ -11,7 +11,7 @@ REGISTER_TURRET(
 );
 #else
 #ifdef SVQC
-void spawnfunc_turret_plasma_dual() { SELFPARAM(); if(!turret_initialize(TUR_PLASMA_DUAL)) remove(self); }
+spawnfunc(turret_plasma_dual) { if(!turret_initialize(TUR_PLASMA_DUAL.m_id)) remove(self); }
 
 float t_plasma_dual(float req)
 {SELFPARAM();
@@ -31,18 +31,13 @@ float t_plasma_dual(float req)
                 Send_Effect(EFFECT_VORTEX_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 
                 // teamcolor / hit beam effect
-                vector v;
-                string s;
-                v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-                s = strcat(EFFECT_VAPORIZER_NEUTRAL.eent_eff_name, ((self.team) ? Static_Team_ColorName_Upper(self.team) : ""));
-
-                WarpZone_TrailParticles(world, _particleeffectnum(s), self.tur_shotorg, v);
-
+                vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+                WarpZone_TrailParticles(world, particleeffectnum(EFFECT_VAPORIZER(self.team)), self.tur_shotorg, v);
                 self.tur_head.frame += 1;
             }
             else
             {
-                entity missile = turret_projectile(W_Sound("hagar_fire"), 1, 0, DEATH_TURRET_PLASMA, PROJECTILE_ELECTRO_BEAM, TRUE, TRUE);
+                entity missile = turret_projectile(SND(HAGAR_FIRE), 1, 0, DEATH_TURRET_PLASMA, PROJECTILE_ELECTRO_BEAM, TRUE, TRUE);
                 missile.missile_flags = MIF_SPLASH;
                 Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
                 self.tur_head.frame += 1;
index 50e37182c3a6ce0a143b6fc8975bd2f89a9fce84..ebcc4e997767cd3870cb2f6e007d7d40c0db02fb 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ TESLA,
 /* function   */ t_tesla,
@@ -89,7 +89,7 @@ float turret_tesla_firecheck()
     return 0;
 }
 
-void spawnfunc_turret_tesla() { SELFPARAM(); if(!turret_initialize(TUR_TESLA)) remove(self); }
+spawnfunc(turret_tesla) { if(!turret_initialize(TUR_TESLA.m_id)) remove(self); }
 
 float t_tesla(float req)
 {SELFPARAM();
index 9e7b0cbe136255a0fd4a9a86c8a24d2db8165732..a2927cfbf29765be6ff5122c8525f39a34db0cca 100644 (file)
@@ -1,4 +1,4 @@
-#ifdef REGISTER_TURRET
+#ifndef IMPLEMENTATION
 REGISTER_TURRET(
 /* TUR_##id   */ WALKER,
 /* function   */ t_walker,
@@ -221,7 +221,7 @@ void walker_fire_rocket(vector org)
     rocket = spawn ();
     setorigin(rocket, org);
 
-    sound (self, CH_WEAPON_A, W_Sound("hagar_fire"), VOL_BASE, ATTEN_NORM);
+    sound (self, CH_WEAPON_A, SND_HAGAR_FIRE, VOL_BASE, ATTEN_NORM);
     setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
 
     rocket.classname             = "walker_rocket";
@@ -334,7 +334,7 @@ void walker_move_path()
 #endif
 }
 
-void spawnfunc_turret_walker() { SELFPARAM(); if(!turret_initialize(TUR_WALKER)) remove(self); }
+spawnfunc(turret_walker) { if(!turret_initialize(TUR_WALKER.m_id)) remove(self); }
 
 float t_walker(float req)
 {SELFPARAM();
@@ -342,7 +342,7 @@ float t_walker(float req)
     {
         case TR_ATTACK:
         {
-            sound (self, CH_WEAPON_A, W_Sound("uzi_fire"), VOL_BASE, ATTEN_NORM);
+            sound (self, CH_WEAPON_A, SND_UZI_FIRE, VOL_BASE, ATTEN_NORM);
             fireBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, 0, self.shot_dmg, self.shot_force, DEATH_TURRET_WALK_GUN, 0);
             Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 
@@ -634,7 +634,6 @@ float t_walker(float req)
         }
         case TR_PRECACHE:
         {
-            precache_sound (W_Sound("rocket_impact"));
             return true;
         }
     }
@@ -645,7 +644,7 @@ float t_walker(float req)
 #endif // SVQC
 #ifdef CSQC
 
-#include "../../../server/movelib.qh"
+#include "../../../client/movelib.qh"
 
 void walker_draw()
 {SELFPARAM();
index a054edde8a56748c5d10fcd4e8d5640ce4882a5a..a506a59fcd2808ac26419691fe3c1b5ca7f90b17 100644 (file)
@@ -271,15 +271,6 @@ string fstrunzone(string s)
        return sc;
 }
 
-bool fexists(string f)
-{
-    int fh = fopen(f, FILE_READ);
-    if (fh < 0)
-        return false;
-    fclose(fh);
-    return true;
-}
-
 // Databases (hash tables)
 const float DB_BUCKETS = 8192;
 void db_save(float db, string pFilename)
index e3fab47b7da6d9961c982b9eda081f71a6bbde7f..d43136c6734d23842a08ab570d926edfa67b1d76 100644 (file)
@@ -230,10 +230,6 @@ const float XENCODE_LEN = 5;
 string xencode(float f);
 float xdecode(string s);
 
-// Play all sounds via sound7, for access to the extra channels.
-// Otherwise, channels 8 to 15 would be blocked for a weird QW feature.
-#define sound(e,c,s,v,a) sound7(e,c,s,v,a,0,0)
-
 int lowestbit(float f);
 
 #ifdef CSQC
index 3f3b77ea3308c80749042021a1ba5a5389e6e8fa..6e26f171264eb1c1f1fda5ae170604e1b86ad98e 100644 (file)
 #ifndef MENUQC
 STATIC_INIT(vehicles_common_initialize)
 {
-#ifdef CSQC
-       precache_sound ("vehicles/alarm.wav");
-       precache_sound ("vehicles/alarm_shield.wav");
-#endif // CSQC
 #ifdef SVQC
-       precache_sound("onslaught/ons_hit2.wav");
-       precache_sound("onslaught/electricity_explode.wav");
-
        addstat(STAT_HUD, AS_INT, hud);
        addstat(STAT_VEHICLESTAT_HEALTH,  AS_INT, vehicle_health);
        addstat(STAT_VEHICLESTAT_SHIELD,  AS_INT, vehicle_shield);
index b6c8844abd8028920814b047c0b3b62202fa7326..a91e3e212abcac3e162aeb2d901200297003e7f3 100644 (file)
@@ -23,7 +23,7 @@ void vehicle_alarm(entity e, int ch, string s0und)
        if(!autocvar_cl_vehicles_alarm)
                return;
 
-       sound(e, ch, s0und, VOL_BASEVOICE, ATTEN_NONE);
+       _sound(e, ch, s0und, VOL_BASEVOICE, ATTEN_NONE);
 }
 
 void AuxiliaryXhair_Draw2D()
@@ -79,8 +79,8 @@ void Net_VehicleSetup()
        // hud_id == 0 means we exited a vehicle, so stop alarm sound/s
        if(hud_id == 0)
        {
-               sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
-               sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
+               sound(self, CH_TRIGGER_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
+               sound(self, CH_PAIN_SINGLE, SND_Null, VOL_BASEVOICE, ATTEN_NONE);
                return;
        }
 
@@ -235,7 +235,7 @@ void Vehicles_drawHUD(
                if(alarm1time < time)
                {
                        alarm1time = time + 2;
-                       vehicle_alarm(self, CH_PAIN_SINGLE, "vehicles/alarm.wav");
+                       vehicle_alarm(self, CH_PAIN_SINGLE, SND(VEH_ALARM));
                }
                drawpic_skin(tmpPos, "vehicle_icon_health", tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
        }
@@ -243,7 +243,7 @@ void Vehicles_drawHUD(
        {
                if(alarm1time)
                {
-                       vehicle_alarm(self, CH_PAIN_SINGLE, "misc/null.wav");
+                       vehicle_alarm(self, CH_PAIN_SINGLE, SND(Null));
                        alarm1time = 0;
                }
                drawpic_skin(tmpPos, "vehicle_icon_health", tmpSize, '1 1 1', hudAlpha, DRAWFLAG_NORMAL);
@@ -257,7 +257,7 @@ void Vehicles_drawHUD(
                if(alarm2time < time)
                {
                        alarm2time = time + 1;
-                       vehicle_alarm(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav");
+                       vehicle_alarm(self, CH_TRIGGER_SINGLE, SND(VEH_ALARM_SHIELD));
                }
                drawpic_skin(tmpPos, "vehicle_icon_shield", tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
        }
@@ -265,7 +265,7 @@ void Vehicles_drawHUD(
        {
                if(alarm2time)
                {
-                       vehicle_alarm(self, CH_TRIGGER_SINGLE, "misc/null.wav");
+                       vehicle_alarm(self, CH_TRIGGER_SINGLE, SND(Null));
                        alarm2time = 0;
                }
                drawpic_skin(tmpPos, "vehicle_icon_shield", tmpSize, '1 1 1', hudAlpha, DRAWFLAG_NORMAL);
index 73ff86b4bef3d04c253ec25ad3ea92b37bbe8e12..8f2f7581a215c4c8cb2264dffecfd9cfe355589f 100644 (file)
@@ -289,7 +289,7 @@ entity vehicles_projectile(string _mzlfx, string _mzlsound,
                proj.flags                 = FL_PROJECTILE | FL_NOTARGET;
 
        if(_mzlsound)
-               sound (self, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTEN_NORM);
+               _sound (self, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTEN_NORM);
 
        if(_mzlfx)
                Send_Effect_(_mzlfx, proj.origin, proj.velocity, 1);
@@ -303,7 +303,7 @@ entity vehicles_projectile(string _mzlfx, string _mzlsound,
 
 void vehicles_gib_explode()
 {SELFPARAM();
-       sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
        Send_Effect(EFFECT_EXPLOSION_SMALL, self.wp00.origin + '0 0 64', '0 0 0', 1);
        remove(self);
@@ -907,7 +907,7 @@ void vehicles_exit(bool eject)
 
        _vehicle.team = _vehicle.tur_head.team;
 
-       sound (_vehicle, CH_TRIGGER_SINGLE, "misc/null.wav", 1, ATTEN_NORM);
+       sound (_vehicle, CH_TRIGGER_SINGLE, SND_Null, 1, ATTEN_NORM);
        _vehicle.vehicle_hudmodel.viewmodelforclient = _vehicle;
        _vehicle.phase = time + 1;
 
index 96fef6c05c2cafb02f25be443b6803c84e95fbac..d36392e207734c062c41887389909d89f2efaf33 100644 (file)
@@ -104,7 +104,7 @@ float bumble_raygun_send(entity to, int sf);
 void bumblebee_fire_cannon(entity _gun, string _tagname, entity _owner)
 {
        vector v = gettaginfo(_gun, gettagindex(_gun, _tagname));
-       vehicles_projectile(EFFECT_BIGPLASMA_MUZZLEFLASH.eent_eff_name, W_Sound("flacexp3"),
+       vehicles_projectile(EFFECT_BIGPLASMA_MUZZLEFLASH.eent_eff_name, SND(VEH_BUMBLEBEE_FIRE),
                                                v, normalize(v_forward + randomvec() * autocvar_g_vehicle_bumblebee_cannon_spread) * autocvar_g_vehicle_bumblebee_cannon_speed,
                                                autocvar_g_vehicle_bumblebee_cannon_damage, autocvar_g_vehicle_bumblebee_cannon_radius, autocvar_g_vehicle_bumblebee_cannon_force,  0,
                                                DEATH_VH_BUMB_GUN, PROJECTILE_BUMBLE_GUN, 0, true, true, _owner);
@@ -716,7 +716,7 @@ void bumblebee_blowup()
                                 autocvar_g_vehicle_bumblebee_blowup_forceintensity,
                                 DEATH_VH_BUMB_DEATH, world);
 
-       sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        Send_Effect(EFFECT_EXPLOSION_BIG, (self.origin + '0 0 100') + (randomvec() * 80), '0 0 0', 1);
 
        if(self.owner.deadflag == DEAD_DYING)
@@ -732,7 +732,7 @@ void bumblebee_diethink()
 
        if(random() < 0.1)
        {
-               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
        }
 
@@ -768,8 +768,8 @@ float bumble_raygun_send(entity to, float sf)
        return true;
 }
 
-void spawnfunc_vehicle_bumblebee()
-{SELFPARAM();
+spawnfunc(vehicle_bumblebee)
+{
        if(!autocvar_g_vehicle_bumblebee) { remove(self); return; }
        if(!vehicle_initialize(VEH_BUMBLEBEE, false)) { remove(self); return; }
 }
index 62a6e850fdb2c4bcc1c2b7f5bb029b39d6451889..4d62249f47abcde8e9f63e5581a4cd4ffb47c8c3 100644 (file)
@@ -174,7 +174,7 @@ void racer_fire_cannon(string tagname)
        entity bolt;
 
        v = gettaginfo(self, gettagindex(self, tagname));
-       bolt = vehicles_projectile(EFFECT_RACER_MUZZLEFLASH.eent_eff_name, W_Sound("lasergun_fire"),
+       bolt = vehicles_projectile(EFFECT_RACER_MUZZLEFLASH.eent_eff_name, SND(LASERGUN_FIRE),
                                                   v, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
                                                   autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force,  0,
                                                   DEATH_VH_WAKI_GUN, PROJECTILE_WAKICANNON, 0, true, true, self.owner);
@@ -292,7 +292,7 @@ void racer_rocket_tracker()
 void racer_fire_rocket(string tagname, entity trg)
 {SELFPARAM();
        vector v = gettaginfo(self, gettagindex(self, tagname));
-       entity rocket = vehicles_projectile(EFFECT_RACER_ROCKETLAUNCH.eent_eff_name, W_Sound("rocket_fire"),
+       entity rocket = vehicles_projectile(EFFECT_RACER_ROCKETLAUNCH.eent_eff_name, SND(ROCKET_FIRE),
                                                   v, v_forward * autocvar_g_vehicle_racer_rocket_speed,
                                                   autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
                                                   DEATH_VH_WAKI_ROCKET, PROJECTILE_WAKIROCKET, 20, false, false, self.owner);
@@ -385,7 +385,7 @@ float racer_frame()
                {
                        self.sounds = 1;
                        self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
-                       sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                       sound (self, CH_TRIGGER_SINGLE, SND_VEH_RACER_MOVE, VOL_VEHICLEENGINE, ATTEN_NORM);
                }
 #endif
        }
@@ -396,7 +396,7 @@ float racer_frame()
                {
                        self.sounds = 0;
                        self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
-                       sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                       sound (self, CH_TRIGGER_SINGLE, SND_VEH_RACER_IDLE, VOL_VEHICLEENGINE, ATTEN_NORM);
                }
        }
 #endif
@@ -435,14 +435,14 @@ float racer_frame()
                if(racer.strength_finished < time)
                {
                        racer.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
-                       sound (racer.tur_head, CH_TRIGGER_SINGLE, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                       sound (racer.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RACER_BOOST, VOL_VEHICLEENGINE, ATTEN_NORM);
                }
 #endif
        }
        else
        {
                racer.strength_finished = 0;
-               sound (racer.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+               sound (racer.tur_head, CH_TRIGGER_SINGLE, SND_Null, VOL_VEHICLEENGINE, ATTEN_NORM);
        }
 
        if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
@@ -589,7 +589,7 @@ void racer_exit(float eject)
        self.think        = racer_think;
        self.nextthink  = time;
        self.movetype   = MOVETYPE_BOUNCE;
-       sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+       sound (self.tur_head, CH_TRIGGER_SINGLE, SND_Null, VOL_VEHICLEENGINE, ATTEN_NORM);
 
        if(!self.owner)
                return;
@@ -667,8 +667,8 @@ void racer_deadtouch()
                racer_blowup();
 }
 
-void spawnfunc_vehicle_racer()
-{SELFPARAM();
+spawnfunc(vehicle_racer)
+{
        if(!autocvar_g_vehicle_racer) { remove(self); return; }
        if(!vehicle_initialize(VEH_RACER, false)) { remove(self); return; }
 }
@@ -856,14 +856,6 @@ bool v_racer(int req)
 
                case VR_PRECACHE:
                {
-               #ifdef SVQC
-                       precache_sound (W_Sound("lasergun_fire"));
-                       precache_sound (W_Sound("rocket_fire"));
-
-                       precache_sound ("vehicles/racer_idle.wav");
-                       precache_sound ("vehicles/racer_move.wav");
-                       precache_sound ("vehicles/racer_boost.wav");
-               #endif
                        return true;
                }
        }
index 96a84892cfb43cb02aabf6778df63f718729e5f4..a1c058fb00ef3015c1402959da2afc723a636427 100644 (file)
@@ -195,7 +195,7 @@ void raptor_bombdrop()
 
 void raptor_fire_cannon(entity gun, string tagname)
 {SELFPARAM();
-       vehicles_projectile(EFFECT_RAPTOR_MUZZLEFLASH.eent_eff_name, W_Sound("lasergun_fire"),
+       vehicles_projectile(EFFECT_RAPTOR_MUZZLEFLASH.eent_eff_name, SND(LASERGUN_FIRE),
                                                   gettaginfo(gun, gettagindex(gun, tagname)), normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
                                                   autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force,  0,
                                                   DEATH_VH_RAPT_CANNON, PROJECTILE_RAPTORCANNON, 0, true, true, self.owner);
@@ -334,15 +334,15 @@ float raptor_frame()
        if(self.sound_nexttime < time)
        {
                self.sound_nexttime = time + 7.955812;
-               //sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/raptor_fly.wav", 1 - ftmp,   ATTEN_NORM );
-               sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", 1, ATTEN_NORM);
+               //sound (self.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_FLY, 1 - ftmp,   ATTEN_NORM );
+               sound (self, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_SPEED, 1, ATTEN_NORM);
                self.wait = ftmp;
        }
        /*
        else if(fabs(ftmp - self.wait) > 0.2)
        {
-               sound (self.tur_head, CH_TRIGGER_SINGLE, "", 1 - ftmp,   ATTEN_NORM );
-               sound (self, CH_TRIGGER_SINGLE, "", ftmp, ATTEN_NORM);
+               sound (self.tur_head, CH_TRIGGER_SINGLE, SND_Null, 1 - ftmp,   ATTEN_NORM );
+               sound (self, CH_TRIGGER_SINGLE, SND_Null, ftmp, ATTEN_NORM);
                self.wait = ftmp;
        }
        */
@@ -629,7 +629,7 @@ float raptor_frame()
                }
 
                if(_incomming)
-                       sound(self, CH_PAIN_SINGLE, "vehicles/missile_alarm.wav", VOL_BASE, ATTEN_NONE);
+                       sound(self, CH_PAIN_SINGLE, SND_VEH_MISSILE_ALARM, VOL_BASE, ATTEN_NONE);
 
                self.bomb1.cnt = time + 1;
        }
@@ -661,7 +661,7 @@ float raptor_takeoff()
        if(self.sound_nexttime < time)
        {
                self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav");
-               sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_SPEED, VOL_VEHICLEENGINE, ATTEN_NORM);
        }
 
        // Takeoff sequense
@@ -727,7 +727,7 @@ void raptor_diethink()
 
        if(random() < 0.05)
        {
-               sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+               sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
        }
        self.nextthink = time;
@@ -789,8 +789,8 @@ float raptor_impulse(float _imp)
        return false;
 }
 
-void spawnfunc_vehicle_raptor()
-{SELFPARAM();
+spawnfunc(vehicle_raptor)
+{
        if(!autocvar_g_vehicle_raptor) { remove(self); return; }
        if(!vehicle_initialize(VEH_RAPTOR, false)) { remove(self); return; }
 }
@@ -969,10 +969,6 @@ float v_raptor(float req)
                }
                case VR_PRECACHE:
                {
-                       precache_sound ("vehicles/raptor_fly.wav");
-                       precache_sound ("vehicles/raptor_speed.wav");
-                       precache_sound ("vehicles/missile_alarm.wav");
-
                        return true;
                }
        }
index 7d03c7736f9547e99f18710a55b52ecd19581901..6e1fffe7a70c3cecd6f49175f8bac3e9d16744fe 100644 (file)
@@ -269,7 +269,7 @@ void spiderbot_rocket_do()
        switch(self.vehicle_weapon2mode)
        {
                case SBRM_VOLLY:
-                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, W_Sound("rocket_fire"),
+                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, SND(ROCKET_FIRE),
                                                                   v, normalize(randomvec() * autocvar_g_vehicle_spiderbot_rocket_spread + v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                                                   autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
                                                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, false, true, self.owner);
@@ -283,7 +283,7 @@ void spiderbot_rocket_do()
                                self.wait = -10;
                        break;
                case SBRM_GUIDE:
-                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, W_Sound("rocket_fire"),
+                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, SND(ROCKET_FIRE),
                                                                   v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                                                   autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
                                                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, false, false, self.owner);
@@ -295,7 +295,7 @@ void spiderbot_rocket_do()
 
                break;
                case SBRM_ARTILLERY:
-                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, W_Sound("rocket_fire"),
+                       rocket = vehicles_projectile(EFFECT_SPIDERBOT_ROCKETLAUNCH.eent_eff_name, SND(ROCKET_FIRE),
                                                                   v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                                                   autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
                                                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, false, true, self.owner);
@@ -407,7 +407,7 @@ float spiderbot_frame()
                if(spider.flags & FL_ONGROUND)
                if(spider.frame == 4 && self.tur_head.wait != 0)
                {
-                       sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_land.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                       sound (self, CH_TRIGGER_SINGLE, SND_VEH_SPIDERBOT_LAND, VOL_VEHICLEENGINE, ATTEN_NORM);
                        spider.frame = 5;
                }
 
@@ -416,7 +416,7 @@ float spiderbot_frame()
 
                if((spider.flags & FL_ONGROUND) && player.BUTTON_JUMP && !spider.BUTTON_JUMP && self.tur_head.wait < time)
                {
-                       sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_jump.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                       sound (self, CH_TRIGGER_SINGLE, SND_VEH_SPIDERBOT_JUMP, VOL_VEHICLEENGINE, ATTEN_NORM);
                        //dprint("spiderbot_jump:", ftos(soundlength("vehicles/spiderbot_jump.wav")), "\n");
                        self.delay = 0;
 
@@ -452,7 +452,7 @@ float spiderbot_frame()
                                                self.delay = 3;
                                                self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_idle.wav");
                                                //dprint("spiderbot_idle:", ftos(soundlength("vehicles/spiderbot_idle.wav")), "\n");
-                                               sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_idle.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                                               sound (self, CH_TRIGGER_SINGLE, SND_VEH_SPIDERBOT_IDLE, VOL_VEHICLEENGINE, ATTEN_NORM);
                                        }
                                        movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
                                        spider.frame = 5;
@@ -496,7 +496,7 @@ float spiderbot_frame()
                                        {
                                                self.delay = 1;
                                                self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_walk.wav");
-                                               sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_walk.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                                               sound (self, CH_TRIGGER_SINGLE, SND_VEH_SPIDERBOT_WALK, VOL_VEHICLEENGINE, ATTEN_NORM);
                                                //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n");
                                        }
                                }
@@ -526,7 +526,7 @@ float spiderbot_frame()
                                        {
                                                self.delay = 2;
                                                self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_strafe.wav");
-                                               sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_strafe.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
+                                               sound (self, CH_TRIGGER_SINGLE, SND_VEH_SPIDERBOT_STRAFE, VOL_VEHICLEENGINE, ATTEN_NORM);
                                                //dprint("spiderbot_strafe:", ftos(soundlength("vehicles/spiderbot_strafe.wav")), "\n");
                                        }
                                }
@@ -558,7 +558,7 @@ float spiderbot_frame()
                        fireBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_solidpenetration,
                                 autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0);
 
-                       sound (gun, CH_WEAPON_A, W_Sound("uzi_fire"), VOL_BASE, ATTEN_NORM);
+                       sound (gun, CH_WEAPON_A, SND_UZI_FIRE, VOL_BASE, ATTEN_NORM);
                        //trailparticles(self, _particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
                        pointparticles(particleeffectnum(EFFECT_SPIDERBOT_MINIGUN_MUZZLEFLASH), v, v_forward * 2500, 1);
 
@@ -678,7 +678,7 @@ void spiderbot_headfade()
        {
                if(self.alpha > 0.1)
                {
-                       sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                        Send_Effect(EFFECT_EXPLOSION_BIG, self.origin + '0 0 100', '0 0 0', 1);
                }
                remove(self);
@@ -691,7 +691,7 @@ void spiderbot_blowup()
        {
                if(random() < 0.1)
                {
-                       sound (self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
                        Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
                }
                self.nextthink = time + 0.1;
@@ -811,8 +811,8 @@ bool spiderbot_impulse(int _imp)
        return false;
 }
 
-void spawnfunc_vehicle_spiderbot()
-{SELFPARAM();
+spawnfunc(vehicle_spiderbot)
+{
        if(!autocvar_g_vehicle_spiderbot) { remove(self); return; }
        if(!vehicle_initialize(VEH_SPIDERBOT, false)) { remove(self); return; }
 }
@@ -925,15 +925,6 @@ float v_spiderbot(float req)
                }
                case VR_PRECACHE:
                {
-                       precache_sound (W_Sound("uzi_fire") );
-                       precache_sound (W_Sound("rocket_impact"));
-
-                       precache_sound ("vehicles/spiderbot_die.wav");
-                       precache_sound ("vehicles/spiderbot_idle.wav");
-                       precache_sound ("vehicles/spiderbot_jump.wav");
-                       precache_sound ("vehicles/spiderbot_strafe.wav");
-                       precache_sound ("vehicles/spiderbot_walk.wav");
-                       precache_sound ("vehicles/spiderbot_land.wav");
                        return true;
                }
        }
index 046298a4c4f97c7bd2111a74503b2ac7483d46c6..b972cfdec4adfa1a74a6d7ef24b4c6c7dc6b9498 100644 (file)
@@ -331,7 +331,16 @@ int GetAmmoStat(.int ammotype)
 
 string W_Sound(string w_snd)
 {
-       string output = strcat("weapons/", w_snd, ".wav");
+       #define extensions(X) X(wav) X(ogg)
+       #define tryext(ext) { if (fexists(strcat("sound/", output = strcat("weapons/", w_snd, "."#ext)))) break; }
+       string output;
+       do {
+               extensions(tryext);
+               #undef tryext
+               #undef extensions
+               output = strcat("weapons/", w_snd);
+       } while (0);
+
 #ifdef SVQC
        MUTATOR_CALLHOOK(WeaponSound, w_snd, output);
        return weapon_sound_output;
index a6a073099664a9afd8a5aef2ceefdc445faf78b9..6e1e2c7cb6ebdec188eab9e383154d5bbb825822 100644 (file)
@@ -126,7 +126,7 @@ vector Draw_ArcBeam_callback_last_bottom; // NOTE: in same coordinate system as
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_arc(void) { weapon_defaultspawnfunc(WEP_ARC.m_id); }
+spawnfunc(weapon_arc) { weapon_defaultspawnfunc(WEP_ARC.m_id); }
 
 float W_Arc_Beam_Send(entity to, int sf)
 {SELFPARAM();
@@ -267,7 +267,7 @@ void W_Arc_Beam_Think(void)
                        {
                                Send_Effect_("arc_overheat",
                                        self.beam_start, self.beam_wantdir, 1 );
-                               sound(self, CH_WEAPON_A, W_Sound("arc_stop"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM);
                        }
                }
 
@@ -579,7 +579,7 @@ void W_Arc_Beam(float burst)
 
        // only play fire sound if 1 sec has passed since player let go the fire button
        if(time - self.beam_prev > 1)
-               sound(self, CH_WEAPON_A, W_Sound("arc_fire"), VOL_BASE, ATTN_NORM);
+               sound(self, CH_WEAPON_A, SND_ARC_FIRE, VOL_BASE, ATTN_NORM);
 
        entity beam = self.arc_beam = spawn();
        beam.classname = "W_Arc_Beam";
@@ -611,7 +611,7 @@ void Arc_Smoke()
                        if ( !self.arc_smoke_sound )
                        {
                                self.arc_smoke_sound = 1;
-                               sound(self, CH_SHOTS_SINGLE, W_Sound("arc_loop_overheat"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS_SINGLE, SND_ARC_LOOP_OVERHEAT, VOL_BASE, ATTN_NORM);
                        }
                }
        }
@@ -627,7 +627,7 @@ void Arc_Smoke()
                !( self.BUTTON_ATCK || self.BUTTON_ATCK2 ) ) || self.switchweapon != WEP_ARC.m_id )
        {
                self.arc_smoke_sound = 0;
-               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
        }
 }
 
@@ -695,7 +695,7 @@ bool W_Arc(int req)
 
                        if(self.arc_BUTTON_ATCK_prev != 0)
                        {
-                               sound(self, CH_WEAPON_A, W_Sound("arc_stop"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM);
                                weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
                                ATTACK_FINISHED(self) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor();
                        }
@@ -716,10 +716,6 @@ bool W_Arc(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("arc_fire"));
-                       precache_sound(W_Sound("arc_loop"));
-                       precache_sound(W_Sound("arc_stop"));
-                       precache_sound(W_Sound("arc_loop_overheat"));
                        if(!arc_shotorigin[0])
                        {
                                arc_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ARC.m_id), false, false, 1);
@@ -1158,7 +1154,7 @@ void Draw_ArcBeam(void)
 void Remove_ArcBeam(void)
 {SELFPARAM();
        remove(self.beam_muzzleentity);
-       sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
 }
 
 void Ent_ReadArcBeam(float isnew)
@@ -1180,7 +1176,7 @@ void Ent_ReadArcBeam(float isnew)
                self.draw = Draw_ArcBeam;
                self.entremove = Remove_ArcBeam;
                self.move_time = time;
-               loopsound(self, CH_SHOTS_SINGLE, W_Sound("arc_loop"), VOL_BASE, ATTEN_NORM);
+               loopsound(self, CH_SHOTS_SINGLE, SND(ARC_LOOP), VOL_BASE, ATTEN_NORM);
 
                flash = spawn();
                flash.owner = self;
@@ -1524,7 +1520,6 @@ bool W_Arc(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("arc_loop"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index b20713c029d0f2464133a96a031a7002edb90d14..10e55990a5594f645aeec8859e357905cf8d6135 100644 (file)
@@ -48,8 +48,8 @@ BLASTER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_blaster(void) { weapon_defaultspawnfunc(WEP_BLASTER.m_id); }
-void spawnfunc_weapon_laser(void) { spawnfunc_weapon_blaster(); }
+spawnfunc(weapon_blaster) { weapon_defaultspawnfunc(WEP_BLASTER.m_id); }
+spawnfunc(weapon_laser) { spawnfunc_weapon_blaster(this); }
 
 void W_Blaster_Touch(void)
 {SELFPARAM();
@@ -95,7 +95,7 @@ void W_Blaster_Attack(
 {SELFPARAM();
        vector s_forward = v_forward * cos(atk_shotangle * DEG2RAD) + v_up * sin(atk_shotangle * DEG2RAD);
 
-       W_SetupShot_Dir(self, s_forward, false, 3, W_Sound("lasergun_fire"), CH_WEAPON_B, atk_damage);
+       W_SetupShot_Dir(self, s_forward, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_B, atk_damage);
        Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        entity missile = spawn();
@@ -223,7 +223,6 @@ bool W_Blaster(int request)
 
                case WR_INIT:
                {
-                       precache_sound(W_Sound("lasergun_fire"));
                        BLASTER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -269,13 +268,12 @@ bool W_Blaster(int request)
                        vector org2;
                        org2 = w_org + w_backoff * 6;
                        pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), org2, w_backoff * 1000, 1);
-                       if(!w_issilent) { sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTN_NORM); }
+                       if(!w_issilent) { sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
                        return true;
                }
 
                case WR_INIT:
                {
-                       precache_sound(W_Sound("laserimpact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 6821d5a0e1adbf98999c7542fd26aafccf6857e7..bf6c0795f5985b9f1ae274bf94f76019929e4fd2 100644 (file)
@@ -64,7 +64,7 @@ CRYLINK_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_crylink(void) { weapon_defaultspawnfunc(WEP_CRYLINK.m_id); }
+spawnfunc(weapon_crylink) { weapon_defaultspawnfunc(WEP_CRYLINK.m_id); }
 
 void W_Crylink_CheckLinks(entity e)
 {
@@ -354,7 +354,7 @@ void W_Crylink_Attack(void)
        if(WEP_CVAR_PRI(crylink, joinexplode))
                maxdmg += WEP_CVAR_PRI(crylink, joinexplode_damage);
 
-       W_SetupShot(self, false, 2, W_Sound("crylink_fire"), CH_WEAPON_A, maxdmg);
+       W_SetupShot(self, false, 2, SND(CRYLINK_FIRE), CH_WEAPON_A, maxdmg);
        forward = v_forward;
        right = v_right;
        up = v_up;
@@ -463,7 +463,7 @@ void W_Crylink_Attack2(void)
        if(WEP_CVAR_SEC(crylink, joinexplode))
                maxdmg += WEP_CVAR_SEC(crylink, joinexplode_damage);
 
-       W_SetupShot(self, false, 2, W_Sound("crylink_fire2"), CH_WEAPON_A, maxdmg);
+       W_SetupShot(self, false, 2, SND(CRYLINK_FIRE2), CH_WEAPON_A, maxdmg);
        forward = v_forward;
        right = v_right;
        up = v_up;
@@ -638,9 +638,6 @@ bool W_Crylink(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("crylink_fire"));
-                       precache_sound(W_Sound("crylink_fire2"));
-                       precache_sound(W_Sound("crylink_linkjoin"));
                        CRYLINK_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -671,7 +668,7 @@ bool W_Crylink(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(crylink, ammo), WEP_CVAR_SEC(crylink, ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR_PRI(crylink, ammo), WEP_CVAR_SEC(crylink, ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -699,21 +696,19 @@ bool W_Crylink(int req)
                        {
                                pointparticles(particleeffectnum(EFFECT_CRYLINK_IMPACT2), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CH_SHOTS, W_Sound("crylink_impact2"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_CRYLINK_IMPACT2, VOL_BASE, ATTN_NORM);
                        }
                        else
                        {
                                pointparticles(particleeffectnum(EFFECT_CRYLINK_IMPACT), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CH_SHOTS, W_Sound("crylink_impact"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_CRYLINK_IMPACT, VOL_BASE, ATTN_NORM);
                        }
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("crylink_impact2"));
-                       precache_sound(W_Sound("crylink_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index cb2d16659c4b2e71fd518e4d58261beb580cfd22..0735f79ab4eda876d2da26f947a37ebbb3c1aba2 100644 (file)
@@ -62,8 +62,8 @@ DEVASTATOR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_devastator(void) { weapon_defaultspawnfunc(WEP_DEVASTATOR.m_id); }
-void spawnfunc_weapon_rocketlauncher(void) { spawnfunc_weapon_devastator(); }
+spawnfunc(weapon_devastator) { weapon_defaultspawnfunc(WEP_DEVASTATOR.m_id); }
+spawnfunc(weapon_rocketlauncher) { spawnfunc_weapon_devastator(this); }
 
 void W_Devastator_Unregister(void)
 {SELFPARAM();
@@ -295,7 +295,7 @@ void W_Devastator_Think(void)
                        {
                                Send_Effect(EFFECT_ROCKET_GUIDE, self.origin, self.velocity, 1);
                                // TODO add a better sound here
-                               sound(self.realowner, CH_WEAPON_B, W_Sound("rocket_mode"), VOL_BASE, ATTN_NORM);
+                               sound(self.realowner, CH_WEAPON_B, SND_ROCKET_MODE, VOL_BASE, ATTN_NORM);
                                self.count = 1;
                        }
                }
@@ -342,7 +342,7 @@ void W_Devastator_Attack(void)
 
        W_DecreaseAmmo(WEP_CVAR(devastator, ammo));
 
-       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 5, W_Sound("rocket_fire"), CH_WEAPON_A, WEP_CVAR(devastator, damage));
+       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 5, SND(ROCKET_FIRE), CH_WEAPON_A, WEP_CVAR(devastator, damage));
        Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
@@ -559,7 +559,7 @@ bool W_Devastator(int req)
                                                }
                                        }
                                        if(rockfound)
-                                               sound(self, CH_WEAPON_B, W_Sound("rocket_det"), VOL_BASE, ATTN_NORM);
+                                               sound(self, CH_WEAPON_B, SND_ROCKET_DET, VOL_BASE, ATTN_NORM);
                                }
                        }
 
@@ -567,12 +567,6 @@ bool W_Devastator(int req)
                }
                case WR_INIT:
                {
-                       //if(autocvar_sv_precacheweapons)
-                       //{
-                               precache_sound(W_Sound("rocket_det"));
-                               precache_sound(W_Sound("rocket_fire"));
-                               precache_sound(W_Sound("rocket_mode"));
-                       //}
                        DEVASTATOR_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -633,7 +627,7 @@ bool W_Devastator(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(WEP_CVAR(devastator, ammo), W_Sound("reload"));
+                       W_Reload(WEP_CVAR(devastator, ammo), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -662,13 +656,12 @@ bool W_Devastator(int req)
                        org2 = w_org + w_backoff * 12;
                        pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("rocket_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 7f02a00ce2013542972aae39d2674b564ed53a09..85a75ed9c5b9f483ba6d45a3fd5f3fef45feae9f 100644 (file)
@@ -67,7 +67,7 @@ void W_Electro_ExplodeCombo(void);
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_electro(void) { weapon_defaultspawnfunc(WEP_ELECTRO.m_id); }
+spawnfunc(weapon_electro) { weapon_defaultspawnfunc(WEP_ELECTRO.m_id); }
 
 void W_Electro_TriggerCombo(vector org, float rad, entity own)
 {
@@ -255,7 +255,7 @@ void W_Electro_Attack_Bolt(void)
                '0 0 -3',
                false,
                2,
-               W_Sound("electro_fire"),
+               SND(ELECTRO_FIRE),
                CH_WEAPON_A,
                WEP_CVAR_PRI(electro, damage)
        );
@@ -296,7 +296,7 @@ void W_Electro_Orb_Touch(void)
        else
        {
                //UpdateCSQCProjectile(self);
-               spamsound(self, CH_SHOTS, W_Sound("electro_bounce"), VOL_BASE, ATTEN_NORM);
+               spamsound(self, CH_SHOTS, SND(ELECTRO_BOUNCE), VOL_BASE, ATTEN_NORM);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
        }
 }
@@ -353,7 +353,7 @@ void W_Electro_Attack_Orb(void)
                '0 0 -4',
                false,
                2,
-               W_Sound("electro_fire2"),
+               SND(ELECTRO_FIRE2),
                CH_WEAPON_A,
                WEP_CVAR_SEC(electro, damage)
        );
@@ -498,11 +498,6 @@ bool W_Electro(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("electro_bounce"));
-                       precache_sound(W_Sound("electro_fire"));
-                       precache_sound(W_Sound("electro_fire2"));
-                       precache_sound(W_Sound("electro_impact"));
-                       precache_sound(W_Sound("electro_impact_combo"));
                        ELECTRO_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -538,7 +533,7 @@ bool W_Electro(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(electro, ammo), WEP_CVAR_SEC(electro, ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR_PRI(electro, ammo), WEP_CVAR_SEC(electro, ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -579,7 +574,7 @@ bool W_Electro(int req)
                        {
                                pointparticles(particleeffectnum(EFFECT_ELECTRO_BALLEXPLODE), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CH_SHOTS, W_Sound("electro_impact"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTEN_NORM);
                        }
                        else
                        {
@@ -588,13 +583,13 @@ bool W_Electro(int req)
                                        // this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls
                                        pointparticles(particleeffectnum(EFFECT_ELECTRO_COMBO), org2, '0 0 0', 1);
                                        if(!w_issilent)
-                                               sound(self, CH_SHOTS, W_Sound("electro_impact_combo"), VOL_BASE, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_ELECTRO_IMPACT_COMBO, VOL_BASE, ATTEN_NORM);
                                }
                                else
                                {
                                        pointparticles(particleeffectnum(EFFECT_ELECTRO_IMPACT), org2, '0 0 0', 1);
                                        if(!w_issilent)
-                                               sound(self, CH_SHOTS, W_Sound("electro_impact"), VOL_BASE, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTEN_NORM);
                                }
                        }
 
@@ -602,8 +597,6 @@ bool W_Electro(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("electro_impact"));
-                       precache_sound(W_Sound("electro_impact_combo"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index a37ae8f0997c4bc825ec7a7b01f99d4cbf5110e0..c334932f165f74fb96e7b120522584337460bbc3 100644 (file)
@@ -55,7 +55,7 @@ FIREBALL_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_fireball(void) { weapon_defaultspawnfunc(WEP_FIREBALL.m_id); }
+spawnfunc(weapon_fireball) { weapon_defaultspawnfunc(WEP_FIREBALL.m_id); }
 
 void W_Fireball_Explode(void)
 {SELFPARAM();
@@ -182,7 +182,7 @@ void W_Fireball_Attack1(void)
 {SELFPARAM();
        entity proj;
 
-       W_SetupShot_ProjectileSize(self, '-16 -16 -16', '16 16 16', false, 2, W_Sound("fireball_fire2"), CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage));
+       W_SetupShot_ProjectileSize(self, '-16 -16 -16', '16 16 16', false, 2, SND(FIREBALL_FIRE2), CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage));
 
        Send_Effect(EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
@@ -251,7 +251,7 @@ void W_Fireball_Attack1_Frame1(void)
 void W_Fireball_Attack1_Frame0(void)
 {SELFPARAM();
        W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
-       sound(self, CH_WEAPON_SINGLE, W_Sound("fireball_prefire2"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_WEAPON_SINGLE, SND_FIREBALL_PREFIRE2, VOL_BASE, ATTEN_NORM);
        weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame1);
 }
 
@@ -316,7 +316,7 @@ void W_Fireball_Attack2(void)
                        f_diff = '+1.25 +3.75 0';
                        break;
        }
-       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 2, W_Sound("fireball_fire"), CH_WEAPON_A, WEP_CVAR_SEC(fireball, damage));
+       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 2, SND(FIREBALL_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(fireball, damage));
        traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, self);
        w_shotorg = trace_endpos;
 
@@ -399,9 +399,6 @@ bool W_Fireball(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("fireball_fire"));
-                       precache_sound(W_Sound("fireball_fire2"));
-                       precache_sound(W_Sound("fireball_prefire2"));
                        FIREBALL_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -460,14 +457,13 @@ bool W_Fireball(int req)
                                org2 = w_org + w_backoff * 16;
                                pointparticles(particleeffectnum(EFFECT_FIREBALL_EXPLODE), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CH_SHOTS, W_Sound("fireball_impact2"), VOL_BASE, ATTEN_NORM * 0.25); // long range boom
+                                       sound(self, CH_SHOTS, SND_FIREBALL_IMPACT2, VOL_BASE, ATTEN_NORM * 0.25); // long range boom
                        }
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("fireball_impact2"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index d55a1b6072e3943369e5b64d71715f56da4e83a3..21755eac69a07005a2a8a24d58efab0d3f2b7c72 100644 (file)
@@ -56,7 +56,7 @@ HAGAR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_hagar(void) { weapon_defaultspawnfunc(WEP_HAGAR.m_id); }
+spawnfunc(weapon_hagar) { weapon_defaultspawnfunc(WEP_HAGAR.m_id); }
 
 // NO bounce protection, as bounces are limited!
 
@@ -127,7 +127,7 @@ void W_Hagar_Attack(void)
 
        W_DecreaseAmmo(WEP_CVAR_PRI(hagar, ammo));
 
-       W_SetupShot(self, false, 2, W_Sound("hagar_fire"), CH_WEAPON_A, WEP_CVAR_PRI(hagar, damage));
+       W_SetupShot(self, false, 2, SND(HAGAR_FIRE), CH_WEAPON_A, WEP_CVAR_PRI(hagar, damage));
 
        Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
@@ -170,7 +170,7 @@ void W_Hagar_Attack2(void)
 
        W_DecreaseAmmo(WEP_CVAR_SEC(hagar, ammo));
 
-       W_SetupShot(self, false, 2, W_Sound("hagar_fire"), CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage));
+       W_SetupShot(self, false, 2, SND(HAGAR_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage));
 
        Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
@@ -223,7 +223,7 @@ void W_Hagar_Attack2_Load_Release(void)
 
        weapon_prepareattack_do(1, WEP_CVAR_SEC(hagar, refire));
 
-       W_SetupShot(self, false, 2, W_Sound("hagar_fire"), CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage));
+       W_SetupShot(self, false, 2, SND(HAGAR_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage));
        Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        forward = v_forward;
@@ -319,7 +319,7 @@ void W_Hagar_Attack2_Load(void)
                                self.weaponentity.state = WS_READY;
                                W_DecreaseAmmo(WEP_CVAR_SEC(hagar, ammo) * self.hagar_load * -1); // give back ammo
                                self.hagar_load = 0;
-                               sound(self, CH_WEAPON_A, W_Sound("hagar_beep"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, SND_HAGAR_BEEP, VOL_BASE, ATTN_NORM);
 
                                // pause until we can load rockets again, once we re-press the alt fire button
                                self.hagar_loadstep = time + WEP_CVAR_SEC(hagar, load_speed) * W_WeaponRateFactor();
@@ -338,7 +338,7 @@ void W_Hagar_Attack2_Load(void)
                                        W_DecreaseAmmo(WEP_CVAR_SEC(hagar, ammo));
                                        self.weaponentity.state = WS_INUSE;
                                        self.hagar_load += 1;
-                                       sound(self, CH_WEAPON_B, W_Sound("hagar_load"), VOL_BASE * 0.8, ATTN_NORM); // sound is too loud according to most
+                                       sound(self, CH_WEAPON_B, SND_HAGAR_LOAD, VOL_BASE * 0.8, ATTN_NORM); // sound is too loud according to most
 
                                        if(self.hagar_load >= WEP_CVAR_SEC(hagar, load_max))
                                                stopped = true;
@@ -349,7 +349,7 @@ void W_Hagar_Attack2_Load(void)
                        if(stopped && !self.hagar_loadbeep && self.hagar_load) // prevents the beep from playing each frame
                        {
                                // if this is the last rocket we can load, play a beep sound to notify the player
-                               sound(self, CH_WEAPON_A, W_Sound("hagar_beep"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, SND_HAGAR_BEEP, VOL_BASE, ATTN_NORM);
                                self.hagar_loadbeep = true;
                                self.hagar_loadstep = time + WEP_CVAR_SEC(hagar, load_hold) * W_WeaponRateFactor();
                        }
@@ -369,7 +369,7 @@ void W_Hagar_Attack2_Load(void)
                        if(!self.hagar_warning) // prevents the beep from playing each frame
                        {
                                // we're about to automatically release after holding time, play a beep sound to notify the player
-                               sound(self, CH_WEAPON_A, W_Sound("hagar_beep"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, SND_HAGAR_BEEP, VOL_BASE, ATTN_NORM);
                                self.hagar_warning = true;
                        }
                }
@@ -451,9 +451,6 @@ bool W_Hagar(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("hagar_fire"));
-                       precache_sound(W_Sound("hagar_load"));
-                       precache_sound(W_Sound("hagar_beep"));
                        HAGAR_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -502,7 +499,7 @@ bool W_Hagar(int req)
                case WR_RELOAD:
                {
                        if(!self.hagar_load) // require releasing loaded rockets first
-                               W_Reload(min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo)), W_Sound("reload"));
+                               W_Reload(min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo)), SND(RELOAD));
 
                        return true;
                }
@@ -534,20 +531,17 @@ bool W_Hagar(int req)
                        if(!w_issilent)
                        {
                                if(w_random<0.15)
-                                       sound(self, CH_SHOTS, W_Sound("hagexp1"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_HAGEXP1, VOL_BASE, ATTN_NORM);
                                else if(w_random<0.7)
-                                       sound(self, CH_SHOTS, W_Sound("hagexp2"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_HAGEXP2, VOL_BASE, ATTN_NORM);
                                else
-                                       sound(self, CH_SHOTS, W_Sound("hagexp3"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_HAGEXP3, VOL_BASE, ATTN_NORM);
                        }
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("hagexp1"));
-                       precache_sound(W_Sound("hagexp2"));
-                       precache_sound(W_Sound("hagexp3"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 074b76053882051306d3daac23a1f78f127537d1..ac300fe540b416b632cfd2f89702dacf30f80669 100644 (file)
@@ -48,7 +48,7 @@ HLAC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_hlac(void) { weapon_defaultspawnfunc(WEP_HLAC.m_id); }
+spawnfunc(weapon_hlac) { weapon_defaultspawnfunc(WEP_HLAC.m_id); }
 
 void W_HLAC_Touch(void)
 {SELFPARAM();
@@ -77,7 +77,7 @@ void W_HLAC_Attack(void)
     if(self.crouch)
         spread = spread * WEP_CVAR_PRI(hlac, spread_crouchmod);
 
-       W_SetupShot(self, false, 3, W_Sound("lasergun_fire"), CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage));
+       W_SetupShot(self, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage));
        Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
        if(!autocvar_g_norecoil)
        {
@@ -125,7 +125,7 @@ void W_HLAC_Attack2(void)
     if(self.crouch)
         spread = spread * WEP_CVAR_SEC(hlac, spread_crouchmod);
 
-       W_SetupShot(self, false, 3, W_Sound("lasergun_fire"), CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage));
+       W_SetupShot(self, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage));
        Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        missile = spawn();
@@ -241,7 +241,6 @@ bool W_HLAC(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("lasergun_fire"));
                        HLAC_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -264,7 +263,7 @@ bool W_HLAC(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(hlac, ammo), WEP_CVAR_SEC(hlac, ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR_PRI(hlac, ammo), WEP_CVAR_SEC(hlac, ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -290,13 +289,12 @@ bool W_HLAC(int req)
                        org2 = w_org + w_backoff * 6;
                        pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), org2, w_backoff * 1000, 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("laserimpact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index c55304118b678a4e9f1e60fb8f4e209d9efb8e2f..f4c6a3c752a075b1a743c372b69b127150aa8457 100644 (file)
@@ -41,7 +41,7 @@ HMG_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #ifdef IMPLEMENTATION
 #ifdef SVQC
 
-void spawnfunc_weapon_hmg() { weapon_defaultspawnfunc(WEP_HMG.m_id); }
+spawnfunc(weapon_hmg) { weapon_defaultspawnfunc(WEP_HMG.m_id); }
 
 void W_HeavyMachineGun_Attack_Auto()
 {SELFPARAM();
@@ -61,7 +61,7 @@ void W_HeavyMachineGun_Attack_Auto()
 
        W_DecreaseAmmo(WEP_CVAR(hmg, ammo));
 
-       W_SetupShot (self, true, 0, W_Sound("uzi_fire"), CH_WEAPON_A, WEP_CVAR(hmg, damage));
+       W_SetupShot (self, true, 0, SND(UZI_FIRE), CH_WEAPON_A, WEP_CVAR(hmg, damage));
 
        if(!autocvar_g_norecoil)
        {
@@ -118,7 +118,6 @@ bool W_HeavyMachineGun(int req)
                }
                case WR_INIT:
                {
-                       precache_sound (W_Sound("uzi_fire"));
                        HMG_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -147,7 +146,7 @@ bool W_HeavyMachineGun(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(WEP_CVAR(hmg, ammo), W_Sound("reload"));
+                       W_Reload(WEP_CVAR(hmg, ammo), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -177,19 +176,16 @@ bool W_HeavyMachineGun(int req)
                        pointparticles(particleeffectnum(EFFECT_MACHINEGUN_IMPACT), org2, w_backoff * 1000, 1);
                        if(!w_issilent)
                                if(w_random < 0.05)
-                                       sound(self, CH_SHOTS, W_Sound("ric1"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTEN_NORM);
                                else if(w_random < 0.1)
-                                       sound(self, CH_SHOTS, W_Sound("ric2"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC2, VOL_BASE, ATTEN_NORM);
                                else if(w_random < 0.2)
-                                       sound(self, CH_SHOTS, W_Sound("ric3"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC3, VOL_BASE, ATTEN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("ric1"));
-                       precache_sound(W_Sound("ric2"));
-                       precache_sound(W_Sound("ric3"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index b7f51b54c4319c66590ef942576399b2a898ddd4..6c1f82fdf8561a6ed83387731cbbbb89bbe64343 100644 (file)
@@ -59,8 +59,8 @@ HOOK_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #ifdef IMPLEMENTATION
 #ifdef SVQC
 
-void spawnfunc_weapon_hook(void)
-{SELFPARAM();
+spawnfunc(weapon_hook)
+{
        if(g_grappling_hook) // offhand hook
        {
                startitem_failed = true;
@@ -134,7 +134,7 @@ void W_Hook_Attack2(void)
        entity gren;
 
        //W_DecreaseAmmo(WEP_CVAR_SEC(hook, ammo)); // WEAPONTODO: Figure out how to handle ammo with hook secondary (gravitybomb)
-       W_SetupShot(self, false, 4, W_Sound("hookbomb_fire"), CH_WEAPON_A, WEP_CVAR_SEC(hook, damage));
+       W_SetupShot(self, false, 4, SND(HOOKBOMB_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(hook, damage));
 
        gren = spawn();
        gren.owner = gren.realowner = self;
@@ -288,9 +288,6 @@ bool W_Hook(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("hook_impact")); // done by g_hook.qc
-                       precache_sound(W_Sound("hook_fire"));
-                       precache_sound(W_Sound("hookbomb_fire"));
                        HOOK_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -344,13 +341,12 @@ bool W_Hook(int req)
                        org2 = w_org + w_backoff * 2;
                        pointparticles(particleeffectnum(EFFECT_HOOK_EXPLODE), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("hookbomb_impact"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_HOOKBOMB_IMPACT, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("hookbomb_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 01efced0f5b1f1bca56f31ff70cb674d2d8f44aa..e9a50ab4393d34c6eb976ea1dbae2c77bb211f8c 100644 (file)
@@ -55,8 +55,8 @@ MACHINEGUN_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #ifdef IMPLEMENTATION
 #ifdef SVQC
 
-void spawnfunc_weapon_machinegun(void)
-{SELFPARAM();
+spawnfunc(weapon_machinegun)
+{
        if(autocvar_sv_q3acompat_machineshotgunswap)
        if(self.classname != "droppedweapon")
        {
@@ -65,7 +65,7 @@ void spawnfunc_weapon_machinegun(void)
        }
        weapon_defaultspawnfunc(WEP_MACHINEGUN.m_id);
 }
-void spawnfunc_weapon_uzi(void) { spawnfunc_weapon_machinegun(); }
+spawnfunc(weapon_uzi) { spawnfunc_weapon_machinegun(this); }
 
 void W_MachineGun_MuzzleFlash_Think(void)
 {SELFPARAM();
@@ -104,7 +104,7 @@ void W_MachineGun_MuzzleFlash(void)
 
 void W_MachineGun_Attack(int deathtype)
 {SELFPARAM();
-       W_SetupShot(self, true, 0, W_Sound("uzi_fire"), CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage)));
+       W_SetupShot(self, true, 0, SND(UZI_FIRE), CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage)));
        if(!autocvar_g_norecoil)
        {
                self.punchangle_x = random() - 0.5;
@@ -180,7 +180,7 @@ void W_MachineGun_Attack_Auto(void)
 
        W_DecreaseAmmo(WEP_CVAR(machinegun, sustained_ammo));
 
-       W_SetupShot(self, true, 0, W_Sound("uzi_fire"), CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage));
+       W_SetupShot(self, true, 0, SND(UZI_FIRE), CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage));
        if(!autocvar_g_norecoil)
        {
                self.punchangle_x = random() - 0.5;
@@ -206,7 +206,7 @@ void W_MachineGun_Attack_Auto(void)
 
 void W_MachineGun_Attack_Burst(void)
 {SELFPARAM();
-       W_SetupShot(self, true, 0, W_Sound("uzi_fire"), CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage));
+       W_SetupShot(self, true, 0, SND(UZI_FIRE), CH_WEAPON_A, WEP_CVAR(machinegun, sustained_damage));
        if(!autocvar_g_norecoil)
        {
                self.punchangle_x = random() - 0.5;
@@ -304,7 +304,6 @@ bool W_MachineGun(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("uzi_fire"));
                        MACHINEGUN_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -347,7 +346,7 @@ bool W_MachineGun(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), W_Sound("reload"));
+                       W_Reload(min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -377,19 +376,16 @@ bool W_MachineGun(int req)
                        pointparticles(particleeffectnum(EFFECT_MACHINEGUN_IMPACT), org2, w_backoff * 1000, 1);
                        if(!w_issilent)
                                if(w_random < 0.05)
-                                       sound(self, CH_SHOTS, W_Sound("ric1"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTN_NORM);
                                else if(w_random < 0.1)
-                                       sound(self, CH_SHOTS, W_Sound("ric2"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC2, VOL_BASE, ATTN_NORM);
                                else if(w_random < 0.2)
-                                       sound(self, CH_SHOTS, W_Sound("ric3"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC3, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("ric1"));
-                       precache_sound(W_Sound("ric2"));
-                       precache_sound(W_Sound("ric3"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 1c7e89fde2924574374d1399b4df8ab8763f973f..40866970fb3438d3fd2fcd83cdc0bfeaccc05b76 100644 (file)
@@ -57,11 +57,11 @@ void W_MineLayer_Think(void);
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_minelayer(void) { weapon_defaultspawnfunc(WEP_MINE_LAYER.m_id); }
+spawnfunc(weapon_minelayer) { weapon_defaultspawnfunc(WEP_MINE_LAYER.m_id); }
 
 void W_MineLayer_Stick(entity to)
 {SELFPARAM();
-       spamsound(self, CH_SHOTS, W_Sound("mine_stick"), VOL_BASE, ATTN_NORM);
+       spamsound(self, CH_SHOTS, SND(MINE_STICK), VOL_BASE, ATTN_NORM);
 
        // in order for mines to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile
 
@@ -221,7 +221,7 @@ void W_MineLayer_Think(void)
        if((time > self.cnt) && (!self.mine_time) && (self.cnt > 0))
        {
                if(WEP_CVAR(minelayer, lifetime_countdown) > 0)
-                       spamsound(self, CH_SHOTS, W_Sound("mine_trigger"), VOL_BASE, ATTN_NORM);
+                       spamsound(self, CH_SHOTS, SND(MINE_TRIGGER), VOL_BASE, ATTN_NORM);
                self.mine_time = time + WEP_CVAR(minelayer, lifetime_countdown);
                self.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a team mate is near.
        }
@@ -244,7 +244,7 @@ void W_MineLayer_Think(void)
                if(head != self.realowner && DIFF_TEAM(head, self.realowner)) // don't trigger for team mates
                if(!self.mine_time)
                {
-                       spamsound(self, CH_SHOTS, W_Sound("mine_trigger"), VOL_BASE, ATTN_NORM);
+                       spamsound(self, CH_SHOTS, SND(MINE_TRIGGER), VOL_BASE, ATTN_NORM);
                        self.mine_time = time + WEP_CVAR(minelayer, time);
                }
                head = head.chain;
@@ -316,14 +316,14 @@ void W_MineLayer_Attack(void)
                {
                        // the refire delay keeps this message from being spammed
                        Send_Notification(NOTIF_ONE, self, MSG_MULTI, WEAPON_MINELAYER_LIMIT, WEP_CVAR(minelayer, limit));
-                       play2(self, W_Sound("unavailable"));
+                       play2(self, SND(UNAVAILABLE));
                        return;
                }
        }
 
        W_DecreaseAmmo(WEP_CVAR(minelayer, ammo));
 
-       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 5, W_Sound("mine_fire"), CH_WEAPON_A, WEP_CVAR(minelayer, damage));
+       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 5, SND(MINE_FIRE), CH_WEAPON_A, WEP_CVAR(minelayer, damage));
        Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        mine = WarpZone_RefSys_SpawnSameRefSys(self);
@@ -523,17 +523,13 @@ bool W_MineLayer(int req)
                        if(self.BUTTON_ATCK2)
                        {
                                if(W_MineLayer_PlacedMines(true))
-                                       sound(self, CH_WEAPON_B, W_Sound("mine_det"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_WEAPON_B, SND_MINE_DET, VOL_BASE, ATTN_NORM);
                        }
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("mine_det"));
-                       precache_sound(W_Sound("mine_fire"));
-                       precache_sound(W_Sound("mine_stick"));
-                       precache_sound(W_Sound("mine_trigger"));
                        MINELAYER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -567,7 +563,7 @@ bool W_MineLayer(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(WEP_CVAR(minelayer, ammo), W_Sound("reload"));
+                       W_Reload(WEP_CVAR(minelayer, ammo), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -593,13 +589,12 @@ bool W_MineLayer(int req)
                        org2 = w_org + w_backoff * 12;
                        pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("mine_exp"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_MINE_EXP, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("mine_exp"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index d03eb8e565d4080cdf16200dc467ee5f7acff880..1276cca5d9347bbcd45d4142014a2793aa9c703f 100644 (file)
@@ -56,8 +56,8 @@ MORTAR_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #ifdef IMPLEMENTATION
 #ifdef SVQC
 
-void spawnfunc_weapon_mortar(void) { weapon_defaultspawnfunc(WEP_MORTAR.m_id); }
-void spawnfunc_weapon_grenadelauncher(void) { spawnfunc_weapon_mortar(); }
+spawnfunc(weapon_mortar) { weapon_defaultspawnfunc(WEP_MORTAR.m_id); }
+spawnfunc(weapon_grenadelauncher) { spawnfunc_weapon_mortar(this); }
 
 void W_Mortar_Grenade_Explode(void)
 {SELFPARAM();
@@ -137,27 +137,14 @@ void W_Mortar_Grenade_Touch1(void)
        }
        else if(WEP_CVAR_PRI(mortar, type) == 1) // bounce
        {
-               float r;
-               r = random() * 6;
-               if(r < 1)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce1"), VOL_BASE, ATTN_NORM);
-               else if(r < 2)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce2"), VOL_BASE, ATTN_NORM);
-               else if(r < 3)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce3"), VOL_BASE, ATTN_NORM);
-               else if(r < 4)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce4"), VOL_BASE, ATTN_NORM);
-               else if(r < 5)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce5"), VOL_BASE, ATTN_NORM);
-               else
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce6"), VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, SND(GRENADE_BOUNCE_RANDOM()), VOL_BASE, ATTN_NORM);
                Send_Effect(EFFECT_HAGAR_BOUNCE, self.origin, self.velocity, 1);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
                self.gl_bouncecnt += 1;
        }
        else if(WEP_CVAR_PRI(mortar, type) == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
-               spamsound(self, CH_SHOTS, W_Sound("grenade_stick"), VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, SND(GRENADE_STICK), VOL_BASE, ATTN_NORM);
 
                // let it stick whereever it is
                self.oldvelocity = self.velocity;
@@ -182,20 +169,7 @@ void W_Mortar_Grenade_Touch2(void)
        }
        else if(WEP_CVAR_SEC(mortar, type) == 1) // bounce
        {
-               float r;
-               r = random() * 6;
-               if(r < 1)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce1"), VOL_BASE, ATTN_NORM);
-               else if(r < 2)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce2"), VOL_BASE, ATTN_NORM);
-               else if(r < 3)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce3"), VOL_BASE, ATTN_NORM);
-               else if(r < 4)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce4"), VOL_BASE, ATTN_NORM);
-               else if(r < 5)
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce5"), VOL_BASE, ATTN_NORM);
-               else
-                       spamsound(self, CH_SHOTS, W_Sound("grenade_bounce6"), VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, SND(GRENADE_BOUNCE_RANDOM()), VOL_BASE, ATTN_NORM);
                Send_Effect(EFFECT_HAGAR_BOUNCE, self.origin, self.velocity, 1);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
                self.gl_bouncecnt += 1;
@@ -206,7 +180,7 @@ void W_Mortar_Grenade_Touch2(void)
        }
        else if(WEP_CVAR_SEC(mortar, type) == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
-               spamsound(self, CH_SHOTS, W_Sound("grenade_stick"), VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, SND(GRENADE_STICK), VOL_BASE, ATTN_NORM);
 
                // let it stick whereever it is
                self.oldvelocity = self.velocity;
@@ -228,7 +202,7 @@ void W_Mortar_Attack(void)
 
        W_DecreaseAmmo(WEP_CVAR_PRI(mortar, ammo));
 
-       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 4, W_Sound("grenade_fire"), CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage));
+       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 4, SND(GRENADE_FIRE), CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage));
        w_shotdir = v_forward; // no TrueAim for grenades please
 
        Send_Effect(EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
@@ -277,7 +251,7 @@ void W_Mortar_Attack2(void)
 
        W_DecreaseAmmo(WEP_CVAR_SEC(mortar, ammo));
 
-       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 4, W_Sound("grenade_fire"), CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage));
+       W_SetupShot_ProjectileSize(self, '-3 -3 -3', '3 3 3', false, 4, SND(GRENADE_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage));
        w_shotdir = v_forward; // no TrueAim for grenades please
 
        Send_Effect(EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
@@ -392,7 +366,7 @@ bool W_Mortar(int req)
                                                }
                                        }
                                        if(nadefound)
-                                               sound(self, CH_WEAPON_B, W_Sound("rocket_det"), VOL_BASE, ATTN_NORM);
+                                               sound(self, CH_WEAPON_B, SND_ROCKET_DET, VOL_BASE, ATTN_NORM);
                                }
                                else if(weapon_prepareattack(1, WEP_CVAR_SEC(mortar, refire)))
                                {
@@ -405,14 +379,6 @@ bool W_Mortar(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("grenade_bounce1"));
-                       precache_sound(W_Sound("grenade_bounce2"));
-                       precache_sound(W_Sound("grenade_bounce3"));
-                       precache_sound(W_Sound("grenade_bounce4"));
-                       precache_sound(W_Sound("grenade_bounce5"));
-                       precache_sound(W_Sound("grenade_bounce6"));
-                       precache_sound(W_Sound("grenade_stick"));
-                       precache_sound(W_Sound("grenade_fire"));
                        MORTAR_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -435,7 +401,7 @@ bool W_Mortar(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(mortar, ammo), WEP_CVAR_SEC(mortar, ammo)), W_Sound("reload")); // WEAPONTODO
+                       W_Reload(min(WEP_CVAR_PRI(mortar, ammo), WEP_CVAR_SEC(mortar, ammo)), SND(RELOAD)); // WEAPONTODO
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -467,13 +433,12 @@ bool W_Mortar(int req)
                        org2 = w_org + w_backoff * 12;
                        pointparticles(particleeffectnum(EFFECT_GRENADE_EXPLODE), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("grenade_impact"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_GRENADE_IMPACT, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("grenade_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 58c28716aebc025c15edfb5656beb79f4eca7879..66cdb21228b099c4d240a9b14ed12a0c5393cbf8 100644 (file)
@@ -41,7 +41,7 @@ PORTO_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #ifdef SVQC
 #include "../../triggers/trigger/jumppads.qh"
 
-void spawnfunc_weapon_porto(void) { weapon_defaultspawnfunc(WEP_PORTO.m_id); }
+spawnfunc(weapon_porto) { weapon_defaultspawnfunc(WEP_PORTO.m_id); }
 
 void W_Porto_Success(void)
 {SELFPARAM();
@@ -132,19 +132,19 @@ void W_Porto_Touch(void)
 
        if(self.realowner.playerid != self.playerid)
        {
-               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                remove(self);
        }
        else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
        {
-               spamsound(self, CH_SHOTS, "porto/bounce.wav", VOL_BASE, ATTEN_NORM);
+               spamsound(self, CH_SHOTS, SND(PORTO_BOUNCE), VOL_BASE, ATTEN_NORM);
                // just reflect
                self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
                self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
        }
        else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
        {
-               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                W_Porto_Fail(0);
                if(self.cnt < 0)
                        Portal_ClearAll_PortalsOnly(self.realowner);
@@ -154,14 +154,14 @@ void W_Porto_Touch(void)
                // in-portal only
                if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                {
-                       sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_CREATE, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
                        W_Porto_Success();
                }
                else
                {
-                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        W_Porto_Fail(0);
                }
@@ -171,14 +171,14 @@ void W_Porto_Touch(void)
                // out-portal only
                if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                {
-                       sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_CREATE, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
                        W_Porto_Success();
                }
                else
                {
-                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        W_Porto_Fail(0);
                }
@@ -188,7 +188,7 @@ void W_Porto_Touch(void)
                self.effects += EF_BLUE - EF_RED;
                if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                {
-                       sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_CREATE, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
                        self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
@@ -197,7 +197,7 @@ void W_Porto_Touch(void)
                }
                else
                {
-                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
                        Portal_ClearAll_PortalsOnly(self.realowner);
                        W_Porto_Fail(0);
@@ -209,21 +209,21 @@ void W_Porto_Touch(void)
                {
                        if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                        {
-                               sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_PORTO_CREATE, VOL_BASE, ATTEN_NORM);
                                trace_plane_normal = norm;
                                Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
                                W_Porto_Success();
                        }
                        else
                        {
-                               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                                Portal_ClearAll_PortalsOnly(self.realowner);
                                W_Porto_Fail(0);
                        }
                }
                else
                {
-                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_PORTO_UNSUPPORTED, VOL_BASE, ATTEN_NORM);
                        Portal_ClearAll_PortalsOnly(self.realowner);
                        W_Porto_Fail(0);
                }
@@ -234,7 +234,7 @@ void W_Porto_Attack(float type)
 {SELFPARAM();
        entity gren;
 
-       W_SetupShot(self, false, 4, "porto/fire.wav", CH_WEAPON_A, 0);
+       W_SetupShot(self, false, 4, SND(PORTO_FIRE), CH_WEAPON_A, 0);
        // always shoot from the eye
        w_shotdir = v_forward;
        w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
@@ -373,12 +373,6 @@ bool W_Porto(int req)
                }
                case WR_INIT:
                {
-                       precache_sound("porto/bounce.wav");
-                       precache_sound("porto/create.wav");
-                       precache_sound("porto/expire.wav");
-                       precache_sound("porto/explode.wav");
-                       precache_sound("porto/fire.wav");
-                       precache_sound("porto/unsupported.wav");
                        PORTO_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
index 66be38175f19fbabf8e57fde0e58ae93860411ae..c156d84b46e9285841f055fffc78282f0a19e859 100644 (file)
@@ -47,9 +47,9 @@ RIFLE_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_rifle(void) { weapon_defaultspawnfunc(WEP_RIFLE.m_id); }
-void spawnfunc_weapon_campingrifle(void) { spawnfunc_weapon_rifle(); }
-void spawnfunc_weapon_sniperrifle(void) { spawnfunc_weapon_rifle(); }
+spawnfunc(weapon_rifle) { weapon_defaultspawnfunc(WEP_RIFLE.m_id); }
+spawnfunc(weapon_campingrifle) { spawnfunc_weapon_rifle(this); }
+spawnfunc(weapon_sniperrifle) { spawnfunc_weapon_rifle(this); }
 
 void W_Rifle_FireBullet(float pSpread, float pDamage, float pForce, float pSolidPenetration, float pAmmo, int deathtype, float pTracer, float pShots, string pSound)
 {SELFPARAM();
@@ -76,12 +76,12 @@ void W_Rifle_FireBullet(float pSpread, float pDamage, float pForce, float pSolid
 
 void W_Rifle_Attack(void)
 {
-       W_Rifle_FireBullet(WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, solidpenetration), WEP_CVAR_PRI(rifle, ammo), WEP_RIFLE.m_id, WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), W_Sound("campingrifle_fire"));
+       W_Rifle_FireBullet(WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, solidpenetration), WEP_CVAR_PRI(rifle, ammo), WEP_RIFLE.m_id, WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), SND(CAMPINGRIFLE_FIRE));
 }
 
 void W_Rifle_Attack2(void)
 {
-       W_Rifle_FireBullet(WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, solidpenetration), WEP_CVAR_SEC(rifle, ammo), WEP_RIFLE.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), W_Sound("campingrifle_fire2"));
+       W_Rifle_FireBullet(WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, solidpenetration), WEP_CVAR_SEC(rifle, ammo), WEP_RIFLE.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), SND(CAMPINGRIFLE_FIRE2));
 }
 
 .void(void) rifle_bullethail_attackfunc;
@@ -204,8 +204,6 @@ bool W_Rifle(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("campingrifle_fire"));
-                       precache_sound(W_Sound("campingrifle_fire2"));
                        RIFLE_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -233,7 +231,7 @@ bool W_Rifle(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(rifle, ammo), WEP_CVAR_SEC(rifle, ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR_PRI(rifle, ammo), WEP_CVAR_SEC(rifle, ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -274,20 +272,17 @@ bool W_Rifle(int req)
                        if(!w_issilent)
                        {
                                if(w_random < 0.2)
-                                       sound(self, CH_SHOTS, W_Sound("ric1"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTN_NORM);
                                else if(w_random < 0.4)
-                                       sound(self, CH_SHOTS, W_Sound("ric2"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC2, VOL_BASE, ATTN_NORM);
                                else if(w_random < 0.5)
-                                       sound(self, CH_SHOTS, W_Sound("ric3"), VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC3, VOL_BASE, ATTN_NORM);
                        }
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("ric1"));
-                       precache_sound(W_Sound("ric2"));
-                       precache_sound(W_Sound("ric3"));
                        if(autocvar_cl_reticle && autocvar_cl_reticle_weapon)
                        {
                                precache_pic("gfx/reticle_nex");
index 51c0404405eef0a110ffc40376189f11dc848808..4286ce433746a366bc78cebda4f4ffc43d7c2113 100644 (file)
@@ -45,7 +45,7 @@ RPC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_rpc() { weapon_defaultspawnfunc(WEP_RPC.m_id); }
+spawnfunc(weapon_rpc) { weapon_defaultspawnfunc(WEP_RPC.m_id); }
 
 void W_RocketPropelledChainsaw_Explode()
 {SELFPARAM();
@@ -108,7 +108,7 @@ void W_RocketPropelledChainsaw_Attack (void)
        entity flash = spawn ();
 
        W_DecreaseAmmo(WEP_CVAR(rpc, ammo));
-       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', false, 5, W_Sound("rocket_fire"), CH_WEAPON_A, WEP_CVAR(rpc, damage));
+       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', false, 5, SND(ROCKET_FIRE), CH_WEAPON_A, WEP_CVAR(rpc, damage));
        Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
        PROJECTILE_MAKETRIGGER(missile);
 
@@ -182,7 +182,6 @@ bool W_RocketPropelledChainsaw(int req)
                }
                case WR_INIT:
                {
-                       precache_sound (W_Sound("rocket_fire"));
                        RPC_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -203,7 +202,7 @@ bool W_RocketPropelledChainsaw(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(WEP_CVAR(rpc, ammo), W_Sound("reload"));
+                       W_Reload(WEP_CVAR(rpc, ammo), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -239,13 +238,12 @@ bool W_RocketPropelledChainsaw(int req)
                        org2 = w_org + w_backoff * 12;
                        pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                               sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("rocket_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 0687437afb10ad9e685c1a280d9f59c4a3a33073..1686ff5290fec13b21f13b7c773a598ca75a15d5 100644 (file)
@@ -84,7 +84,7 @@ SEEKER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_seeker(void) { weapon_defaultspawnfunc(WEP_SEEKER.m_id); }
+spawnfunc(weapon_seeker) { weapon_defaultspawnfunc(WEP_SEEKER.m_id); }
 
 // ============================
 // Begin: Missile functions, these are general functions to be manipulated by other code
@@ -250,7 +250,7 @@ void W_Seeker_Fire_Missile(vector f_diff, entity m_target)
        W_DecreaseAmmo(WEP_CVAR(seeker, missile_ammo));
 
        makevectors(self.v_angle);
-       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, W_Sound("seeker_fire"), CH_WEAPON_A, 0);
+       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, SND(SEEKER_FIRE), CH_WEAPON_A, 0);
        w_shotorg += f_diff;
        Send_Effect(EFFECT_SEEKER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
@@ -341,7 +341,7 @@ void W_Seeker_Fire_Flac(void)
                        f_diff = '+1.25 +3.75 0';
                        break;
        }
-       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, W_Sound("flac_fire"), CH_WEAPON_A, WEP_CVAR(seeker, flac_damage));
+       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, SND(FLAC_FIRE), CH_WEAPON_A, WEP_CVAR(seeker, flac_damage));
        w_shotorg += f_diff;
 
        Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
@@ -559,7 +559,7 @@ void W_Seeker_Fire_Tag(void)
        entity missile;
        W_DecreaseAmmo(WEP_CVAR(seeker, tag_ammo));
 
-       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, W_Sound("tag_fire"), CH_WEAPON_A, WEP_CVAR(seeker, missile_damage) * WEP_CVAR(seeker, missile_count));
+       W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, SND(TAG_FIRE), CH_WEAPON_A, WEP_CVAR(seeker, missile_damage) * WEP_CVAR(seeker, missile_count));
 
        missile                 = spawn();
        missile.owner           = missile.realowner = self;
@@ -662,9 +662,6 @@ bool W_Seeker(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("tag_fire"));
-                       precache_sound(W_Sound("flac_fire"));
-                       precache_sound(W_Sound("seeker_fire"));
                        SEEKER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -703,7 +700,7 @@ bool W_Seeker(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -735,7 +732,7 @@ bool W_Seeker(int req)
                                if(w_deathtype & HITTYPE_SECONDARY)
                                {
                                        if(!w_issilent)
-                                               sound(self, CH_SHOTS, W_Sound("tag_impact"), 1, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_TAG_IMPACT, 1, ATTEN_NORM);
                                }
                                else
                                {
@@ -743,11 +740,11 @@ bool W_Seeker(int req)
                                        if(!w_issilent)
                                        {
                                                if(w_random<0.15)
-                                                       sound(self, CH_SHOTS, W_Sound("tagexp1"), 1, ATTEN_NORM);
+                                                       sound(self, CH_SHOTS, SND_TAGEXP1, 1, ATTEN_NORM);
                                                else if(w_random<0.7)
-                                                       sound(self, CH_SHOTS, W_Sound("tagexp2"), 1, ATTEN_NORM);
+                                                       sound(self, CH_SHOTS, SND_TAGEXP2, 1, ATTEN_NORM);
                                                else
-                                                       sound(self, CH_SHOTS, W_Sound("tagexp3"), 1, ATTEN_NORM);
+                                                       sound(self, CH_SHOTS, SND_TAGEXP3, 1, ATTEN_NORM);
                                        }
                                }
                        }
@@ -757,24 +754,17 @@ bool W_Seeker(int req)
                                if(!w_issilent)
                                {
                                        if(w_random<0.15)
-                                               sound(self, CH_SHOTS, W_Sound("seekerexp1"), 1, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_SEEKEREXP1, 1, ATTEN_NORM);
                                        else if(w_random<0.7)
-                                               sound(self, CH_SHOTS, W_Sound("seekerexp2"), 1, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_SEEKEREXP2, 1, ATTEN_NORM);
                                        else
-                                               sound(self, CH_SHOTS, W_Sound("seekerexp3"), 1, ATTEN_NORM);
+                                               sound(self, CH_SHOTS, SND_SEEKEREXP3, 1, ATTEN_NORM);
                                }
                        }
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("seekerexp1"));
-                       precache_sound(W_Sound("seekerexp2"));
-                       precache_sound(W_Sound("seekerexp3"));
-                       precache_sound(W_Sound("tagexp1"));
-                       precache_sound(W_Sound("tagexp2"));
-                       precache_sound(W_Sound("tagexp3"));
-                       precache_sound(W_Sound("tag_impact"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index b56a41fbbf25151c3275b9c6b5d80383f3367ac7..a067110b7285af22ea359248ab43981093786834 100644 (file)
@@ -82,8 +82,8 @@ void Net_ReadShockwaveParticle(void);
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_shockwave(void)
-{SELFPARAM();
+spawnfunc(weapon_shockwave)
+{
        //if(autocvar_sv_q3acompat_machineshockwaveswap) // WEAPONTODO
        if(autocvar_sv_q3acompat_machineshotgunswap)
        if(self.classname != "droppedweapon")
@@ -229,7 +229,7 @@ void W_Shockwave_Melee_Think(void)
 
 void W_Shockwave_Melee(void)
 {SELFPARAM();
-       sound(self, CH_WEAPON_A, W_Sound("shotgun_melee"), VOL_BASE, ATTN_NORM);
+       sound(self, CH_WEAPON_A, SND_SHOTGUN_MELEE, VOL_BASE, ATTN_NORM);
        weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(shockwave, melee_animtime), w_ready);
 
        entity meleetemp;
@@ -360,7 +360,7 @@ void W_Shockwave_Attack(void)
        float i, queue = 0;
 
        // set up the shot direction
-       W_SetupShot(self, false, 3, W_Sound("lasergun_fire"), CH_WEAPON_B, WEP_CVAR(shockwave, blast_damage));
+       W_SetupShot(self, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_B, WEP_CVAR(shockwave, blast_damage));
        vector attack_endpos = (w_shotorg + (w_shotdir * WEP_CVAR(shockwave, blast_distance)));
        WarpZone_TraceLine(w_shotorg, attack_endpos, MOVE_NOMONSTERS, self);
        vector attack_hitpos = trace_endpos;
@@ -708,9 +708,6 @@ bool W_Shockwave(int req)
                }
                case WR_INIT:
                {
-                       precache_sound("misc/itempickup.wav");
-                       precache_sound(W_Sound("lasergun_fire"));
-                       precache_sound(W_Sound("shotgun_melee"));
                        SHOCKWAVE_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -875,9 +872,6 @@ bool W_Shockwave(int req)
                }
                case WR_INIT:
                {
-                       //precache_sound(W_Sound("ric1"));
-                       //precache_sound(W_Sound("ric2"));
-                       //precache_sound(W_Sound("ric3"));
                        return false;
                }
                case WR_ZOOMRETICLE:
index 814d5730368d3ec40c1bb3c405efee9a492d001e..05f4cf6ab0bec6d3cdf88b381714882cfbc382b8 100644 (file)
@@ -52,7 +52,7 @@ SHOTGUN_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_shotgun(void) { weapon_defaultspawnfunc(WEP_SHOTGUN.m_id); }
+spawnfunc(weapon_shotgun) { weapon_defaultspawnfunc(WEP_SHOTGUN.m_id); }
 
 void W_Shotgun_Attack(float isprimary)
 {SELFPARAM();
@@ -61,7 +61,7 @@ void W_Shotgun_Attack(float isprimary)
 
        W_DecreaseAmmo(WEP_CVAR_PRI(shotgun, ammo));
 
-       W_SetupShot(self, true, 5, W_Sound("shotgun_fire"), ((isprimary) ? CH_WEAPON_A : CH_WEAPON_SINGLE), WEP_CVAR_PRI(shotgun, damage) * WEP_CVAR_PRI(shotgun, bullets));
+       W_SetupShot(self, true, 5, SND(SHOTGUN_FIRE), ((isprimary) ? CH_WEAPON_A : CH_WEAPON_SINGLE), WEP_CVAR_PRI(shotgun, damage) * WEP_CVAR_PRI(shotgun, bullets));
        for(sc = 0;sc < WEP_CVAR_PRI(shotgun, bullets);sc = sc + 1)
                fireBullet(w_shotorg, w_shotdir, WEP_CVAR_PRI(shotgun, spread), WEP_CVAR_PRI(shotgun, solidpenetration), WEP_CVAR_PRI(shotgun, damage), WEP_CVAR_PRI(shotgun, force), WEP_SHOTGUN.m_id, 0);
 
@@ -181,7 +181,7 @@ void W_Shotgun_Melee_Think(void)
 
 void W_Shotgun_Attack2(void)
 {SELFPARAM();
-       sound(self, CH_WEAPON_A, W_Sound("shotgun_melee"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_WEAPON_A, SND_SHOTGUN_MELEE, VOL_BASE, ATTEN_NORM);
        weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(shotgun, animtime), w_ready);
 
        entity meleetemp;
@@ -203,7 +203,7 @@ void W_Shotgun_Attack3_Frame2()
                return;
        }
 
-       sound(self, CH_WEAPON_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM); // kill previous sound
+       sound(self, CH_WEAPON_SINGLE, SND_Null, VOL_BASE, ATTN_NORM); // kill previous sound
        W_Shotgun_Attack(true); // actually is secondary, but we trick the last shot into playing full reload sound
        weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_SEC(shotgun, alt_animtime), w_ready);
 }
@@ -286,9 +286,6 @@ float W_Shotgun(float req)
                }
                case WR_INIT:
                {
-                       precache_sound("misc/itempickup.wav");
-                       precache_sound(W_Sound("shotgun_fire"));
-                       precache_sound(W_Sound("shotgun_melee"));
                        SHOTGUN_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -327,7 +324,7 @@ float W_Shotgun(float req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(WEP_CVAR_PRI(shotgun, ammo), W_Sound("reload")); // WEAPONTODO
+                       W_Reload(WEP_CVAR_PRI(shotgun, ammo), SND(RELOAD)); // WEAPONTODO
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -359,11 +356,11 @@ float W_Shotgun(float req)
                        if(!w_issilent && time - self.prevric > 0.25)
                        {
                                if(w_random < 0.0165)
-                                       sound(self, CH_SHOTS, W_Sound("ric1"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTEN_NORM);
                                else if(w_random < 0.033)
-                                       sound(self, CH_SHOTS, W_Sound("ric2"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC2, VOL_BASE, ATTEN_NORM);
                                else if(w_random < 0.05)
-                                       sound(self, CH_SHOTS, W_Sound("ric3"), VOL_BASE, ATTEN_NORM);
+                                       sound(self, CH_SHOTS, SND_RIC3, VOL_BASE, ATTEN_NORM);
                                self.prevric = time;
                        }
 
@@ -371,9 +368,6 @@ float W_Shotgun(float req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("ric1"));
-                       precache_sound(W_Sound("ric2"));
-                       precache_sound(W_Sound("ric3"));
                        return true;
                }
                case WR_ZOOMRETICLE:
index 20100bf39f0db4694419540ce41262f82fc9ae7c..6d1cf3a6f043562c888e3cb9da1213b5257ff787 100644 (file)
@@ -54,7 +54,7 @@ float W_Tuba_MarkClientOnlyFieldsAsUsed() {
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_tuba(void) { weapon_defaultspawnfunc(WEP_TUBA.m_id); }
+spawnfunc(weapon_tuba) { weapon_defaultspawnfunc(WEP_TUBA.m_id); }
 
 bool W_Tuba_HasPlayed(entity pl, string melody, int instrument, bool ignorepitch, float mintempo, float maxtempo)
 {
index 13c3fef8c691c228a1d55cbc5e6784df94d157b4..8cdeb61accad228365716bf78c1f03baafaa1111 100644 (file)
@@ -55,8 +55,8 @@ VAPORIZER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_vaporizer(void) { weapon_defaultspawnfunc(WEP_VAPORIZER.m_id); }
-void spawnfunc_weapon_minstanex(void) { spawnfunc_weapon_vaporizer(); }
+spawnfunc(weapon_vaporizer) { weapon_defaultspawnfunc(WEP_VAPORIZER.m_id); }
+spawnfunc(weapon_minstanex) { spawnfunc_weapon_vaporizer(this); }
 
 void W_RocketMinsta_Explosion(vector loc)
 {SELFPARAM();
@@ -77,7 +77,7 @@ void W_Vaporizer_Attack(void)
        W_SetupShot(self, true, 0, "", CH_WEAPON_A, vaporizer_damage);
        // handle sound separately so we can change the volume
        // added bonus: no longer plays the strength sound (strength gives no bonus to instakill anyway)
-       sound (self, CH_WEAPON_A, W_Sound("minstanexfire"), VOL_BASE * 0.8, ATTEN_NORM);
+       sound (self, CH_WEAPON_A, SND_MINSTANEXFIRE, VOL_BASE * 0.8, ATTEN_NORM);
 
        yoda = 0;
        damage_goodhits = 0;
@@ -96,41 +96,8 @@ void W_Vaporizer_Attack(void)
        Send_Effect(EFFECT_VORTEX_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
        // teamcolor / hit beam effect
-       vector v;
-       v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-       switch(self.team)
-       {
-               case NUM_TEAM_1:   // Red
-                       if(damage_goodhits)
-                               Send_Effect(EFFECT_VAPORIZER_RED_HIT, w_shotorg, v, 1);
-                       else
-                               Send_Effect(EFFECT_VAPORIZER_RED, w_shotorg, v, 1);
-                       break;
-               case NUM_TEAM_2:   // Blue
-                       if(damage_goodhits)
-                               Send_Effect(EFFECT_VAPORIZER_BLUE_HIT, w_shotorg, v, 1);
-                       else
-                               Send_Effect(EFFECT_VAPORIZER_BLUE, w_shotorg, v, 1);
-                       break;
-               case NUM_TEAM_3:   // Yellow
-                       if(damage_goodhits)
-                               Send_Effect(EFFECT_VAPORIZER_YELLOW_HIT, w_shotorg, v, 1);
-                       else
-                               Send_Effect(EFFECT_VAPORIZER_YELLOW, w_shotorg, v, 1);
-                       break;
-               case NUM_TEAM_4:   // Pink
-                       if(damage_goodhits)
-                               Send_Effect(EFFECT_VAPORIZER_PINK_HIT, w_shotorg, v, 1);
-                       else
-                               Send_Effect(EFFECT_VAPORIZER_PINK, w_shotorg, v, 1);
-                       break;
-               default:
-                       if(damage_goodhits)
-                               Send_Effect_("TE_TEI_G3_HIT", w_shotorg, v, 1);
-                       else
-                               Send_Effect_("TE_TEI_G3", w_shotorg, v, 1);
-                       break;
-       }
+       vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+       Send_Effect((damage_goodhits ? EFFECT_VAPORIZER_HIT(self.team) : EFFECT_VAPORIZER(self.team)), w_shotorg, v, 1);
 
        if(autocvar_g_rm)
        if(!(trace_dphitq3surfaceflags & (Q3SURFACEFLAG_SKY | Q3SURFACEFLAG_NOIMPACT)))
@@ -174,7 +141,7 @@ void W_RocketMinsta_Attack2(void)
 
        float w = self.weapon;
        self.weapon = WEP_ELECTRO.m_id;
-       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', false, 2, W_Sound("crylink_fire"), CH_WEAPON_A, autocvar_g_rm_laser_damage);
+       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', false, 2, SND(CRYLINK_FIRE), CH_WEAPON_A, autocvar_g_rm_laser_damage);
        self.weapon = w;
 
        Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
@@ -227,7 +194,7 @@ void W_RocketMinsta_Attack3 (void)
 
        int w = self.weapon;
        self.weapon = WEP_ELECTRO.m_id;
-       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', false, 2, W_Sound("electro_fire2"), CH_WEAPON_A, autocvar_g_rm_laser_damage);
+       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', false, 2, SND(ELECTRO_FIRE2), CH_WEAPON_A, autocvar_g_rm_laser_damage);
        self.weapon = w;
 
        Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
@@ -362,10 +329,6 @@ float W_Vaporizer(float req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("minstanexfire"));
-                       precache_sound(W_Sound("nexwhoosh1"));
-                       precache_sound(W_Sound("nexwhoosh2"));
-                       precache_sound(W_Sound("nexwhoosh3"));
                        //W_Blaster(WR_INIT); // Samual: Is this really the proper thing to do? Didn't we already run this previously?
                        VAPORIZER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
@@ -408,7 +371,7 @@ float W_Vaporizer(float req)
                        else
                                used_ammo = vaporizer_ammo;
 
-                       W_Reload(used_ammo, W_Sound("reload"));
+                       W_Reload(used_ammo, SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -434,19 +397,17 @@ float W_Vaporizer(float req)
                        if(w_deathtype & HITTYPE_SECONDARY)
                        {
                                pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), org2, w_backoff * 1000, 1);
-                               if(!w_issilent) { sound(self, CH_SHOTS, W_Sound("laserimpact"), VOL_BASE, ATTN_NORM); }
+                               if(!w_issilent) { sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
                        }
                        else
                        {
                                pointparticles(particleeffectnum(EFFECT_VORTEX_IMPACT), org2, '0 0 0', 1);
-                               if(!w_issilent) { sound(self, CH_SHOTS, W_Sound("neximpact"), VOL_BASE, ATTN_NORM); }
+                               if(!w_issilent) { sound(self, CH_SHOTS, SND_NEXIMPACT, VOL_BASE, ATTN_NORM); }
                        }
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("laserimpact"));
-                       precache_sound(W_Sound("neximpact"));
                        if(autocvar_cl_reticle && autocvar_cl_reticle_weapon)
                        {
                                precache_pic("gfx/reticle_nex");
index 2e515137c59ab5ff64eacf07775c3b4465469f0d..8238ac22c83d87b9e7ab70242921185753bbe5bd 100644 (file)
@@ -59,8 +59,8 @@ VORTEX_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 #endif
 #ifdef IMPLEMENTATION
 #ifdef SVQC
-void spawnfunc_weapon_vortex(void) { weapon_defaultspawnfunc(WEP_VORTEX.m_id); }
-void spawnfunc_weapon_nex(void) { spawnfunc_weapon_vortex(); }
+spawnfunc(weapon_vortex) { weapon_defaultspawnfunc(WEP_VORTEX.m_id); }
+spawnfunc(weapon_nex) { spawnfunc_weapon_vortex(this); }
 
 void SendCSQCVortexBeamParticle(float charge) {
        vector v;
@@ -103,10 +103,10 @@ void W_Vortex_Attack(float issecondary)
        mydmg *= charge;
        myforce *= charge;
 
-       W_SetupShot(self, true, 5, W_Sound("nexfire"), CH_WEAPON_A, mydmg);
+       W_SetupShot(self, true, 5, SND(NEXFIRE), CH_WEAPON_A, mydmg);
        if(charge > WEP_CVAR(vortex, charge_animlimit) && WEP_CVAR(vortex, charge_animlimit)) // if the Vortex is overcharged, we play an extra sound
        {
-               sound(self, CH_WEAPON_B, W_Sound("nexcharge"), VOL_BASE * (charge - 0.5 * WEP_CVAR(vortex, charge_animlimit)) / (1 - 0.5 * WEP_CVAR(vortex, charge_animlimit)), ATTN_NORM);
+               sound(self, CH_WEAPON_B, SND_NEXCHARGE, VOL_BASE * (charge - 0.5 * WEP_CVAR(vortex, charge_animlimit)) / (1 - 0.5 * WEP_CVAR(vortex, charge_animlimit)), ATTN_NORM);
        }
 
        yoda = 0;
@@ -129,7 +129,7 @@ void W_Vortex_Attack(float issecondary)
        W_DecreaseAmmo(myammo);
 }
 
-void spawnfunc_weapon_vortex(void); // defined in t_items.qc
+spawnfunc(weapon_vortex); // defined in t_items.qc
 
 .float vortex_chargepool_pauseregen_finished;
 bool W_Vortex(int req)
@@ -253,11 +253,6 @@ bool W_Vortex(int req)
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("nexfire"));
-                       precache_sound(W_Sound("nexcharge"));
-                       precache_sound(W_Sound("nexwhoosh1"));
-                       precache_sound(W_Sound("nexwhoosh2"));
-                       precache_sound(W_Sound("nexwhoosh3"));
                        VORTEX_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP);
                        return true;
                }
@@ -298,7 +293,7 @@ bool W_Vortex(int req)
                }
                case WR_RELOAD:
                {
-                       W_Reload(min(WEP_CVAR_PRI(vortex, ammo), WEP_CVAR_SEC(vortex, ammo)), W_Sound("reload"));
+                       W_Reload(min(WEP_CVAR_PRI(vortex, ammo), WEP_CVAR_SEC(vortex, ammo)), SND(RELOAD));
                        return true;
                }
                case WR_SUICIDEMESSAGE:
@@ -325,13 +320,12 @@ bool W_Vortex(int req)
                        org2 = w_org + w_backoff * 6;
                        pointparticles(particleeffectnum(EFFECT_VORTEX_IMPACT), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CH_SHOTS, W_Sound("neximpact"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, SND_NEXIMPACT, VOL_BASE, ATTN_NORM);
 
                        return true;
                }
                case WR_INIT:
                {
-                       precache_sound(W_Sound("neximpact"));
                        if(autocvar_cl_reticle && autocvar_cl_reticle_weapon)
                        {
                                precache_pic("gfx/reticle_nex");
index 668e7decd68e489db7a318ca9a09d2009fab3736..e7ee2746f553f5e06dbec8c491ca1982ad0e479c 100644 (file)
@@ -7,6 +7,7 @@
 #include "cvar.qh"
 #include "defer.qh"
 #include "draw.qh"
+#include "file.qh"
 #include "i18n.qh"
 #include "lazy.qh"
 #include "log.qh"
@@ -21,6 +22,7 @@
 #include "registry.qh"
 #include "replicate.qh"
 #include "sortlist.qc"
+#include "spawnfunc.qh"
 #include "static.qh"
 #include "string.qh"
 #include "struct.qh"
diff --git a/qcsrc/lib/file.qh b/qcsrc/lib/file.qh
new file mode 100644 (file)
index 0000000..f732bfe
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef FILE_H
+#define FILE_H
+
+bool fexists(string f)
+{
+    int fh = fopen(f, FILE_READ);
+    if (fh < 0)
+        return false;
+    fclose(fh);
+    return true;
+}
+
+#endif
index f74dd4aa2ed49a252583d4a9a4fc42c5471819ac..3d186e38945ea267fe4fac3456aa1f3c690eb6de 100644 (file)
@@ -59,4 +59,6 @@ noref bool autocvar_prvm_backtraceforwarnings;
     cvar_set("prvm_backtraceforwarnings", ftos(war)); \
 } while (0)
 
+#define ASSERT(expr) do { if (!(expr)) LOG_FATAL("assertion failed: " #expr "\n"); } while (0)
+
 #endif
index d9317e8cbf748754775f0cbd9320fffd890b60b5..c751fc79346b7fbb5688287cd119693b6bbdc356 100644 (file)
@@ -6,6 +6,29 @@
 #define REGISTER_INIT(ns, id) [[accumulate]] void Register_##ns##_##id##_init(entity this)
 #define REGISTER_INIT_POST(ns, id) [[accumulate]] void Register_##ns##_##id##_init_post(entity this)
 
+/**
+ * Register a new entity with a global constructor.
+ * Must be followed by a semicolon or a function body with a `this` parameter.
+ * Wrapper macros may perform actions after user initialization like so:
+ *     #define REGISTER_FOO(id) \
+ *         REGISTER(RegisterFoos, FOO, FOOS, FOOS_COUNT, id, m_id, NEW(Foo)); \
+ *         REGISTER_INIT_POST(FOO, id) { \
+ *             print("Registering foo #", this.m_id + 1, "\n"); \
+ *         } \
+ *         REGISTER_INIT(FOO, id)
+ *
+ * Don't forget to forward declare `initfunc` and call `REGISTER_REGISTRY`:
+ *     void RegisterFoos();
+ *     REGISTER_REGISTRY(RegisterFoos)
+ *
+ * @param initfunc  The global constructor to accumulate into
+ * @param ns        Short for namespace, prefix for each global (ns##_##id)
+ * @param array     The array to add each entity to. Also requires `array##_first` and `array##_last` to be defined
+ * @param counter   Global to count number of entries
+ * @param id        The identifier of the current entity being registered
+ * @param fld       The field to store the current count into
+ * @param inst      An expression to create a new instance, invoked for every registration
+ */
 #define REGISTER(initfunc, ns, array, counter, id, fld, inst)   \
     entity ns##_##id;                                           \
     REGISTER_INIT(ns, id) { }                                   \
diff --git a/qcsrc/lib/spawnfunc.qh b/qcsrc/lib/spawnfunc.qh
new file mode 100644 (file)
index 0000000..1ab059c
--- /dev/null
@@ -0,0 +1,167 @@
+#ifndef SPAWNFUNC_H
+#define SPAWNFUNC_H
+
+/** If this global exists, only functions with spawnfunc_ name prefix qualify as spawn functions */
+noref bool require_spawnfunc_prefix;
+.bool spawnfunc_checked;
+
+// Optional type checking; increases compile time too much to be enabled by default
+#if 0
+bool entityfieldassignablefromeditor(int i) {
+    switch (entityfieldtype(i)) {
+        case FIELD_STRING:
+        case FIELD_FLOAT:
+        case FIELD_VECTOR:
+            return true;
+    }
+    return false;
+}
+
+#define _spawnfunc_checktypes(fld) if (fieldname == #fld) \
+    if (!entityfieldassignablefromeditor(i)) LOG_FATALF("Entity field '%s' cannot be whitelisted\n", fieldname);
+#else
+#define _spawnfunc_checktypes(fld)
+#endif
+#define _spawnfunc_check(fld) if (fieldname == #fld) \
+    continue;
+
+#define spawnfunc_1(id, whitelist) spawnfunc_2(id, whitelist)
+#define spawnfunc_2(id, whitelist) void spawnfunc_##id(entity this) { \
+    this = self; \
+    if (!this.spawnfunc_checked) { \
+        for (int i = 0, n = numentityfields(); i < n; ++i) { \
+            string value = getentityfieldstring(i, this); \
+            string fieldname = entityfieldname(i); \
+            whitelist(_spawnfunc_checktypes) \
+            if (value == "") continue; \
+            if (fieldname == "") continue; \
+            FIELDS_COMMON(_spawnfunc_check) \
+            whitelist(_spawnfunc_check) \
+            LOG_WARNINGF(_("Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, please file an issue.\n"), #id, fieldname, value); \
+        } \
+        this.spawnfunc_checked = true; \
+    } \
+} \
+[[accumulate]] void spawnfunc_##id(entity this)
+
+#define FIELD_SCALAR(fld, n) \
+    fld(n)
+#define FIELD_VEC(fld, n) \
+    fld(n) \
+    fld(n##_x) \
+    fld(n##_y) \
+    fld(n##_z)
+
+#define FIELDS_NONE(fld)
+#define FIELDS_ALL(fld) if (false)
+
+#define FIELDS_COMMON(fld) \
+    FIELD_SCALAR(fld, classname) \
+    FIELD_SCALAR(fld, spawnfunc_checked) \
+    /**/
+
+#define FIELDS_UNION(fld) \
+    FIELD_SCALAR(fld, Version) \
+    FIELD_SCALAR(fld, ammo_cells) \
+    FIELD_SCALAR(fld, ammo_nails) \
+    FIELD_SCALAR(fld, ammo_rockets) \
+    FIELD_SCALAR(fld, armorvalue) \
+    FIELD_SCALAR(fld, atten) \
+    FIELD_SCALAR(fld, bgmscriptdecay) \
+    FIELD_SCALAR(fld, bgmscriptsustain) \
+    FIELD_SCALAR(fld, bgmscript) \
+    FIELD_SCALAR(fld, button0) \
+    FIELD_SCALAR(fld, cnt) \
+    FIELD_SCALAR(fld, colormap) \
+    FIELD_SCALAR(fld, count) \
+    FIELD_SCALAR(fld, curvetarget) \
+    FIELD_SCALAR(fld, cvarfilter) \
+    FIELD_SCALAR(fld, debrisdamageforcescale) \
+    FIELD_SCALAR(fld, debrisfadetime) \
+    FIELD_SCALAR(fld, debristimejitter) \
+    FIELD_SCALAR(fld, debristime) \
+    FIELD_SCALAR(fld, debris) \
+    FIELD_SCALAR(fld, delay) \
+    FIELD_SCALAR(fld, dmgtime) \
+    FIELD_SCALAR(fld, dmg) \
+    FIELD_SCALAR(fld, dmg_edge) \
+    FIELD_SCALAR(fld, dmg_force) \
+    FIELD_SCALAR(fld, dmg_radius) \
+    FIELD_SCALAR(fld, effects) \
+    FIELD_SCALAR(fld, flags) \
+    FIELD_SCALAR(fld, fog) \
+    FIELD_SCALAR(fld, frags) \
+    FIELD_SCALAR(fld, frame) \
+    FIELD_SCALAR(fld, gametypefilter) \
+    FIELD_SCALAR(fld, geomtype) \
+    FIELD_SCALAR(fld, gravity) \
+    FIELD_SCALAR(fld, health) \
+    FIELD_SCALAR(fld, height) \
+    FIELD_SCALAR(fld, impulse) \
+    FIELD_SCALAR(fld, killtarget) \
+    FIELD_SCALAR(fld, lerpfrac) \
+    FIELD_SCALAR(fld, light_lev) \
+    FIELD_SCALAR(fld, lip) \
+    FIELD_SCALAR(fld, loddistance1) \
+    FIELD_SCALAR(fld, lodmodel1) \
+    FIELD_SCALAR(fld, ltime) \
+    FIELD_SCALAR(fld, mdl) \
+    FIELD_SCALAR(fld, message2) \
+    FIELD_SCALAR(fld, message) \
+    FIELD_SCALAR(fld, modelindex) \
+    FIELD_SCALAR(fld, modelscale) \
+    FIELD_SCALAR(fld, model) \
+    FIELD_SCALAR(fld, monster_moveflags) \
+    FIELD_SCALAR(fld, movetype) \
+    FIELD_SCALAR(fld, netname) \
+    FIELD_SCALAR(fld, nextthink) \
+    FIELD_SCALAR(fld, noalign) \
+    FIELD_SCALAR(fld, noise1) \
+    FIELD_SCALAR(fld, noise2) \
+    FIELD_SCALAR(fld, noise) \
+    FIELD_SCALAR(fld, phase) \
+    FIELD_SCALAR(fld, platmovetype) \
+    FIELD_SCALAR(fld, race_place) \
+    FIELD_SCALAR(fld, radius) \
+    FIELD_SCALAR(fld, respawntimejitter) \
+    FIELD_SCALAR(fld, respawntime) \
+    FIELD_SCALAR(fld, restriction) \
+    FIELD_SCALAR(fld, scale) \
+    FIELD_SCALAR(fld, skin) \
+    FIELD_SCALAR(fld, solid) \
+    FIELD_SCALAR(fld, sound1) \
+    FIELD_SCALAR(fld, sounds) \
+    FIELD_SCALAR(fld, spawnflags) \
+    FIELD_SCALAR(fld, speed) \
+    FIELD_SCALAR(fld, strength) \
+    FIELD_SCALAR(fld, target2) \
+    FIELD_SCALAR(fld, target3) \
+    FIELD_SCALAR(fld, target4) \
+    FIELD_SCALAR(fld, targetname) \
+    FIELD_SCALAR(fld, target) \
+    FIELD_SCALAR(fld, target_random) \
+    FIELD_SCALAR(fld, target_range) \
+    FIELD_SCALAR(fld, team) \
+    FIELD_SCALAR(fld, turret_scale_health) \
+    FIELD_SCALAR(fld, turret_scale_range) \
+    FIELD_SCALAR(fld, turret_scale_respawn) \
+    FIELD_SCALAR(fld, volume) \
+    FIELD_SCALAR(fld, wait) \
+    FIELD_SCALAR(fld, warpzone_fadeend) \
+    FIELD_SCALAR(fld, warpzone_fadestart) \
+    FIELD_SCALAR(fld, weapon) \
+    FIELD_VEC(fld, absmax) \
+    FIELD_VEC(fld, absmin) \
+    FIELD_VEC(fld, angles) \
+    FIELD_VEC(fld, avelocity) \
+    FIELD_VEC(fld, maxs) \
+    FIELD_VEC(fld, maxs) \
+    FIELD_VEC(fld, mins) \
+    FIELD_VEC(fld, modelscale_vec) \
+    FIELD_VEC(fld, origin) \
+    FIELD_VEC(fld, velocity) \
+    /**/
+
+#define spawnfunc(...) EVAL(OVERLOAD(spawnfunc, __VA_ARGS__, FIELDS_UNION))
+
+#endif
index d52ae4f719e07b5017216e0251a01a6749b5d9dd..5563b969d98bfb4751e29e661b2c97a6c5248c45 100644 (file)
@@ -4,6 +4,7 @@
 void setterDummy(entity, float);
 CLASS(Animation, Object)
        METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float));
+       METHOD(Animation, update, void(entity, float, float, float));
        METHOD(Animation, setTimeStartEnd, void(entity, float, float));
        METHOD(Animation, setTimeStartDuration, void(entity, float, float));
        METHOD(Animation, setValueStartEnd, void(entity, float, float));
@@ -36,6 +37,12 @@ void Animation_configureAnimation(entity me, entity obj, void(entity, float) obj
        me.setValueStartEnd(me, animStartValue, animEndValue);
 }
 
+void Animation_update(entity me, float animDuration, float animStartValue, float animEndValue)
+{
+       me.setTimeStartDuration(me, time, animDuration);
+       me.setValueStartEnd(me, animStartValue, animEndValue);
+}
+
 void Animation_setTimeStartEnd(entity me, float s, float e)
 {
        me.startTime = s;
index 343bf1d93263403a97ea80bfa0160d8d8e442527..934e8cd3426e0579ff5066fea55349e2c3760dd8 100644 (file)
@@ -44,7 +44,7 @@ void Button_resizeNotify(entity me, vector relOrigin, vector relSize, vector abs
        if(me.srcMulti)
                me.keepspaceLeft = 0;
        else
-               me.keepspaceLeft = min(0.8, absSize.y / absSize.x);
+               me.keepspaceLeft = min(0.8, absSize.x == 0 ? 0 : (absSize.y / absSize.x));
        SUPER(Button).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
 }
 void Button_configureButton(entity me, string txt, float sz, string gfx)
index e02642f69d54da9d134db6acb898c470c87a237f..ea170777eaf7245c26645fcd6c2a3dc8f5ed138e 100644 (file)
@@ -130,8 +130,8 @@ void Label_resizeNotify(entity me, vector relOrigin, vector relSize, vector absO
        SUPER(Label).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
 
        // absSize_y is height of label
-       me.realFontSize_y = me.fontSize / absSize.y;
-       me.realFontSize_x = me.fontSize / absSize.x;
+       me.realFontSize_y = absSize.y == 0 ? 0 : (me.fontSize / absSize.y);
+       me.realFontSize_x = absSize.x == 0 ? 0 : (me.fontSize / absSize.x);
        if(me.marginLeft)
                me.keepspaceLeft = me.marginLeft * me.realFontSize.x;
        if(me.marginRight)
index 4654425431199bb1913b0c4ee54fefeac866f7db..3340e335cb9aebe22d7b305022a52074cd84f123 100644 (file)
@@ -15,6 +15,8 @@ CLASS(Slider, Label)
        METHOD(Slider, mouseRelease, float(entity, vector));
        METHOD(Slider, valueToText, string(entity, float));
        METHOD(Slider, toString, string(entity));
+       METHOD(Slider, setValue_allowAnim, void(entity, float, bool));
+       METHOD(Slider, setValue_noAnim, void(entity, float));
        METHOD(Slider, setValue, void(entity, float));
        METHOD(Slider, setSliderValue, void(entity, float));
        METHOD(Slider, showNotify, void(entity));
@@ -24,6 +26,7 @@ CLASS(Slider, Label)
        ATTRIB(Slider, value, float, 0)
        ATTRIB(Slider, animated, float, 1)
        ATTRIB(Slider, sliderValue, float, 0)
+       ATTRIB(Slider, sliderAnim, entity, world)
        ATTRIB(Slider, valueMin, float, 0)
        ATTRIB(Slider, valueMax, float, 0)
        ATTRIB(Slider, valueStep, float, 0)
@@ -48,16 +51,27 @@ ENDCLASS(Slider)
 #endif
 
 #ifdef IMPLEMENTATION
-void Slider_setValue(entity me, float val)
+void Slider_setValue_allowAnim(entity me, float val, bool allowAnim)
 {
-       if (me.animated) {
-               anim.removeObjAnim(anim, me);
-               makeHostedEasing(me, Slider_setSliderValue, easingQuadInOut, 1, me.sliderValue, val);
+       if(allowAnim && me.animated) {
+               float t = 0.5;
+               if(!me.sliderAnim)
+                       me.sliderAnim = makeHostedEasing(me, Slider_setSliderValue, easingQuadOut, t, me.sliderValue, val);
+               else
+                       me.sliderAnim.update(me.sliderAnim, t, me.sliderValue, val);
        } else {
                me.setSliderValue(me, val);
        }
        me.value = val;
 }
+void Slider_setValue_noAnim(entity me, float val)
+{
+       Slider_setValue_allowAnim(me, val, false);
+}
+void Slider_setValue(entity me, float val)
+{
+       Slider_setValue_allowAnim(me, val, true);
+}
 void Slider_setSliderValue(entity me, float val)
 {
        me.sliderValue = val;
@@ -69,7 +83,7 @@ string Slider_toString(entity me)
 void Slider_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
        SUPER(Slider).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
-       me.controlWidth = absSize.y / absSize.x;
+       me.controlWidth = absSize.x == 0 ? 0 : (absSize.y / absSize.x);
 }
 string Slider_valueToText(entity me, float val)
 {
@@ -177,14 +191,10 @@ float Slider_keyUp(entity me, float key, float ascii, float shift)
 float Slider_mouseDrag(entity me, vector pos)
 {
        float hit;
-       float v, animed;
+       float v;
        if(me.disabled)
                return 0;
 
-       anim.removeObjAnim(anim, me);
-       animed = me.animated;
-       me.animated = false;
-
        if(me.pressed)
        {
                hit = 1;
@@ -194,17 +204,18 @@ float Slider_mouseDrag(entity me, vector pos)
                if(pos.y >= 1 + me.tolerance.y) hit = 0;
                if(hit)
                {
+                       // handle dragging
+                       me.pressed = 2;
+
                        v = median(0, (pos.x - me.pressOffset - 0.5 * me.controlWidth) / (1 - me.textSpace - me.controlWidth), 1) * (me.valueMax - me.valueMin) + me.valueMin;
                        if(me.valueStep)
                                v = floor(0.5 + v / me.valueStep) * me.valueStep;
-                       me.setValue(me, v);
+                       me.setValue_noAnim(me, v);
                }
                else
                        me.setValue(me, me.previousValue);
        }
 
-       me.animated = animed;
-
        return 1;
 }
 float Slider_mousePress(entity me, vector pos)
@@ -295,6 +306,14 @@ void Slider_draw(entity me)
                else
                        draw_Picture(eX * controlLeft, strcat(me.src, "_n"), eX * me.controlWidth + eY, me.color, 1);
        }
+
+       if(me.sliderAnim)
+       if(me.sliderAnim.isFinished(me.sliderAnim))
+       {
+               anim.removeObjAnim(anim, me);
+               me.sliderAnim = world;
+       }
+
        me.setText(me, me.valueToText(me, me.value));
        draw_alpha = save;
        SUPER(Slider).draw(me);
index 733b1d61255e155490021d7e12f6b53c61940acd..30b80c196d96884117def79c2c55496e65f34598 100644 (file)
@@ -6,6 +6,8 @@
 CLASS(TextSlider, Slider)
        METHOD(TextSlider, valueToText, string(entity, float));
        METHOD(TextSlider, valueToIdentifier, string(entity, float));
+       METHOD(TextSlider, setValueFromIdentifier_allowAnim, void(entity, string, bool));
+       METHOD(TextSlider, setValueFromIdentifier_noAnim, void(entity, string));
        METHOD(TextSlider, setValueFromIdentifier, void(entity, string));
        METHOD(TextSlider, getIdentifier, string(entity));
        METHOD(TextSlider, clearValues, void(entity));
@@ -35,16 +37,24 @@ string TextSlider_valueToText(entity me, int val)
                return _("Custom");
        return me.(valueStrings[val]);
 }
-void TextSlider_setValueFromIdentifier(entity me, string id)
+void TextSlider_setValueFromIdentifier_allowAnim(entity me, string id, bool allowAnim)
 {
        int i;
        for(i = 0; i < me.nValues; ++i)
                if(me.valueToIdentifier(me, i) == id)
                {
-                       SUPER(TextSlider).setValue( me, i );
+                       SUPER(TextSlider).setValue_allowAnim(me, i, allowAnim);
                        return;
                }
-       SUPER(TextSlider).setValue( me, -1 );
+       SUPER(TextSlider).setValue_allowAnim(me, -1, allowAnim);
+}
+void TextSlider_setValueFromIdentifier_noAnim(entity me, string id)
+{
+       TextSlider_setValueFromIdentifier_allowAnim(me, id, false);
+}
+void TextSlider_setValueFromIdentifier(entity me, string id)
+{
+       TextSlider_setValueFromIdentifier_allowAnim(me, id, true);
 }
 string TextSlider_getIdentifier(entity me)
 {
@@ -75,6 +85,6 @@ void TextSlider_insertValue(entity me, int pos, string theString, string theIden
 void TextSlider_configureTextSliderValues(entity me, string theDefault)
 {
        me.configureSliderValues(me, 0, 0, me.nValues - 1, 1, 1, 1);
-       me.setValueFromIdentifier(me, theDefault);
+       me.setValueFromIdentifier_noAnim(me, theDefault);
 }
 #endif
index 49cc571761885e394686651985b548d98af1f7c7..57ce0c80c312e73c7826110a6075dc8a6e9b4284 100644 (file)
@@ -12,12 +12,58 @@ CLASS(DataSource, Object)
      * returns `DataSource_false` if out of bounds
      * otherwise returns an entity or `DataSource_true`
      */
-    METHOD(DataSource, getEntry, entity(int i, void(string name, string icon) returns)) { return DataSource_false; }
+    METHOD(DataSource, getEntry, entity(entity this, int i, void(string name, string icon) returns)) { return DataSource_false; }
     /** return the index of the first match for `find`. optional */
-    METHOD(DataSource, indexOf, int(string find)) { return -1; }
+    METHOD(DataSource, indexOf, int(entity this, string find)) { return -1; }
     /** reload all entries matching `filter` returning how many matches were found */
-    METHOD(DataSource, reload, int(string filter)) { return 0; }
+    METHOD(DataSource, reload, int(entity this, string filter)) { return 0; }
     /** cleanup on shutdown. optional */
-    METHOD(DataSource, destroy, void(entity)) { }
+    METHOD(DataSource, destroy, void(entity this)) { }
 ENDCLASS(DataSource)
+
+
+CLASS(StringSource, DataSource)
+    ATTRIB(StringSource, StringSource_str, string, string_null)
+    ATTRIB(StringSource, StringSource_sep, string, string_null)
+    CONSTRUCTOR(StringSource, string str, string sep)
+    {
+        CONSTRUCT(StringSource);
+        this.StringSource_str = str;
+        this.StringSource_sep = sep;
+    }
+    METHOD(StringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
+    {
+        int n = tokenizebyseparator(this.StringSource_str, this.StringSource_sep);
+        if (i < 0 || i >= n) return DataSource_false;
+        string s = argv(i);
+        if (returns) returns(s, string_null);
+        return DataSource_true;
+    }
+    METHOD(StringSource, reload, int(entity this, string filter))
+    {
+        return tokenizebyseparator(this.StringSource_str, this.StringSource_sep);
+    }
+ENDCLASS(StringSource)
+
+CLASS(CvarStringSource, StringSource)
+    ATTRIB(CvarStringSource, CvarStringSource_cvar, string, string_null)
+    CONSTRUCTOR(CvarStringSource, string cv, string sep)
+    {
+        CONSTRUCT(CvarStringSource);
+        this.CvarStringSource_cvar = cv;
+        this.StringSource_sep = sep;
+    }
+    METHOD(CvarStringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
+    {
+        string s = this.CvarStringSource_cvar;
+        this.StringSource_str = s ? cvar_string(s) : string_null;
+        return super.getEntry(this, i, returns);
+    }
+    METHOD(CvarStringSource, reload, int(entity this, string filter))
+    {
+        string s = this.CvarStringSource_cvar;
+        this.StringSource_str = s ? cvar_string(s) : string_null;
+        return super.reload(this, filter);
+    }
+ENDCLASS(CvarStringSource)
 #endif
index 6b9556507441e7a55cce2f05ab69f744a2bc9749..9969a7b212c6f22e652c5a9e60e6bed84e645733 100644 (file)
@@ -27,8 +27,8 @@ void XonoticMonsterToolsDialog_fill(entity me)
                me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "wyvern", _("Wyvern")));
        me.TR(me);
                me.TDempty(me, 0.1);
-               me.TD(me, 1, 0.5, e = makeXonoticCommandButton(_("Spawn"), '0 0 0', "cmd mobspawn $menu_monsters_edit_spawn $menu_monsters_edit_movetarget", 0));
-               me.TD(me, 1, 0.5, e = makeXonoticCommandButton(_("Remove"), '0 0 0', "cmd mobkill", 0));
+               me.TD(me, 1, 0.5, e = makeXonoticCommandButton(_("Spawn"), '0 0 0', "spawnmob $menu_monsters_edit_spawn $menu_monsters_edit_movetarget", 0));
+               me.TD(me, 1, 0.5, e = makeXonoticCommandButton(_("Remove"), '0 0 0', "killmob", 0));
        me.TR(me);
                me.TD(me, 1, 0.5, e = makeXonoticCommandButton(_("Move target:"), '0 0 0', "editmob movetarget $menu_monsters_edit_movetarget", 0));
                me.TD(me, 1, 0.5, e = makeXonoticRadioButton(2, "menu_monsters_edit_movetarget", "1", _("Follow")));
index fc87261a538b736546e2481b29d992d6d3abc2eb..16bc110adb2516d8c80b86aad5a51009e0f7e11d 100644 (file)
@@ -5,14 +5,14 @@
 
 #include "datasource.qc"
 CLASS(SettingSource, DataSource)
-    METHOD(SettingSource, getEntry, entity(int i, void(string name, string icon) returns))
+    METHOD(SettingSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
     {
         Lazy l = SETTINGS[i];
         entity it = l.m_get();
         if (returns) returns(it.title, string_null);
         return it;
     }
-    METHOD(SettingSource, reload, int(string filter)) { return SETTINGS_COUNT; }
+    METHOD(SettingSource, reload, int(entity this, string filter)) { return SETTINGS_COUNT; }
 ENDCLASS(SettingSource)
 
 #include "listbox.qc"
@@ -38,7 +38,7 @@ CLASS(XonoticRegisteredSettingsList, XonoticListBox)
        METHOD(XonoticRegisteredSettingsList, drawListBoxItem, void(entity this, int i, vector absSize, bool isSelected, bool isFocused))
        {
                if (!this.source) return;
-               if (!this.source.getEntry(i, XonoticRegisteredSettingsList_cb)) return;
+               if (!this.source.getEntry(this.source, i, XonoticRegisteredSettingsList_cb)) return;
                string name = XonoticRegisteredSettingsList_cb_name;
                if (isSelected) {
                        draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
@@ -55,7 +55,7 @@ CLASS(XonoticRegisteredSettingsList, XonoticListBox)
                        this.nItems = 0;
                        return;
                }
-               this.nItems = this.source.reload(this.stringFilter);
+               this.nItems = this.source.reload(this.source, this.stringFilter);
        }
        METHOD(XonoticRegisteredSettingsList, resizeNotify, void(entity this, vector relOrigin, vector relSize, vector absOrigin, vector absSize))
        {
@@ -92,7 +92,8 @@ CLASS(XonoticGameSettingsTab, XonoticTab)
        {
                entity c = this.currentPanel;
                entity removing = this.currentItem;
-               entity adding = this.topicList.source.getEntry(this.topicList.selectedItem, func_null);
+               DataSource data = this.topicList.source;
+               entity adding = data.getEntry(data, this.topicList.selectedItem, func_null);
                if (removing == adding) return;
                if (removing) {
                        this.currentItem = NULL;
index 27282207795580b122182c1b38c5c47546594d7f..ceeae22ea060f06fd39b071852cfa2cd4263ff5c 100644 (file)
@@ -41,6 +41,7 @@ entity makeXonoticRadioButton(float theGroup, string theCvar, string theValue, s
 void XonoticRadioButton_configureXonoticRadioButton(entity me, float theGroup, string theCvar, string theValue, string theText, string theTooltip)
 {
        me.cvarName = (theCvar) ? theCvar : string_null;
+       me.cvarValue = theValue;
        me.loadCvars(me);
        setZonedTooltip(me, theTooltip, theCvar);
        me.configureRadioButton(me, theText, me.fontSize, me.image, theGroup, 0);
index ca65c66218b12efe4561f37baa377e85e284edf4..7ecd7a9d0a4e6a03ead4ee4e262ddaea22136813 100644 (file)
@@ -71,7 +71,7 @@ void XonoticSlider_loadCvars(entity me)
        if (!me.cvarName)
                return;
 
-       me.setValue( me, cvar(me.cvarName) );
+       me.setValue_noAnim(me, cvar(me.cvarName));
 }
 void XonoticSlider_saveCvars(entity me)
 {
index c840fb07ef7b3e47a5bb65a20097351dbae5a71f..e577cba66407ce84db002f16a1d7c860e7a7a365 100644 (file)
@@ -62,9 +62,9 @@ void XonoticDecibelsSlider_loadCvars(entity me)
 
        // snapping
        if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep, me.valueMin))
-               Slider_setValue(me, me.valueMax);
+               Slider_setValue_noAnim(me, me.valueMax);
        else
-               Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep) );
+               Slider_setValue_noAnim(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep));
 }
 void XonoticDecibelsSlider_saveCvars(entity me)
 {
index 0b2179d36eeede5497291f0afe6b8de486aed76e..1a7ee2c4a59101b65826e0ef2f1dce73485bc9d5 100644 (file)
@@ -32,7 +32,7 @@ void XonoticParticlesSlider_configureXonoticParticlesSlider(entity me)
 }
 void XonoticParticlesSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, sprintf("%s %s %s",
+       me.setValueFromIdentifier_noAnim(me, sprintf("%s %s %s",
                cvar_string("cl_particles_quality"),
                cvar_string("r_drawparticles_drawdistance"),
                cvar_string("cl_damageeffect")
index 8b91ecb1f3ad6180e7a2f84d9fede431a0e0d73c..c6d95b4304315381f3e3cbc973a572998079d244 100644 (file)
@@ -212,7 +212,7 @@ void XonoticResolutionSlider_loadResolutions(entity me, float fullscreen)
 }
 void XonoticResolutionSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
+       me.setValueFromIdentifier_noAnim(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
 }
 void XonoticResolutionSlider_saveCvars(entity me)
 {
index 5533a2361bf8bd2efc94cc42c4ad939f381b6ebe..ecf850f404f083b3548ed59138d7e34973c9ce80 100644 (file)
@@ -28,7 +28,7 @@ void XonoticScoreboardFadeTimeSlider_configureXonoticScoreboardFadeTimeSlider(en
 }
 void XonoticScoreboardFadeTimeSlider_loadCvars(entity me)
 {
-       me.setValueFromIdentifier(me, sprintf("%s %s",
+       me.setValueFromIdentifier_noAnim(me, sprintf("%s %s",
                cvar_string("scoreboard_fadeinspeed"),
                cvar_string("scoreboard_fadeoutspeed")
        ));
index 597772e340019f4d58077158dc710b619e3b5944..8c4682ee0ffbf9a25d5692bdd18ed1c267014777 100644 (file)
@@ -65,7 +65,7 @@ void XonoticTextSlider_loadCvars(entity me)
        float i;
        for(i = 1; i < n; ++i)
                s = strcat(s, " ", cvar_string(argv(i)));
-       me.setValueFromIdentifier(me, s);
+       me.setValueFromIdentifier_noAnim(me, s);
        if(me.value < 0 && n > 1)
        {
                // if it failed: check if all cvars have the same value
@@ -74,7 +74,7 @@ void XonoticTextSlider_loadCvars(entity me)
                        if(cvar_string(argv(i)) != cvar_string(argv(i-1)))
                                break;
                if(i >= n)
-                       me.setValueFromIdentifier(me, cvar_string(argv(0)));
+                       me.setValueFromIdentifier_noAnim(me, cvar_string(argv(0)));
        }
 }
 void XonoticTextSlider_saveCvars(entity me)
index f874b616b25a8045311c028bf9abde739d1f84e7..1ec7115ef27c503b55cd6c723a2a14e97a77afba 100644 (file)
@@ -4,7 +4,7 @@ string vtos(vector v) = #27;
 void error(string e) = #10;
 float test();
 
-void spawnfunc_worldspawn()
+spawnfunc(worldspawn)
 {
        float r;
        LOG_TRACE("TESTCASE: START\n");
index 9d7617e006f9621665a4f4cb999181b25a7bde1f..d3771bafc88846e6c8982f3f62482c8daf99ad96 100644 (file)
@@ -10,5 +10,6 @@
 #include "../dpdefs/dpextensions.qh"
 
 #include "../common/models/models.qh"
+#include "../common/sounds/sounds.qh"
 
 #endif
index fcf209faca6ddbdb2e7e7ea44c4ee407dea503af..5358b662cf952e75673d8c1d5f083b34644e5662 100644 (file)
@@ -702,6 +702,7 @@ int autocvar_g_monsters_max_perplayer;
 float autocvar_g_monsters_damageforcescale = 0.8;
 float autocvar_g_monsters_target_range;
 bool autocvar_g_monsters_target_infront;
+float autocvar_g_monsters_target_infront_range = 0.3;
 float autocvar_g_monsters_attack_range;
 int autocvar_g_monsters_score_kill;
 int autocvar_g_monsters_score_spawned;
index 7a3ac0561af3c6ec66917479cad1b6a2ab1756de..629009761fbcece18ce7d57a4f2094d6ef842eef 100644 (file)
@@ -856,7 +856,7 @@ void havocbot_movetogoal()
 void havocbot_chooseenemy()
 {SELFPARAM();
        entity head, best, head2;
-       float rating, bestrating, i, hf;
+       float rating, bestrating, hf;
        vector eye, v;
        if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
        {
@@ -908,10 +908,29 @@ void havocbot_chooseenemy()
 
        self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 
-       for(i = 0; ; ++i)
+       bool scan_transparent = false;
+       bool scan_secondary_targets = false;
+       bool have_secondary_targets = false;
+       while(true)
        {
-               while (head)
+               scan_secondary_targets = false;
+               :scan_targets
+               for( ; head; head = head.chain)
                {
+                       if(!scan_secondary_targets)
+                       {
+                               if(head.classname == "misc_breakablemodel")
+                               {
+                                       have_secondary_targets = true;
+                                       continue;
+                               }
+                       }
+                       else
+                       {
+                               if(head.classname != "misc_breakablemodel")
+                                       continue;
+                       }
+
                        v = (head.absmin + head.absmax) * 0.5;
                        rating = vlen(v - eye);
                        if (rating<autocvar_bot_ai_enemydetectionradius)
@@ -925,20 +944,29 @@ void havocbot_chooseenemy()
                                        bestrating = rating;
                                }
                        }
-                       head = head.chain;
+               }
+
+               if(!best && have_secondary_targets && !scan_secondary_targets)
+               {
+                       scan_secondary_targets = true;
+                       // restart the loop
+                       head = head2;
+                       bestrating = 100000000;
+                       goto scan_targets;
                }
 
                // I want to do a second scan if no enemy was found or I don't have weapons
                // TODO: Perform the scan when using the rifle (requires changes on the rifle code)
                if(best || self.weapons) // || self.weapon == WEP_RIFLE.m_id
                        break;
-               if(i)
+               if(scan_transparent)
                        break;
 
                // Set flags to see through transparent objects
                self.dphitcontentsmask |= DPCONTENTS_OPAQUE;
 
                head = head2;
+               scan_transparent = true;
        }
 
        // Restore hit flags
@@ -946,6 +974,8 @@ void havocbot_chooseenemy()
 
        self.enemy = best;
        self.havocbot_stickenemy = true;
+       if(best && best.classname == "misc_breakablemodel")
+               self.havocbot_stickenemy = false;
 }
 
 float havocbot_chooseweapon_checkreload(int new_weapon)
index 46193160da9e1203c42e755814a4a64ce6534d41..72951cd6628b36e574d77b98abac0b2bfd2d6a0b 100644 (file)
@@ -1050,7 +1050,7 @@ float bot_cmd_sound()
                atten = stof(argv(2));
 
        precache_sound(f);
-       sound(self, chan, sample, vol, atten);
+       _sound(self, chan, sample, vol, atten);
 
        return CMD_STATUS_FINISHED;
 }
index b34af78bbc07c0fa52658205fcb05e964ba13130..8f50d0276a6efb67158ba9164649edbdec387c70 100644 (file)
@@ -293,8 +293,8 @@ void waypoint_schedulerelink(entity wp)
 }
 
 // spawnfunc_waypoint map entity
-void spawnfunc_waypoint()
-{SELFPARAM();
+spawnfunc(waypoint)
+{
        setorigin(self, self.origin);
        // schedule a relink after other waypoints have had a chance to spawn
        waypoint_clearlinks(self);
index 87141c4bc35a48e26efb00468edc748aaf74d620..fde524bb94821ae89bd4ced22ecebed7e3d47e66 100644 (file)
@@ -38,7 +38,7 @@ float botframe_cachedwaypointlinks;
  * Functions
  */
 
-void spawnfunc_waypoint();
+spawnfunc(waypoint);
 void waypoint_addlink(entity from, entity to);
 void waypoint_think();
 void waypoint_clearlinks(entity wp);
index 26af000d2d52f0d5bcc4a1050c235585a1d883c5..9912174dd8d17a5a024fd8ac9e77f5340e839b49 100644 (file)
@@ -129,8 +129,8 @@ void info_autoscreenshot_findtarget()
        self.angles_y = a.y;
        // we leave Rick Roll alone
 }
-void spawnfunc_info_autoscreenshot()
-{SELFPARAM();
+spawnfunc(info_autoscreenshot)
+{
        if(++num_autoscreenshot > autocvar_g_max_info_autoscreenshot)
        {
                objerror("Too many info_autoscreenshot entitites. FAIL!");
@@ -283,7 +283,7 @@ float CheatImpulse(float i)
                                e = self;
 
                        Send_Effect(EFFECT_ROCKET_EXPLODE, e.origin, '0 0 0', 1);
-                       sound(e, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                       sound(e, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
 
                        e2 = spawn();
                        setorigin(e2, e.origin);
@@ -372,7 +372,7 @@ float CheatCommand(float argc)
                                                e.angles = fixedvectoangles2(trace_plane_normal, v_forward);
                                                e.angles = AnglesTransform_ApplyToAngles(e.angles, '-90 0 0'); // so unrotated models work
                                        }
-                                       WITH(entity, self, e, spawnfunc_func_breakable());
+                                       WITH(entity, self, e, spawnfunc_func_breakable(e));
                                        // now, is it valid?
                                        if(f == 0)
                                        {
index bd9c46a9b09de09f634d092f47fe4f6c3f91279f..da1a180d4c38dad14c8d1678b6edd6e2731ab8fc 100644 (file)
@@ -205,6 +205,7 @@ void PutObserverInServer (void)
        }
 
        self.frags = FRAGS_SPECTATOR;
+       self.bot_attack = false;
 
        MUTATOR_CALLHOOK(MakePlayerObserver);
 
@@ -329,9 +330,8 @@ void FixPlayermodel()
        {
                if(teamplay)
                {
-                       string s;
-                       s = Static_Team_ColorName_Lower(self.team);
-                       if(s != "neutral")
+                       string s = Static_Team_ColorName_Lower(self.team);
+                       if (s != "neutral")
                        {
                                defaultmodel = cvar_string(strcat("sv_defaultplayermodel_", s));
                                defaultskin = cvar(strcat("sv_defaultplayerskin_", s));
@@ -1447,7 +1447,7 @@ void play_countdown(float finished, string samp)
        if(IS_REAL_CLIENT(self))
                if(floor(finished - time - frametime) != floor(finished - time))
                        if(finished - time < 6)
-                               sound (self, CH_INFO, samp, VOL_BASE, ATTEN_NORM);
+                               _sound (self, CH_INFO, samp, VOL_BASE, ATTEN_NORM);
 }
 
 void player_powerups (void)
@@ -1472,7 +1472,7 @@ void player_powerups (void)
        {
                if (self.items & ITEM_Strength.m_itemid)
                {
-                       play_countdown(self.strength_finished, "misc/poweroff.wav");
+                       play_countdown(self.strength_finished, SND(POWEROFF));
                        self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
                        if (time > self.strength_finished)
                        {
@@ -1492,7 +1492,7 @@ void player_powerups (void)
                }
                if (self.items & ITEM_Shield.m_itemid)
                {
-                       play_countdown(self.invincible_finished, "misc/poweroff.wav");
+                       play_countdown(self.invincible_finished, SND(POWEROFF));
                        self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
                        if (time > self.invincible_finished)
                        {
@@ -1525,7 +1525,7 @@ void player_powerups (void)
                        }
                        else
                        {
-                               play_countdown(self.superweapons_finished, "misc/poweroff.wav");
+                               play_countdown(self.superweapons_finished, SND(POWEROFF));
                                if (time > self.superweapons_finished)
                                {
                                        self.items = self.items - (self.items & IT_SUPERWEAPON);
index f7f3c03b722c7efb0f5c24afe11d7139374af143..182c3304111966ef15918f978c652ea16e12c002 100644 (file)
@@ -182,11 +182,11 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, int de
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM);
                else if (take > 30)
-                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM);
                else if (take > 10)
-                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_BODYIMPACT1, VOL_BASE, ATTEN_NORM);
        }
 
        if (take > 50)
@@ -395,11 +395,11 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, int deathtyp
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM);
                else if (take > 30)
-                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM);
                else if (take > 10)
-                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM); // FIXME possibly remove them?
+                       sound (self, CH_SHOTS, SND_BODYIMPACT1, VOL_BASE, ATTEN_NORM); // FIXME possibly remove them?
        }
 
        if (take > 50)
@@ -1225,7 +1225,7 @@ void GlobalSound(string sample, float chan, float voicetype)
                        }
                        break;
                case VOICETYPE_PLAYERSOUND:
-                       sound(self, chan, sample, VOL_BASE, ATTEN_NORM);
+                       _sound(self, chan, sample, VOL_BASE, ATTEN_NORM);
                        break;
                default:
                        backtrace("Invalid voice type!");
index 5072e49002be11ab6a1dd845cbfacce27a75ed58..723b137a1366c54d7480eea6a8ee1523ced2ca1e 100644 (file)
@@ -5,8 +5,6 @@
 
 #define INDEPENDENT_ATTACK_FINISHED
 
-noref float require_spawnfunc_prefix; // if this float exists, only functions with spawnfunc_ name prefix qualify as spawn functions
-
 #define BUTTON_ATCK       button0
 #define BUTTON_JUMP       button2
 #define BUTTON_ATCK2      button3
@@ -147,7 +145,9 @@ const float MAX_DAMAGEEXTRARADIUS = 16;
 .float pauserothealth_finished;
 .float pauserotarmor_finished;
 .float pauserotfuel_finished;
+// string overrides entity
 .string item_pickupsound;
+.entity item_pickupsound_ent;
 
 // definitions for weaponsystem
 // more WEAPONTODO: move these to their proper files
index b5d87eed172cb27eafd02cec6d4af64a6dfd440e..2cc773b73f526b53a46b927692be1ba1069d9970 100644 (file)
@@ -560,6 +560,7 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
        targ.revive_progress = ((frozen_type == 3) ? 1 : 0);
        targ.health = ((frozen_type == 3) ? targ_maxhealth : 1);
        targ.revive_speed = freeze_time;
+       self.bot_attack = false;
 
        entity ice, head;
        ice = spawn();
@@ -591,6 +592,9 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
 
 void Unfreeze (entity targ)
 {
+       if(!targ.frozen)
+               return;
+
        if(targ.frozen && targ.frozen != 3) // only reset health if target was frozen
                targ.health = ((IS_PLAYER(targ)) ? start_health : targ.max_health);
 
@@ -598,6 +602,7 @@ void Unfreeze (entity targ)
        targ.frozen = 0;
        targ.revive_progress = 0;
        targ.revival_time = time;
+       self.bot_attack = true;
 
        WaypointSprite_Kill(targ.waypointsprite_attached);
 
index 6a95a61fe0afe8dc89637c887a253ef729b1647c..779ec90c9932e921265729ad0053863d710a7cf8 100644 (file)
@@ -91,7 +91,7 @@ void GrapplingHookThink();
 void GrapplingHook_Stop()
 {SELFPARAM();
        Send_Effect(EFFECT_HOOK_IMPACT, self.origin, '0 0 0', 1);
-       sound (self, CH_SHOTS, W_Sound("hook_impact"), VOL_BASE, ATTEN_NORM);
+       sound (self, CH_SHOTS, SND_HOOK_IMPACT, VOL_BASE, ATTEN_NORM);
 
        self.state = 1;
        self.think = GrapplingHookThink;
@@ -357,7 +357,7 @@ void FireGrapplingHook (void)
        vs = hook_shotorigin[s];
 
        // UGLY WORKAROUND: play this on CH_WEAPON_B so it can't cut off fire sounds
-       sound (self, CH_WEAPON_B, W_Sound("hook_fire"), VOL_BASE, ATTEN_NORM);
+       sound (self, CH_WEAPON_B, SND_HOOK_FIRE, VOL_BASE, ATTEN_NORM);
        org = self.origin + self.view_ofs + v_forward * vs.x + v_right * -vs.y + v_up * vs.z;
 
        tracebox(self.origin + self.view_ofs, '-3 -3 -3', '3 3 3', org, MOVE_NORMAL, self);
index f7382d1666b15b6c295903b3fa90260be3c720a2..bd5232a1c93338c5de9e164531cd5296798b0730 100644 (file)
@@ -86,7 +86,7 @@ void dynlight_use()
        else
                self.light_lev = 0;
 }
-void spawnfunc_dynlight()
+spawnfunc(dynlight)
 {
        if (!self.light_lev)
                self.light_lev = 200;
index 8bb2b1b6afd5d4688a4d781d90aa89c9d02303e6..3a94d6f1abeb1dff1ee6a6bea05ded66c77d0e1e 100644 (file)
@@ -177,15 +177,15 @@ float g_clientmodel_genericsendentity (entity to, int sf)
        self.default_solid = sol;
 
 // non-solid model entities:
-void spawnfunc_misc_gamemodel()         { SELFPARAM(); self.angles_x = -self.angles.x; G_MODEL_INIT      (SOLID_NOT) } // model entity
-void spawnfunc_misc_clientmodel()       { SELFPARAM(); self.angles_x = -self.angles.x; G_CLIENTMODEL_INIT(SOLID_NOT) } // model entity
-void spawnfunc_misc_models()            { SELFPARAM(); self.angles_x = -self.angles.x; G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old compat entity with confusing name, do not use
+spawnfunc(misc_gamemodel)         { self.angles_x = -self.angles.x; G_MODEL_INIT      (SOLID_NOT) } // model entity
+spawnfunc(misc_clientmodel)       { self.angles_x = -self.angles.x; G_CLIENTMODEL_INIT(SOLID_NOT) } // model entity
+spawnfunc(misc_models)            { self.angles_x = -self.angles.x; G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old compat entity with confusing name, do not use
 
 // non-solid brush entities:
-void spawnfunc_func_illusionary()       { SELFPARAM(); G_MODEL_INIT      (SOLID_NOT) } // Q1 name (WARNING: MISPREDICTED)
-void spawnfunc_func_clientillusionary() { SELFPARAM(); G_CLIENTMODEL_INIT(SOLID_NOT) } // brush entity
-void spawnfunc_func_static()            { SELFPARAM(); G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old alias name from some other game
+spawnfunc(func_illusionary)       { G_MODEL_INIT      (SOLID_NOT) } // Q1 name (WARNING: MISPREDICTED)
+spawnfunc(func_clientillusionary) { G_CLIENTMODEL_INIT(SOLID_NOT) } // brush entity
+spawnfunc(func_static)            { G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old alias name from some other game
 
 // solid brush entities
-void spawnfunc_func_wall()              { SELFPARAM(); G_MODEL_INIT      (SOLID_BSP) } // Q1 name
-void spawnfunc_func_clientwall()        { SELFPARAM(); G_CLIENTMODEL_INIT(SOLID_BSP) } // brush entity (WARNING: MISPREDICTED)
+spawnfunc(func_wall)              { G_MODEL_INIT      (SOLID_BSP) } // Q1 name
+spawnfunc(func_clientwall)        { G_CLIENTMODEL_INIT(SOLID_BSP) } // brush entity (WARNING: MISPREDICTED)
index 723087a96380634bb539a613145338aa2c96d571..585ac42e085b56852be47ac023d9d11976e92404 100644 (file)
@@ -5,8 +5,8 @@
 #include "command/common.qh"
 #include "../warpzonelib/common.qh"
 
-void spawnfunc_info_null (void)
-{SELFPARAM();
+spawnfunc(info_null)
+{
        remove(self);
        // if anything breaks, tell the mapper to fix his map! info_null is meant to remove itself immediately.
 }
index d62bbb6124e57bd014b2976bde0d5532990b5f98..77f49ae5a9930d1b75911377490437ce48bcd10b 100644 (file)
@@ -8,7 +8,7 @@ void() SUB_CalcAngleMoveDone;
 //void() SUB_UseTargets;
 void() SUB_Remove;
 
-void spawnfunc_info_null (void);
+spawnfunc(info_null);
 
 void setanim(entity e, vector anim, float looping, float override, float restart);
 
index b5a2806d76d7a5756ad55a656c29951f8dd23514..53990fb21392f0b22c64d91ab93e8cc49e39e526 100644 (file)
@@ -534,8 +534,8 @@ void RandomSeed_Spawn()
        WITH(entity, self, randomseed, randomseed.think()); // sets random seed and nextthink
 }
 
-void spawnfunc___init_dedicated_server(void)
-{SELFPARAM();
+spawnfunc(__init_dedicated_server)
+{
        // handler for _init/_init map (only for dedicated server initialization)
 
        world_initialized = -1; // don't complain
@@ -572,8 +572,8 @@ void ClientInit_Spawn();
 void WeaponStats_Init();
 void WeaponStats_Shutdown();
 void Physics_AddStats();
-void spawnfunc_worldspawn (void)
-{SELFPARAM();
+spawnfunc(worldspawn)
+{
        float fd, l, j, n;
        string s;
 
@@ -608,8 +608,6 @@ void spawnfunc_worldspawn (void)
        CALL_ACCUMULATED_FUNCTION(RegisterNotifications);
        CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes);
 
-       initialize_minigames();
-
        ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
 
        TemporaryDB = db_create();
@@ -920,8 +918,8 @@ void spawnfunc_worldspawn (void)
        world_initialized = 1;
 }
 
-void spawnfunc_light (void)
-{SELFPARAM();
+spawnfunc(light)
+{
        //makestatic (self); // Who the f___ did that?
        remove(self);
 }
index 6a1527745e3f368eab3c35715790dffbf216bff7..713fbf6c3df57e87a8c704e7916da1ba11e562b0 100644 (file)
@@ -148,8 +148,8 @@ This is the only correct way to put keys on the map!
 
 itemkeys MUST always have exactly one bit set.
 */
-void spawnfunc_item_key()
-{SELFPARAM();
+spawnfunc(item_key)
+{
        string _netname;
        vector _colormod;
 
@@ -234,7 +234,7 @@ void spawnfunc_item_key()
                self.message = strzone(strcat("You've picked up the ", self.netname, "!"));
 
        if (self.noise == "")
-               self.noise = "misc/itempickup.wav";
+               self.noise = SND(ITEMPICKUP);
 
        // save the name for later
        item_keys_names[lowestbit(self.itemkeys)] = self.netname;
@@ -255,11 +255,11 @@ FLOATING: the item will float in air, instead of aligning to the floor by fallin
 ---------NOTES----------
 Don't use this entity on new maps! Use item_key instead.
 */
-void spawnfunc_item_key1(void)
-{SELFPARAM();
-       self.classname = "item_key";
-       self.itemkeys = ITEM_KEY_BIT(1);
-       spawnfunc_item_key();
+spawnfunc(item_key1)
+{
+       this.classname = "item_key";
+       this.itemkeys = ITEM_KEY_BIT(1);
+       spawnfunc_item_key(this);
 };
 
 /*QUAKED item_key2 (0 .5 .8) (-16 -16 -24) (16 16 32) FLOATING
@@ -274,9 +274,9 @@ FLOATING: the item will float in air, instead of aligning to the floor by fallin
 ---------NOTES----------
 Don't use this entity on new maps! Use item_key instead.
 */
-void spawnfunc_item_key2(void)
-{SELFPARAM();
-       self.classname = "item_key";
-       self.itemkeys = ITEM_KEY_BIT(0);
-       spawnfunc_item_key();
+spawnfunc(item_key2)
+{
+       this.classname = "item_key";
+       this.itemkeys = ITEM_KEY_BIT(0);
+       spawnfunc_item_key(this);
 };
index eb8277abc2f6ac2d7521bb45653a4734f2876cbd..a6164747dbdfa8fba56b601c5ea995496c4a35a1 100644 (file)
@@ -299,6 +299,8 @@ string formatmessage(string msg)
                        case "x": replacement = ((cursor_ent.netname == "" || !cursor_ent) ? "nothing" : cursor_ent.netname); break;
                        case "s": replacement = ftos(vlen(self.velocity - self.velocity_z * '0 0 1')); break;
                        case "S": replacement = ftos(vlen(self.velocity)); break;
+                       case "t": replacement = seconds_tostring(ceil(max(0, autocvar_timelimit * 60 + game_starttime - time))); break;
+                       case "T": replacement = seconds_tostring(floor(time - game_starttime)); break;
                        default:
                        {
                                MUTATOR_CALLHOOK(FormatMessage, escape, replacement, msg);
@@ -764,14 +766,6 @@ float sound_allowed(float destin, entity e)
     return true;
 }
 
-#undef sound
-void sound(entity e, float chan, string samp, float vol, float attenu)
-{
-    if (!sound_allowed(MSG_BROADCAST, e))
-        return;
-    sound7(e, chan, samp, vol, attenu, 0, 0);
-}
-
 void soundtoat(float _dest, entity e, vector o, float chan, string samp, float vol, float attenu)
 {
     float entno, idx;
@@ -847,7 +841,7 @@ void stopsoundto(float _dest, entity e, float chan)
     if (entno >= 8192 || chan < 0 || chan > 7)
     {
         float idx, sflags;
-        idx = precache_sound_index("misc/null.wav");
+        idx = precache_sound_index(SND(Null));
         sflags = SND_LARGEENTITY;
         if (idx >= 256)
             sflags |= SND_LARGESOUND;
@@ -895,7 +889,7 @@ float spamsound(entity e, float chan, string samp, float vol, float _atten)
     if (time > e.spamtime)
     {
         e.spamtime = time;
-        sound(e, chan, samp, vol, _atten);
+        _sound(e, chan, samp, vol, _atten);
         return true;
     }
     return false;
@@ -920,7 +914,7 @@ void play2all(string samp)
     if (autocvar_bot_sound_monopoly)
         return;
 
-    sound(world, CH_INFO, samp, VOL_BASE, ATTEN_NONE);
+    _sound(world, CH_INFO, samp, VOL_BASE, ATTEN_NONE);
 }
 
 void PrecachePlayerSounds(string f);
@@ -1013,36 +1007,8 @@ void precache()
     }
 
     // gore and miscellaneous sounds
-    //precache_sound ("misc/h2ohit.wav");
-    precache_sound ("misc/armorimpact.wav");
-    precache_sound ("misc/bodyimpact1.wav");
-    precache_sound ("misc/bodyimpact2.wav");
-    precache_sound ("misc/gib.wav");
-    precache_sound ("misc/gib_splat01.wav");
-    precache_sound ("misc/gib_splat02.wav");
-    precache_sound ("misc/gib_splat03.wav");
-    precache_sound ("misc/gib_splat04.wav");
     PrecacheGlobalSound((globalsound_fall = "misc/hitground 4"));
     PrecacheGlobalSound((globalsound_metalfall = "misc/metalhitground 4"));
-    precache_sound ("misc/null.wav");
-    precache_sound ("misc/spawn.wav");
-    precache_sound ("misc/talk.wav");
-    precache_sound ("misc/teleport.wav");
-    precache_sound ("misc/poweroff.wav");
-    precache_sound ("player/lava.wav");
-    precache_sound ("player/slime.wav");
-
-    // common weapon precaches
-       precache_sound (W_Sound("reload")); // until weapons have individual reload sounds, precache the reload sound here
-    precache_sound (W_Sound("weapon_switch"));
-    precache_sound (W_Sound("weaponpickup"));
-    precache_sound (W_Sound("unavailable"));
-    precache_sound (W_Sound("dryfire"));
-    if (g_grappling_hook)
-    {
-        precache_sound (W_Sound("hook_fire")); // hook
-        precache_sound (W_Sound("hook_impact")); // hook
-    }
 
 #if 0
     // Disabled this code because it simply does not work (e.g. ignores bgmvolume, overlaps with "cd loop" controlled tracks).
@@ -1057,8 +1023,6 @@ void precache()
         ambientsound ('0 0 0', self.noise, VOL_BASE, ATTEN_NONE);
     }
 #endif
-
-#include "precache-for-csqc.inc"
 }
 
 
@@ -1470,7 +1434,7 @@ string uid2name(string myuid) {
        return s;
 }
 
-float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
+float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
 {
     float m, i;
     vector start, org, delta, end, enddown, mstart;
@@ -1479,8 +1443,8 @@ float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, f
     m = e.dphitcontentsmask;
     e.dphitcontentsmask = goodcontents | badcontents;
 
-    org = world.mins;
-    delta = world.maxs - world.mins;
+    org = boundmin;
+    delta = boundmax - boundmin;
 
     start = end = org;
 
@@ -1581,6 +1545,11 @@ float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, f
         return false;
 }
 
+float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
+{
+       return MoveToRandomLocationWithinBounds(e, world.mins, world.maxs, goodcontents, badcontents, badsurfaceflags, attempts, maxaboveground, minviewdistance);
+}
+
 void write_recordmarker(entity pl, float tstart, float dt)
 {
     GameLogEcho(strcat(":recordset:", ftos(pl.playerid), ":", ftos(dt)));
index f1f003820d1b8c736c48261847a34a83f4699164..fc3583bb16bc6824dd5c0f4fce6638af8e631c13 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "../common/constants.qh"
 #include "../common/mapinfo.qh"
-#include "../common/turrets/turrets.qh"
+#include "../common/turrets/all.qh"
 
 #ifdef RELEASE
 #define cvar_string_normal builtin_cvar_string
@@ -106,6 +106,8 @@ float LostMovetypeFollow(entity ent);
 
 string uid2name(string myuid);
 
+float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance);
+
 float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance);
 
 string NearestLocation(vector p);
index 881938f06809030eb83eb4c28aa10241de785165..1492b9f6af3d07a06aa8a782a8d4a846ea60bea0 100644 (file)
@@ -257,7 +257,7 @@ MUTATOR_HOOKABLE(MonsterRespawn, EV_MonsterRespawn);
     /**/ i(entity, other) \
     /**/ o(entity, other) \
     /**/
-.void() monster_loot;
+.void(entity this) monster_loot;
 MUTATOR_HOOKABLE(MonsterDropItem, EV_MonsterDropItem);
 
 /**
index 844043222a71e7e43de8a6eb030c2fcbc044fe33..1a10e3c6c9c789107fc0b80901f63bc7d941230f 100644 (file)
@@ -251,24 +251,24 @@ void assault_new_round()
 }
 
 // spawnfuncs
-void spawnfunc_info_player_attacker()
-{SELFPARAM();
+spawnfunc(info_player_attacker)
+{
        if (!g_assault) { remove(self); return; }
 
        self.team = NUM_TEAM_1; // red, gets swapped every round
-       spawnfunc_info_player_deathmatch();
+       spawnfunc_info_player_deathmatch(this);
 }
 
-void spawnfunc_info_player_defender()
-{SELFPARAM();
+spawnfunc(info_player_defender)
+{
        if (!g_assault) { remove(self); return; }
 
        self.team = NUM_TEAM_2; // blue, gets swapped every round
-       spawnfunc_info_player_deathmatch();
+       spawnfunc_info_player_deathmatch(this);
 }
 
-void spawnfunc_target_objective()
-{SELFPARAM();
+spawnfunc(target_objective)
+{
        if (!g_assault) { remove(self); return; }
 
        self.classname = "target_objective";
@@ -278,8 +278,8 @@ void spawnfunc_target_objective()
        self.spawn_evalfunc = target_objective_spawn_evalfunc;
 }
 
-void spawnfunc_target_objective_decrease()
-{SELFPARAM();
+spawnfunc(target_objective_decrease)
+{
        if (!g_assault) { remove(self); return; }
 
        self.classname = "target_objective_decrease";
@@ -296,8 +296,8 @@ void spawnfunc_target_objective_decrease()
 }
 
 // destructible walls that can be used to trigger target_objective_decrease
-void spawnfunc_func_assault_destructible()
-{SELFPARAM();
+spawnfunc(func_assault_destructible)
+{
        if (!g_assault) { remove(self); return; }
 
        self.spawnflags = 3;
@@ -308,11 +308,11 @@ void spawnfunc_func_assault_destructible()
        else
                self.team = NUM_TEAM_1;
 
-       spawnfunc_func_breakable();
+       spawnfunc_func_breakable(this);
 }
 
-void spawnfunc_func_assault_wall()
-{SELFPARAM();
+spawnfunc(func_assault_wall)
+{
        if (!g_assault) { remove(self); return; }
 
        self.classname = "func_assault_wall";
@@ -324,8 +324,8 @@ void spawnfunc_func_assault_wall()
        InitializeEntity(self, assault_setenemytoobjective, INITPRIO_FINDTARGET);
 }
 
-void spawnfunc_target_assault_roundend()
-{SELFPARAM();
+spawnfunc(target_assault_roundend)
+{
        if (!g_assault) { remove(self); return; }
 
        self.winning = 0; // round not yet won by attackers
@@ -335,8 +335,8 @@ void spawnfunc_target_assault_roundend()
        self.reset = target_assault_roundend_reset;
 }
 
-void spawnfunc_target_assault_roundstart()
-{SELFPARAM();
+spawnfunc(target_assault_roundstart)
+{
        if (!g_assault) { remove(self); return; }
 
        assault_attacker_team = NUM_TEAM_1;
index 060752c111d93d7e353ca6b265408cf71f474283..108b8dda6f369b10163cdc376d968e90e6d65a49 100644 (file)
@@ -239,7 +239,7 @@ void ctf_Handle_Drop(entity flag, entity player, int droptype)
 
        // messages and sounds
        Send_Notification(NOTIF_ALL, world, MSG_INFO, ((flag.team) ? APP_TEAM_ENT_4(flag, INFO_CTF_LOST_) : INFO_CTF_LOST_NEUTRAL), player.netname);
-       sound(flag, CH_TRIGGER, flag.snd_flag_dropped, VOL_BASE, ATTEN_NONE);
+       _sound(flag, CH_TRIGGER, flag.snd_flag_dropped, VOL_BASE, ATTEN_NONE);
        ctf_EventLog("dropped", player.team, player);
 
        // scoring
@@ -296,7 +296,7 @@ void ctf_Handle_Retrieve(entity flag, entity player)
        flag.ctf_status = FLAG_CARRY;
 
        // messages and sounds
-       sound(player, CH_TRIGGER, flag.snd_flag_pass, VOL_BASE, ATTEN_NORM);
+       _sound(player, CH_TRIGGER, flag.snd_flag_pass, VOL_BASE, ATTEN_NORM);
        ctf_EventLog("receive", flag.team, player);
 
        FOR_EACH_REALPLAYER(tmp_player)
@@ -363,7 +363,7 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype)
                        flag.ctf_status = FLAG_PASSING;
 
                        // other
-                       sound(player, CH_TRIGGER, flag.snd_flag_touch, VOL_BASE, ATTEN_NORM);
+                       _sound(player, CH_TRIGGER, flag.snd_flag_touch, VOL_BASE, ATTEN_NORM);
                        WarpZone_TrailParticles(world, _particleeffectnum(flag.passeffect), player.origin, targ_origin);
                        ctf_EventLog("pass", flag.team, player);
                        break;
@@ -436,7 +436,7 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype)
        // messages and sounds
        Send_Notification(NOTIF_ONE, player, MSG_CENTER, ((enemy_flag.team) ? APP_TEAM_ENT_4(enemy_flag, CENTER_CTF_CAPTURE_) : CENTER_CTF_CAPTURE_NEUTRAL));
        ctf_CaptureRecord(enemy_flag, player);
-       sound(player, CH_TRIGGER, ((ctf_oneflag) ? player_team_flag.snd_flag_capture : ((DIFF_TEAM(player, flag)) ? enemy_flag.snd_flag_capture : flag.snd_flag_capture)), VOL_BASE, ATTEN_NONE);
+       _sound(player, CH_TRIGGER, ((ctf_oneflag) ? player_team_flag.snd_flag_capture : ((DIFF_TEAM(player, flag)) ? enemy_flag.snd_flag_capture : flag.snd_flag_capture)), VOL_BASE, ATTEN_NONE);
 
        switch(capturetype)
        {
@@ -485,7 +485,7 @@ void ctf_Handle_Return(entity flag, entity player)
                Send_Notification(NOTIF_ONE, player, MSG_CENTER, APP_TEAM_ENT_4(flag, CENTER_CTF_RETURN_));
                Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_ENT_4(flag, INFO_CTF_RETURN_), player.netname);
        }
-       sound(player, CH_TRIGGER, flag.snd_flag_returned, VOL_BASE, ATTEN_NONE);
+       _sound(player, CH_TRIGGER, flag.snd_flag_returned, VOL_BASE, ATTEN_NONE);
        ctf_EventLog("return", flag.team, player);
 
        // scoring
@@ -573,7 +573,7 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype)
        else
                Send_Notification(NOTIF_ONE, tmp_entity, MSG_CHOICE, ((SAME_TEAM(flag, player)) ? CHOICE_CTF_PICKUP_ENEMY_TEAM : CHOICE_CTF_PICKUP_ENEMY), Team_ColorCode(player.team), player.netname);
 
-       sound(player, CH_TRIGGER, flag.snd_flag_taken, VOL_BASE, ATTEN_NONE);
+       _sound(player, CH_TRIGGER, flag.snd_flag_taken, VOL_BASE, ATTEN_NONE);
 
        // scoring
        PlayerScore_Add(player, SP_CTF_PICKUPS, 1);
@@ -641,7 +641,7 @@ void ctf_CheckFlagReturn(entity flag, int returntype)
                                case RETURN_TIMEOUT:
                                        { Send_Notification(NOTIF_ALL, world, MSG_INFO, ((flag.team) ? APP_TEAM_ENT_4(flag, INFO_CTF_FLAGRETURN_TIMEOUT_) : INFO_CTF_FLAGRETURN_TIMEOUT_NEUTRAL)); break; }
                        }
-                       sound(flag, CH_TRIGGER, flag.snd_flag_respawn, VOL_BASE, ATTEN_NONE);
+                       _sound(flag, CH_TRIGGER, flag.snd_flag_respawn, VOL_BASE, ATTEN_NONE);
                        ctf_EventLog("returned", flag.team, world);
                        ctf_RespawnFlag(flag);
                }
@@ -941,7 +941,7 @@ void ctf_FlagTouch()
                if(time > self.wait) // if we haven't in a while, play a sound/effect
                {
                        Send_Effect_(self.toucheffect, self.origin, '0 0 0', 1);
-                       sound(self, CH_TRIGGER, self.snd_flag_touch, VOL_BASE, ATTEN_NORM);
+                       _sound(self, CH_TRIGGER, self.snd_flag_touch, VOL_BASE, ATTEN_NORM);
                        self.wait = time + FLAG_TOUCHRATE;
                }
                return;
@@ -1091,7 +1091,6 @@ void set_flag_string(entity flag, .string field, string value, string teamname)
 void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag entity on the map as a spawnfunc
 {SELFPARAM();
        // declarations
-       string teamname = Static_Team_ColorName_Lower(teamnumber);
        setself(flag); // for later usage with droptofloor()
 
        // main setup
@@ -1124,6 +1123,7 @@ void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag e
        flag.nextthink = time + FLAG_THINKRATE;
        flag.ctf_status = FLAG_BASE;
 
+       string teamname = Static_Team_ColorName_Lower(teamnumber);
        // appearence
        if(!flag.scale)                         { flag.scale = FLAG_SCALE; }
        if(flag.skin == 0)                      { flag.skin = cvar(sprintf("g_ctf_flag_%s_skin", teamname)); }
@@ -1133,22 +1133,18 @@ void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag e
        set_flag_string(flag, capeffect,        "%s_cap",               teamname);
 
        // sounds
-       set_flag_string(flag, snd_flag_taken,           "ctf/%s_taken.wav",     teamname);
-       set_flag_string(flag, snd_flag_returned,        "ctf/%s_returned.wav",  teamname);
-       set_flag_string(flag, snd_flag_capture,         "ctf/%s_capture.wav",   teamname);
-       set_flag_string(flag, snd_flag_dropped,         "ctf/%s_dropped.wav",   teamname);
-       if(flag.snd_flag_respawn == "")         { flag.snd_flag_respawn = "ctf/flag_respawn.wav"; } // if there is ever a team-based sound for this, update the code to match.
-       if(flag.snd_flag_touch == "")           { flag.snd_flag_touch = "ctf/touch.wav"; } // again has no team-based sound
-       if(flag.snd_flag_pass == "")            { flag.snd_flag_pass = "ctf/pass.wav"; } // same story here
-
-       // precache
-       precache_sound(flag.snd_flag_taken);
-       precache_sound(flag.snd_flag_returned);
-       precache_sound(flag.snd_flag_capture);
+       flag.snd_flag_taken = SND(CTF_TAKEN(teamnumber));
+       flag.snd_flag_returned = SND(CTF_RETURNED(teamnumber));
+       flag.snd_flag_capture = SND(CTF_CAPTURE(teamnumber));
+       flag.snd_flag_dropped = SND(CTF_DROPPED(teamnumber));
+       if (flag.snd_flag_respawn == "") flag.snd_flag_respawn = SND(CTF_RESPAWN); // if there is ever a team-based sound for this, update the code to match.
        precache_sound(flag.snd_flag_respawn);
-       precache_sound(flag.snd_flag_dropped);
+       if (flag.snd_flag_touch == "") flag.snd_flag_touch = SND(CTF_TOUCH); // again has no team-based sound
        precache_sound(flag.snd_flag_touch);
+       if (flag.snd_flag_pass == "") flag.snd_flag_pass = SND(CTF_PASS); // same story here
        precache_sound(flag.snd_flag_pass);
+
+       // precache
        precache_model(flag.model);
 
        // appearence
@@ -2251,8 +2247,8 @@ Keys:
 "noise3" sound played when flag is lost in the field and respawns itself...
 "noise4" sound played when flag is dropped by a player...
 "noise5" sound played when flag touches the ground... */
-void spawnfunc_item_flag_team1()
-{SELFPARAM();
+spawnfunc(item_flag_team1)
+{
        if(!g_ctf) { remove(self); return; }
 
        ctf_FlagSetup(NUM_TEAM_1, self);
@@ -2269,8 +2265,8 @@ Keys:
 "noise3" sound played when flag is lost in the field and respawns itself...
 "noise4" sound played when flag is dropped by a player...
 "noise5" sound played when flag touches the ground... */
-void spawnfunc_item_flag_team2()
-{SELFPARAM();
+spawnfunc(item_flag_team2)
+{
        if(!g_ctf) { remove(self); return; }
 
        ctf_FlagSetup(NUM_TEAM_2, self);
@@ -2287,8 +2283,8 @@ Keys:
 "noise3" sound played when flag is lost in the field and respawns itself...
 "noise4" sound played when flag is dropped by a player...
 "noise5" sound played when flag touches the ground... */
-void spawnfunc_item_flag_team3()
-{SELFPARAM();
+spawnfunc(item_flag_team3)
+{
        if(!g_ctf) { remove(self); return; }
 
        ctf_FlagSetup(NUM_TEAM_3, self);
@@ -2305,8 +2301,8 @@ Keys:
 "noise3" sound played when flag is lost in the field and respawns itself...
 "noise4" sound played when flag is dropped by a player...
 "noise5" sound played when flag touches the ground... */
-void spawnfunc_item_flag_team4()
-{SELFPARAM();
+spawnfunc(item_flag_team4)
+{
        if(!g_ctf) { remove(self); return; }
 
        ctf_FlagSetup(NUM_TEAM_4, self);
@@ -2323,8 +2319,8 @@ Keys:
 "noise3" sound played when flag is lost in the field and respawns itself...
 "noise4" sound played when flag is dropped by a player...
 "noise5" sound played when flag touches the ground... */
-void spawnfunc_item_flag_neutral()
-{SELFPARAM();
+spawnfunc(item_flag_neutral)
+{
        if(!g_ctf) { remove(self); return; }
        if(!cvar("g_ctf_oneflag")) { remove(self); return; }
 
@@ -2337,8 +2333,8 @@ Note: If you use spawnfunc_ctf_team entities you must define at least 2!  Howeve
 Keys:
 "netname" Name of the team (for example Red, Blue, Green, Yellow, Life, Death, Offense, Defense, etc)...
 "cnt" Scoreboard color of the team (for example 4 is red and 13 is blue)... */
-void spawnfunc_ctf_team()
-{SELFPARAM();
+spawnfunc(ctf_team)
+{
        if(!g_ctf) { remove(self); return; }
 
        self.classname = "ctf_team";
@@ -2346,15 +2342,15 @@ void spawnfunc_ctf_team()
 }
 
 // compatibility for quake maps
-void spawnfunc_team_CTF_redflag()    { spawnfunc_item_flag_team1();    }
-void spawnfunc_team_CTF_blueflag()   { spawnfunc_item_flag_team2();    }
-void spawnfunc_team_CTF_redplayer()  { spawnfunc_info_player_team1();  }
-void spawnfunc_team_CTF_blueplayer() { spawnfunc_info_player_team2();  }
-void spawnfunc_team_CTF_redspawn()   { spawnfunc_info_player_team1();  }
-void spawnfunc_team_CTF_bluespawn()  { spawnfunc_info_player_team2();  }
+spawnfunc(team_CTF_redflag)    { spawnfunc_item_flag_team1(this);    }
+spawnfunc(team_CTF_blueflag)   { spawnfunc_item_flag_team2(this);    }
+spawnfunc(team_CTF_redplayer)  { spawnfunc_info_player_team1(this);  }
+spawnfunc(team_CTF_blueplayer) { spawnfunc_info_player_team2(this);  }
+spawnfunc(team_CTF_redspawn)   { spawnfunc_info_player_team1(this);  }
+spawnfunc(team_CTF_bluespawn)  { spawnfunc_info_player_team2(this);  }
 
-void team_CTF_neutralflag()                     { spawnfunc_item_flag_neutral();  }
-void team_neutralobelisk()                      { spawnfunc_item_flag_neutral();  }
+void team_CTF_neutralflag()                     { SELFPARAM(); spawnfunc_item_flag_neutral(self);  }
+void team_neutralobelisk()                      { SELFPARAM(); spawnfunc_item_flag_neutral(self);  }
 
 
 // ==============
@@ -2378,15 +2374,12 @@ void ctf_ScoreRules(int teams)
 
 // code from here on is just to support maps that don't have flag and team entities
 void ctf_SpawnTeam (string teamname, int teamcolor)
-{SELFPARAM();
-       setself(spawn());
-       self.classname = "ctf_team";
-       self.netname = teamname;
-       self.cnt = teamcolor;
-
-       spawnfunc_ctf_team();
-
-       setself(this);
+{
+       entity this = new(ctf_team);
+       this.netname = teamname;
+       this.cnt = teamcolor;
+       this.spawnfunc_checked = true;
+       WITH(entity, self, this, spawnfunc_ctf_team(this));
 }
 
 void ctf_DelayedInit() // Do this check with a delay so we can wait for teams to be set up.
index 6fa778309f44f1b22a09bf55a844f1a773248a2e..34b2875105a6f404588ad6d05477c2920230c369 100644 (file)
@@ -61,9 +61,9 @@ void dompoint_captured ()
 
        if (head.noise != "")
                if(self.enemy)
-                       sound(self.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
+                       _sound(self.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
                else
-                       sound(self, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
+                       _sound(self, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
        if (head.noise1 != "")
                play2all(head.noise1);
 
@@ -447,8 +447,8 @@ MUTATOR_HOOKFUNCTION(dom_BotRoles)
 /*QUAKED spawnfunc_dom_controlpoint (0 .5 .8) (-16 -16 -24) (16 16 32)
 Control point for Domination gameplay.
 */
-void spawnfunc_dom_controlpoint()
-{SELFPARAM();
+spawnfunc(dom_controlpoint)
+{
        if(!g_domination)
        {
                remove(self);
@@ -492,8 +492,8 @@ Keys:
  (this is a global sound, like "Red team has captured a control point")
 */
 
-void spawnfunc_dom_team()
-{SELFPARAM();
+spawnfunc(dom_team)
+{
        if(!g_domination || autocvar_g_domination_teams_override >= 2)
        {
                remove(self);
@@ -567,26 +567,27 @@ void dom_spawnteam (string teamname, float teamcolor, string pointmodel, float p
        setself(this);
 }
 
+void _spawnfunc_dom_controlpoint() { SELFPARAM(); spawnfunc_dom_controlpoint(self); }
 void dom_spawnpoint(vector org)
 {SELFPARAM();
        setself(spawn());
        self.classname = "dom_controlpoint";
-       self.think = spawnfunc_dom_controlpoint;
+       self.think = _spawnfunc_dom_controlpoint;
        self.nextthink = time;
        setorigin(self, org);
-       spawnfunc_dom_controlpoint();
+       spawnfunc_dom_controlpoint(this);
        setself(this);
 }
 
 // spawn some default teams if the map is not set up for domination
 void dom_spawnteams(float teams)
 {
-       dom_spawnteam("Red", NUM_TEAM_1-1, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point");
-       dom_spawnteam("Blue", NUM_TEAM_2-1, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point");
+       dom_spawnteam("Red", NUM_TEAM_1-1, "models/domination/dom_red.md3", 0, SND(DOM_CLAIM), "", "Red team has captured a control point");
+       dom_spawnteam("Blue", NUM_TEAM_2-1, "models/domination/dom_blue.md3", 0, SND(DOM_CLAIM), "", "Blue team has captured a control point");
        if(teams >= 3)
-               dom_spawnteam("Yellow", NUM_TEAM_3-1, "models/domination/dom_yellow.md3", 0, "domination/claim.wav", "", "Yellow team has captured a control point");
+               dom_spawnteam("Yellow", NUM_TEAM_3-1, "models/domination/dom_yellow.md3", 0, SND(DOM_CLAIM), "", "Yellow team has captured a control point");
        if(teams >= 4)
-               dom_spawnteam("Pink", NUM_TEAM_4-1, "models/domination/dom_pink.md3", 0, "domination/claim.wav", "", "Pink team has captured a control point");
+               dom_spawnteam("Pink", NUM_TEAM_4-1, "models/domination/dom_pink.md3", 0, SND(DOM_CLAIM), "", "Pink team has captured a control point");
        dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, "", "", "");
 }
 
@@ -622,8 +623,6 @@ void dom_DelayedInit() // Do this check with a delay so we can wait for teams to
 
 void dom_Initialize()
 {
-       precache_sound("domination/claim.wav");
-
        InitializeEntity(world, dom_DelayedInit, INITPRIO_GAMETYPE);
 }
 
index 412e7bd5405caa28832a5edc54ad8dcd4f01c652..5dbe12d22d9c7701f042591b7d04e677509ec34f 100644 (file)
@@ -6,8 +6,8 @@
 #include "../../common/monsters/spawn.qh"
 #include "../../common/monsters/sv_monsters.qh"
 
-void spawnfunc_invasion_spawnpoint()
-{SELFPARAM();
+spawnfunc(invasion_spawnpoint)
+{
        if(!g_invasion) { remove(self); return; }
 
        self.classname = "invasion_spawnpoint";
index 6d7c8c99014567a349791a5845ef1a655ea456e0..b265e41d3d5ae47a29097f683546e602da99e87a 100644 (file)
@@ -53,7 +53,7 @@ void ka_RespawnBall() // runs whenever the ball needs to be relocated
        WaypointSprite_Spawn(WP_KaBall, 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, false, RADARICON_FLAGCARRIER);
        WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
 
-       sound(self, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
+       sound(self, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
 }
 
 void ka_TimeScoring()
@@ -82,7 +82,7 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        if (!IS_PLAYER(other))
        {  // The ball just touched an object, most likely the world
                Send_Effect(EFFECT_BALL_SPARKS, self.origin, '0 0 0', 1);
-               sound(self, CH_TRIGGER, "keepaway/touch.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_KA_TOUCH, VOL_BASE, ATTEN_NORM);
                return;
        }
        else if(self.wait > time) { return; }
@@ -112,7 +112,7 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_KEEPAWAY_PICKUP, other.netname);
        Send_Notification(NOTIF_ALL_EXCEPT, other, MSG_CENTER, CENTER_KEEPAWAY_PICKUP, other.netname);
        Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_KEEPAWAY_PICKUP_SELF);
-       sound(self.owner, CH_TRIGGER, "keepaway/pickedup.wav", VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
+       sound(self.owner, CH_TRIGGER, SND_KA_PICKEDUP, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
 
        // scoring
        PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
@@ -154,7 +154,7 @@ void ka_DropEvent(entity plyr) // runs any time that a player is supposed to los
        ka_EventLog("dropped", plyr);
        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_KEEPAWAY_DROPPED, plyr.netname);
        Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_KEEPAWAY_DROPPED, plyr.netname);
-       sound(other, CH_TRIGGER, "keepaway/dropped.wav", VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
+       sound(other, CH_TRIGGER, SND_KA_DROPPED, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
 
        // scoring
        // PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1); Not anymore, this is 100% the same as pickups and is useless.
@@ -428,11 +428,6 @@ void ka_Initialize() // run at the start of a match, initiates game mode
        if(!g_keepaway)
                return;
 
-       precache_sound("keepaway/pickedup.wav");
-       precache_sound("keepaway/dropped.wav");
-       precache_sound("keepaway/respawn.wav");
-       precache_sound("keepaway/touch.wav");
-
        ka_ScoreRules();
        ka_SpawnBall();
 }
index 56e55d86d9c3e4791c3912c9b89983ecaf09339b..c02b42513bc9fae4bd26bb580026d79db0ab45eb 100644 (file)
@@ -63,12 +63,6 @@ float kh_interferemsg_time, kh_interferemsg_team;
 .float kh_previous_owner_playerid;
 .float kh_cp_duration;
 
-string kh_sound_capture = "kh/capture.wav";
-string kh_sound_destroy = "kh/destroy.wav";
-string kh_sound_drop = "kh/drop.wav";
-string kh_sound_collect = "kh/collect.wav";
-string kh_sound_alarm = "kh/alarm.wav";  // the new siren/alarm
-
 float kh_key_dropped, kh_key_carried;
 
 const float ST_KH_CAPS = 1;
@@ -430,7 +424,7 @@ void kh_Key_Damage(entity inflictor, entity attacker, float damage, int deathtyp
 
 void kh_Key_Collect(entity key, entity player)  //a player picks up a dropped key
 {
-       sound(player, CH_TRIGGER, kh_sound_collect, VOL_BASE, ATTEN_NORM);
+       sound(player, CH_TRIGGER, SND_KH_COLLECT, VOL_BASE, ATTEN_NORM);
 
        if(key.kh_dropperteam != player.team)
        {
@@ -575,7 +569,7 @@ void kh_WinnerTeam(float teem)  // runs when a team wins // Samual: Teem?.... TE
        midpoint = midpoint * (1 / kh_teams);
        te_customflash(midpoint, 1000, 1, Team_ColorRGB(teem) * 0.5 + '0.5 0.5 0.5');  // make the color >=0.5 in each component
 
-       play2all(kh_sound_capture);
+       play2all(SND(KH_CAPTURE));
        kh_FinishRound();
 }
 
@@ -664,7 +658,7 @@ void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a fl
 
        Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_ENT_4(lostkey, INFO_KEYHUNT_LOST_), lostkey.kh_previous_owner.netname);
 
-       play2all(kh_sound_destroy);
+       play2all(SND(KH_DESTROY));
        te_tarexplosion(lostkey.origin);
 
        kh_FinishRound();
@@ -696,7 +690,7 @@ void kh_Key_Think()  // runs all the time
        {
                if(self.siren_time < time)
                {
-                       sound(self.owner, CH_TRIGGER, kh_sound_alarm, VOL_BASE, ATTEN_NORM);  // play a simple alarm
+                       sound(self.owner, CH_TRIGGER, SND_KH_ALARM, VOL_BASE, ATTEN_NORM);  // play a simple alarm
                        self.siren_time = time + 2.5;  // repeat every 2.5 seconds
                }
 
@@ -832,7 +826,7 @@ void kh_Key_DropOne(entity key)
        key.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
        key.kh_dropperteam = key.team;
 
-       sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTEN_NORM);
+       sound(player, CH_TRIGGER, SND_KH_DROP, VOL_BASE, ATTEN_NORM);
 }
 
 void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
@@ -858,7 +852,7 @@ void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
                        if(suicide)
                                key.kh_dropperteam = player.team;
                }
-               sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTEN_NORM);
+               sound(player, CH_TRIGGER, SND_KH_DROP, VOL_BASE, ATTEN_NORM);
        }
 }
 
@@ -1003,12 +997,6 @@ float kh_HandleFrags(entity attacker, entity targ, float f)  // adds to the play
 
 void kh_Initialize()  // sets up th KH environment
 {
-       precache_sound(kh_sound_capture);
-       precache_sound(kh_sound_destroy);
-       precache_sound(kh_sound_drop);
-       precache_sound(kh_sound_collect);
-       precache_sound(kh_sound_alarm);  // the new siren
-
        // setup variables
        kh_teams = autocvar_g_keyhunt_teams_override;
        if(kh_teams < 2)
index e3480a42e037dcdbf956b58e3daa2ab2eac893c9..3675831acc915ff9961e7eba121a77230707acf9 100644 (file)
@@ -207,7 +207,7 @@ void InitBall(void)
        self.teamtime = 0;
        self.pusher = world;
        self.team = false;
-       sound(self, CH_TRIGGER, self.noise1, VOL_BASE, ATTEN_NORM);
+       _sound(self, CH_TRIGGER, self.noise1, VOL_BASE, ATTEN_NORM);
        WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
        LogNB("init", world);
 }
@@ -254,7 +254,7 @@ void football_touch(void)
        {
                if(time > self.lastground + 0.1)
                {
-                       sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+                       _sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                        self.lastground = time;
                }
                if(vlen(self.velocity) && !self.cnt)
@@ -310,7 +310,7 @@ void basketball_touch(void)
        }
        else if(other.solid == SOLID_BSP)
        {
-               sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
+               _sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                if(vlen(self.velocity) && !self.cnt)
                        self.nextthink = min(time + autocvar_g_nexball_delay_idle, self.teamtime);
        }
@@ -376,7 +376,7 @@ void GoalTouch(void)
                pscore = 1;
        }
 
-       sound(ball, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NONE);
+       _sound(ball, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NONE);
 
        if(ball.team && pscore)
        {
@@ -408,8 +408,8 @@ void GoalTouch(void)
 //=======================//
 //        team ents       //
 //=======================//
-void spawnfunc_nexball_team(void)
-{SELFPARAM();
+spawnfunc(nexball_team)
+{
        if(!g_nexball)
        {
                remove(self);
@@ -515,13 +515,13 @@ void SpawnBall(void)
        if(!autocvar_g_nexball_sound_bounce)
                self.noise = "";
        else if(self.noise == "")
-               self.noise = "sound/nexball/bounce.wav";
+               self.noise = SND(NB_BOUNCE);
        //bounce sound placeholder (FIXME)
        if(self.noise1 == "")
-               self.noise1 = "sound/nexball/drop.wav";
+               self.noise1 = SND(NB_DROP);
        //ball drop sound placeholder (FIXME)
        if(self.noise2 == "")
-               self.noise2 = "sound/nexball/steal.wav";
+               self.noise2 = SND(NB_STEAL);
        //stealing sound placeholder (FIXME)
        if(self.noise) precache_sound(self.noise);
        precache_sound(self.noise1);
@@ -534,8 +534,8 @@ void SpawnBall(void)
        self.nextthink = game_starttime + autocvar_g_nexball_delay_start;
 }
 
-void spawnfunc_nexball_basketball(void)
-{SELFPARAM();
+spawnfunc(nexball_basketball)
+{
        nexball_mode |= NBM_BASKETBALL;
        self.classname = "nexball_basketball";
        if (!(balls & BALL_BASKET))
@@ -557,8 +557,8 @@ void spawnfunc_nexball_basketball(void)
        SpawnBall();
 }
 
-void spawnfunc_nexball_football(void)
-{SELFPARAM();
+spawnfunc(nexball_football)
+{
        nexball_mode |= NBM_FOOTBALL;
        self.classname = "nexball_football";
        self.solid = SOLID_TRIGGER;
@@ -598,40 +598,40 @@ void SpawnGoal(void)
        self.touch = GoalTouch;
 }
 
-void spawnfunc_nexball_redgoal(void)
-{SELFPARAM();
+spawnfunc(nexball_redgoal)
+{
        self.team = NUM_TEAM_1;
        SpawnGoal();
 }
-void spawnfunc_nexball_bluegoal(void)
-{SELFPARAM();
+spawnfunc(nexball_bluegoal)
+{
        self.team = NUM_TEAM_2;
        SpawnGoal();
 }
-void spawnfunc_nexball_yellowgoal(void)
-{SELFPARAM();
+spawnfunc(nexball_yellowgoal)
+{
        self.team = NUM_TEAM_3;
        SpawnGoal();
 }
-void spawnfunc_nexball_pinkgoal(void)
-{SELFPARAM();
+spawnfunc(nexball_pinkgoal)
+{
        self.team = NUM_TEAM_4;
        SpawnGoal();
 }
 
-void spawnfunc_nexball_fault(void)
-{SELFPARAM();
+spawnfunc(nexball_fault)
+{
        self.team = GOAL_FAULT;
        if(self.noise == "")
-               self.noise = "misc/typehit.wav";
+               self.noise = SND(TYPEHIT);
        SpawnGoal();
 }
 
-void spawnfunc_nexball_out(void)
-{SELFPARAM();
+spawnfunc(nexball_out)
+{
        self.team = GOAL_OUT;
        if(self.noise == "")
-               self.noise = "misc/typehit.wav";
+               self.noise = SND(TYPEHIT);
        SpawnGoal();
 }
 
@@ -639,34 +639,34 @@ void spawnfunc_nexball_out(void)
 //Spawnfuncs preserved for compatibility
 //
 
-void spawnfunc_ball(void)
+spawnfunc(ball)
 {
-       spawnfunc_nexball_football();
+       spawnfunc_nexball_football(this);
 }
-void spawnfunc_ball_football(void)
+spawnfunc(ball_football)
 {
-       spawnfunc_nexball_football();
+       spawnfunc_nexball_football(this);
 }
-void spawnfunc_ball_basketball(void)
+spawnfunc(ball_basketball)
 {
-       spawnfunc_nexball_basketball();
+       spawnfunc_nexball_basketball(this);
 }
 // The "red goal" is defended by blue team. A ball in there counts as a point for red.
-void spawnfunc_ball_redgoal(void)
+spawnfunc(ball_redgoal)
 {
-       spawnfunc_nexball_bluegoal();   // I blame Revenant
+       spawnfunc_nexball_bluegoal(this);       // I blame Revenant
 }
-void spawnfunc_ball_bluegoal(void)
+spawnfunc(ball_bluegoal)
 {
-       spawnfunc_nexball_redgoal();    // but he didn't mean to cause trouble :p
+       spawnfunc_nexball_redgoal(this);        // but he didn't mean to cause trouble :p
 }
-void spawnfunc_ball_fault(void)
+spawnfunc(ball_fault)
 {
-       spawnfunc_nexball_fault();
+       spawnfunc_nexball_fault(this);
 }
-void spawnfunc_ball_bound(void)
+spawnfunc(ball_bound)
 {
-       spawnfunc_nexball_out();
+       spawnfunc_nexball_out(this);
 }
 
 //=======================//
@@ -705,7 +705,7 @@ void W_Nexball_Touch(void)
                        if(!attacker.ballcarried)
                        {
                                LogNB("stole", attacker);
-                               sound(other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTEN_NORM);
+                               _sound(other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTEN_NORM);
 
                                if(SAME_TEAM(attacker, other) && time > attacker.teamkill_complain)
                                {
@@ -727,7 +727,7 @@ void W_Nexball_Attack(float t)
        if(!(ball = self.ballcarried))
                return;
 
-       W_SetupShot(self, false, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
+       W_SetupShot(self, false, 4, SND(NB_SHOOT1), CH_WEAPON_A, 0);
        tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
        if(trace_startsolid)
        {
@@ -761,7 +761,7 @@ void W_Nexball_Attack2(void)
        if(self.ballcarried.enemy)
        {
                entity _ball = self.ballcarried;
-               W_SetupShot(self, false, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
+               W_SetupShot(self, false, 4, SND(NB_SHOOT1), CH_WEAPON_A, 0);
                DropBall(_ball, w_shotorg, trigger_push_calculatevelocity(_ball.origin, _ball.enemy, 32));
                _ball.think = W_Nexball_Think;
                _ball.nextthink = time;
@@ -774,7 +774,7 @@ void W_Nexball_Attack2(void)
        entity missile;
        if(!(balls & BALL_BASKET))
                return;
-       W_SetupShot(self, false, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
+       W_SetupShot(self, false, 2, SND(NB_SHOOT2), CH_WEAPON_A, 0);
        missile = spawn();
 
        missile.owner = self;
@@ -860,9 +860,6 @@ float w_nexball_weapon(float req)
        }
        else if(req == WR_INIT)
        {
-               precache_sound("nexball/shoot1.wav");
-               precache_sound("nexball/shoot2.wav");
-               precache_sound("misc/typehit.wav");
        }
        else if(req == WR_SETUP)
        {
index e5d127748bb33edf212a67f98100865c698d1c38..35a8e7bdc76c92f9eb04356f197c02b73d762cbe 100644 (file)
@@ -31,7 +31,7 @@ void ons_CaptureShield_Touch()
 
        if(IS_REAL_CLIENT(other))
        {
-               play2(other, "onslaught/damageblockedbyshield.wav");
+               play2(other, SND(ONS_DAMAGEBLOCKEDBYSHIELD));
 
                if(self.enemy.classname == "onslaught_generator")
                        Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_ONS_GENERATOR_SHIELDED);
@@ -353,7 +353,7 @@ void ons_ControlPoint_Icon_Damage(entity inflictor, entity attacker, float damag
                if (time > self.pain_finished)
                        if (IS_PLAYER(attacker))
                        {
-                               play2(attacker, "onslaught/damageblockedbyshield.wav");
+                               play2(attacker, SND(ONS_DAMAGEBLOCKEDBYSHIELD));
                                self.pain_finished = time + 1;
                                attacker.typehitsound += 1; // play both sounds (shield is way too quiet)
                        }
@@ -364,7 +364,7 @@ void ons_ControlPoint_Icon_Damage(entity inflictor, entity attacker, float damag
        if(IS_PLAYER(attacker))
        if(time - ons_notification_time[self.team] > 10)
        {
-               play2team(self.team, "onslaught/controlpoint_underattack.wav");
+               play2team(self.team, SND(ONS_CONTROLPOINT_UNDERATTACK));
                ons_notification_time[self.team] = time;
        }
 
@@ -378,13 +378,13 @@ void ons_ControlPoint_Icon_Damage(entity inflictor, entity attacker, float damag
        pointparticles(particleeffectnum(EFFECT_SPARKS), hitloc, force*-1, 1);
        //sound on every hit
        if (random() < 0.5)
-               sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ONS_HIT1, VOL_BASE+0.3, ATTEN_NORM);
        else
-               sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ONS_HIT2, VOL_BASE+0.3, ATTEN_NORM);
 
        if (self.health < 0)
        {
-               sound(self, CH_TRIGGER, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM);
                pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), self.origin, '0 0 0', 1);
                Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM_4(self.team, INFO_ONSLAUGHT_CPDESTROYED_), self.owner.message, attacker.netname);
 
@@ -490,9 +490,9 @@ void ons_ControlPoint_Icon_Think()
                Send_Effect(EFFECT_ELECTRIC_SPARKS, self.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1);
 
                if(random() > 0.8)
-                       sound(self, CH_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_PAIN, SND_ONS_SPARK1, VOL_BASE, ATTEN_NORM);
                else if (random() > 0.5)
-                       sound(self, CH_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_PAIN, SND_ONS_SPARK2, VOL_BASE, ATTEN_NORM);
        }
 }
 
@@ -516,11 +516,11 @@ void ons_ControlPoint_Icon_BuildThink()
                self.health = self.max_health;
                self.count = autocvar_g_onslaught_cp_regen * ONS_CP_THINKRATE; // slow repair rate from now on
                self.think = ons_ControlPoint_Icon_Think;
-               sound(self, CH_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILT, VOL_BASE, ATTEN_NORM);
                self.owner.iscaptured = true;
                self.solid = SOLID_BBOX;
 
-               Send_Effect_(sprintf("%s_cap", Static_Team_ColorName_Lower(self.owner.team)), self.owner.origin, '0 0 0', 1);
+               Send_Effect(EFFECT_CAP(self.owner.team), self.owner.origin, '0 0 0', 1);
 
                WaypointSprite_UpdateMaxHealth(self.owner.sprite, self.max_health);
                WaypointSprite_UpdateHealth(self.owner.sprite, self.health);
@@ -572,13 +572,13 @@ void ons_ControlPoint_Icon_Spawn(entity cp, entity player)
        e.colormap = 1024 + (e.team - 1) * 17;
        e.count = (e.max_health - e.health) * ONS_CP_THINKRATE / autocvar_g_onslaught_cp_buildtime; // how long it takes to build
 
-       sound(e, CH_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTEN_NORM);
+       sound(e, CH_TRIGGER, SND_ONS_CONTROLPOINT_BUILD, VOL_BASE, ATTEN_NORM);
 
        cp.goalentity = e;
        cp.team = e.team;
        cp.colormap = e.colormap;
 
-       Send_Effect_(sprintf("%sflag_touch", Static_Team_ColorName_Lower(player.team)), e.origin, '0 0 0', 1);
+       Send_Effect(EFFECT_FLAG_TOUCH(player.team), e.origin, '0 0 0', 1);
 
        WaypointSprite_UpdateBuildFinished(cp.sprite, time + (e.max_health - e.health) / (e.count / ONS_CP_THINKRATE));
        WaypointSprite_UpdateRule(cp.sprite,cp.team,SPRITERULE_TEAMPLAY);
@@ -751,15 +751,6 @@ void ons_ControlPoint_Setup(entity cp)
 
        if(cp.message == "") { cp.message = "a"; }
 
-       // precache - TODO: clean up!
-       precache_sound("onslaught/controlpoint_build.wav");
-       precache_sound("onslaught/controlpoint_built.wav");
-       precache_sound(W_Sound("grenade_impact"));
-       precache_sound("onslaught/damageblockedbyshield.wav");
-       precache_sound("onslaught/controlpoint_underattack.wav");
-       precache_sound("onslaught/ons_spark1.wav");
-       precache_sound("onslaught/ons_spark2.wav");
-
        // appearence
        setmodel_fixsize(cp, MDL_ONS_CP_PAD1);
 
@@ -838,7 +829,7 @@ void ons_GeneratorDamage(entity inflictor, entity attacker, float damage, int de
                        if (time > self.pain_finished)
                                if (IS_PLAYER(attacker))
                                {
-                                       play2(attacker, "onslaught/damageblockedbyshield.wav");
+                                       play2(attacker, SND(ONS_DAMAGEBLOCKEDBYSHIELD));
                                        attacker.typehitsound += 1;
                                        self.pain_finished = time + 1;
                                }
@@ -849,7 +840,7 @@ void ons_GeneratorDamage(entity inflictor, entity attacker, float damage, int de
                        self.pain_finished = time + 10;
                        entity head;
                        FOR_EACH_REALPLAYER(head) if(SAME_TEAM(head, self)) { Send_Notification(NOTIF_ONE, head, MSG_CENTER, CENTER_GENERATOR_UNDERATTACK); }
-                       play2team(self.team, "onslaught/generator_underattack.wav");
+                       play2team(self.team, SND(ONS_GENERATOR_UNDERATTACK));
                }
        }
        self.health = self.health - damage;
@@ -890,7 +881,7 @@ void ons_GeneratorDamage(entity inflictor, entity attacker, float damage, int de
        // Throw some flaming gibs on damage, more damage = more chance for gib
        if(random() < damage/220)
        {
-               sound(self, CH_TRIGGER, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+               sound(self, CH_TRIGGER, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
        }
        else
        {
@@ -899,9 +890,9 @@ void ons_GeneratorDamage(entity inflictor, entity attacker, float damage, int de
 
                //sound on every hit
                if (random() < 0.5)
-                       sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_TRIGGER, SND_ONS_HIT1, VOL_BASE, ATTEN_NORM);
                else
-                       sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_TRIGGER, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM);
        }
 
        self.SendFlags |= GSF_STATUS;
@@ -921,7 +912,7 @@ void ons_GeneratorThink()
                                if(SAME_TEAM(e, self))
                                {
                                        Send_Notification(NOTIF_ONE, e, MSG_CENTER, CENTER_ONS_NOTSHIELDED_TEAM);
-                    soundto(MSG_ONE, e, CHAN_AUTO, "kh/alarm.wav", VOL_BASE, ATTEN_NONE);    // FIXME: unique sound?
+                    soundto(MSG_ONE, e, CHAN_AUTO, SND(KH_ALARM), VOL_BASE, ATTEN_NONE);    // FIXME: unique sound?
                 }
                                else
                                        Send_Notification(NOTIF_ONE, e, MSG_CENTER, APP_TEAM_NUM_4(self.team, CENTER_ONS_NOTSHIELDED_));
@@ -1008,16 +999,6 @@ void ons_GeneratorSetup(entity gen) // called when spawning a generator entity o
        gen.isshielded = true;
        gen.touch = onslaught_generator_touch;
 
-       // precache - TODO: clean up!
-       precache_sound("onslaught/generator_decay.wav");
-       precache_sound(W_Sound("grenade_impact"));
-       precache_sound(W_Sound("rocket_impact"));
-       precache_sound("onslaught/generator_underattack.wav");
-       precache_sound("onslaught/shockwave.wav");
-       precache_sound("onslaught/ons_hit1.wav");
-       precache_sound("onslaught/ons_hit2.wav");
-       precache_sound("onslaught/generator_underattack.wav");
-
        // appearence
        // model handled by CSQC
        setsize(gen, GENERATOR_MIN, GENERATOR_MAX);
@@ -1095,7 +1076,7 @@ bool Onslaught_CheckWinner()
                if (!wpforenemy_announced)
                {
                        Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_OVERTIME_CONTROLPOINT);
-                       sound(world, CH_INFO, "onslaught/generator_decay.wav", VOL_BASE, ATTEN_NONE);
+                       sound(world, CH_INFO, SND_ONS_GENERATOR_DECAY, VOL_BASE, ATTEN_NONE);
 
                        wpforenemy_announced = true;
                }
@@ -1149,7 +1130,7 @@ bool Onslaught_CheckWinner()
 
        ons_stalemate = false;
 
-       play2all(sprintf("ctf/%s_capture.wav", Static_Team_ColorName_Lower(winner_team)));
+       play2all(SND(CTF_CAPTURE(winner_team)));
 
        round_handler_Init(7, autocvar_g_onslaught_warmup, autocvar_g_onslaught_round_timelimit);
 
@@ -1658,7 +1639,7 @@ bool ons_Teleport(entity player, entity tele_target, float range, bool tele_effe
                                if ( tele_effects )
                                {
                                        Send_Effect(EFFECT_TELEPORT, player.origin, '0 0 0', 1);
-                                       sound (player, CH_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTEN_NORM);
+                                       sound (player, CH_TRIGGER, SND_TELEPORT, VOL_BASE, ATTEN_NORM);
                                }
                                setorigin(player, loc);
                                player.angles = '0 1 0' * ( theta * RAD2DEG + 180 );
@@ -2044,8 +2025,8 @@ keys:
 "target" - first control point.
 "target2" - second control point.
  */
-void spawnfunc_onslaught_link()
-{SELFPARAM();
+spawnfunc(onslaught_link)
+{
        if(!g_onslaught) { remove(self); return; }
 
        if (self.target == "" || self.target2 == "")
@@ -2069,8 +2050,8 @@ keys:
 "message" - name of this control point (should reflect the location in the map, such as "center bridge", "north tower", etc)
  */
 
-void spawnfunc_onslaught_controlpoint()
-{SELFPARAM();
+spawnfunc(onslaught_controlpoint)
+{
        if(!g_onslaught) { remove(self); return; }
 
        ons_ControlPoint_Setup(self);
@@ -2085,8 +2066,8 @@ keys:
 "team" - team that owns this generator (5 = red, 14 = blue, etc), MUST BE SET.
 "targetname" - name that spawnfunc_onslaught_link entities will use to target this.
  */
-void spawnfunc_onslaught_generator()
-{SELFPARAM();
+spawnfunc(onslaught_generator)
+{
        if(!g_onslaught) { remove(self); return; }
        if(!self.team) { objerror("team must be set"); }
 
@@ -2114,11 +2095,6 @@ void ons_DelayedInit() // Do this check with a delay so we can wait for teams to
 
 void ons_Initialize()
 {
-       precache_sound("ctf/red_capture.wav");
-       precache_sound("ctf/blue_capture.wav");
-       precache_sound("ctf/yellow_capture.wav");
-       precache_sound("ctf/pink_capture.wav");
-
        ons_captureshield_force = autocvar_g_onslaught_shield_force;
 
        addstat(STAT_ROUNDLOST, AS_INT, ons_roundlost);
index 27cc19b0ab8d029f17092ac75a8ad1e903263a84..451e4a55c32536d35ac84ec33b1b0add8dde0bec 100644 (file)
@@ -8,8 +8,8 @@ Note: If you use spawnfunc_tdm_team entities you must define at least 2!  Howeve
 Keys:
 "netname" Name of the team (for example Red, Blue, Green, Yellow, Life, Death, Offense, Defense, etc)...
 "cnt" Scoreboard color of the team (for example 4 is red and 13 is blue)... */
-void spawnfunc_tdm_team()
-{SELFPARAM();
+spawnfunc(tdm_team)
+{
        if(!g_tdm || !self.cnt) { remove(self); return; }
 
        self.classname = "tdm_team";
@@ -18,15 +18,12 @@ void spawnfunc_tdm_team()
 
 // code from here on is just to support maps that don't have team entities
 void tdm_SpawnTeam (string teamname, float teamcolor)
-{SELFPARAM();
-       setself(spawn());
-       self.classname = "tdm_team";
-       self.netname = teamname;
-       self.cnt = teamcolor;
-
-       spawnfunc_tdm_team();
-
-       setself(this);
+{
+       entity this = new(tdm_team);
+       this.netname = teamname;
+       this.cnt = teamcolor;
+       this.spawnfunc_checked = true;
+       WITH(entity, self, this, spawnfunc_tdm_team(this));
 }
 
 void tdm_DelayedInit()
index 79004e1c4163898d4c021d89fa2d2213564e5793..fb0c2b7b6feb8dec218c58d58e04b5ebb59688c4 100644 (file)
@@ -140,7 +140,7 @@ void buff_Respawn(entity ent)
 
        WaypointSprite_Ping(ent.buff_waypoint);
 
-       sound(ent, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
+       sound(ent, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
 }
 
 void buff_Touch()
@@ -178,7 +178,7 @@ void buff_Touch()
                        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ITEM_BUFF_LOST, other.netname, buffid);
 
                        other.buffs = 0;
-                       //sound(other, CH_TRIGGER, "relics/relic_effect.wav", VOL_BASE, ATTN_NORM);
+                       //sound(other, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
                }
                else { return; } // do nothing
        }
@@ -191,7 +191,7 @@ void buff_Touch()
        Send_Notification(NOTIF_ALL_EXCEPT, other, MSG_INFO, INFO_ITEM_BUFF, other.netname, buffid);
 
        Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(self), '0 0 0', 1);
-       sound(other, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM);
+       sound(other, CH_TRIGGER, SND_SHIELD_RESPAWN, VOL_BASE, ATTN_NORM);
        other.buffs |= (self.buffs);
 }
 
@@ -271,7 +271,7 @@ void buff_Think()
                if(!self.buff_activetime)
                {
                        self.buff_active = true;
-                       sound(self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTN_NORM);
                        Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(self), '0 0 0', 1);
                }
        }
@@ -596,7 +596,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerUseKey)
                Send_Notification(NOTIF_ALL_EXCEPT, self, MSG_INFO, INFO_ITEM_BUFF_LOST, self.netname, buffid);
 
                self.buffs = 0;
-               sound(self, CH_TRIGGER, "relics/relic_effect.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
                return true;
        }
        return false;
@@ -661,8 +661,8 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerThrowKey)
                        Send_Effect(EFFECT_ELECTRO_COMBO, their_org, '0 0 0', 1);
                        Send_Effect(EFFECT_ELECTRO_COMBO, my_org, '0 0 0', 1);
 
-                       sound(self, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTEN_NORM);
-                       sound(closest, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
+                       sound(closest, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
 
                        // TODO: add a counter to handle how many times one can teleport, and a delay to prevent spam
                        self.buffs = 0;
@@ -771,7 +771,7 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerThink)
                        if(buff_lost >= 2)
                        {
                                Send_Notification(NOTIF_ONE, self, MSG_MULTI, ITEM_BUFF_DROP, buffid); // TODO: special timeout message?
-                               sound(self, CH_TRIGGER, "relics/relic_effect.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
                        }
                        self.buffs = 0;
                }
@@ -957,12 +957,6 @@ void buffs_DelayedInit()
 
 void buffs_Initialize()
 {
-       precache_sound("misc/strength_respawn.wav");
-       precache_sound("misc/shield_respawn.wav");
-       precache_sound("relics/relic_effect.wav");
-       precache_sound(W_Sound("rocket_impact"));
-       precache_sound("keepaway/respawn.wav");
-
        addstat(STAT_BUFFS, AS_INT, buffs);
        addstat(STAT_BUFF_TIME, AS_FLOAT, buff_time);
 
index 7488fd29547f63a580db12efa28753aff847c9e8..cbe57ca2ac5f671c5c99325a5a2ca196e89a335c 100644 (file)
@@ -7,8 +7,8 @@
 
 #include "../../common/items/all.qc"
 
-void spawnfunc_item_minst_cells()
-{SELFPARAM();
+spawnfunc(item_minst_cells)
+{
        if (!g_instagib) { remove(self); return; }
        if (!self.ammo_cells) self.ammo_cells = autocvar_g_instagib_ammo_drop;
        StartItemA(ITEM_VaporizerCells);
@@ -187,7 +187,7 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups)
 
        if (self.items & ITEM_Invisibility.m_itemid)
        {
-               play_countdown(self.strength_finished, "misc/poweroff.wav");
+               play_countdown(self.strength_finished, SND(POWEROFF));
                if (time > self.strength_finished)
                {
                        self.alpha = default_player_alpha;
@@ -210,7 +210,7 @@ MUTATOR_HOOKFUNCTION(instagib_PlayerPowerups)
 
        if (self.items & ITEM_Speed.m_itemid)
        {
-               play_countdown(self.invincible_finished, "misc/poweroff.wav");
+               play_countdown(self.invincible_finished, SND(POWEROFF));
                if (time > self.invincible_finished)
                {
                        self.items &= ~ITEM_Speed.m_itemid;
@@ -357,7 +357,7 @@ MUTATOR_HOOKFUNCTION(instagib_FilterItem)
                e.noalign = self.noalign;
         e.cnt = self.cnt;
         e.team = self.team;
-               WITH(entity, self, e, spawnfunc_item_minst_cells());
+               WITH(entity, self, e, spawnfunc_item_minst_cells(e));
                return true;
        }
 
index 8beec7db2de94177af6921f1592058842cc9d704..87abd78a2c1d1a060fef72b4efd3bf35dda49683 100644 (file)
@@ -5,8 +5,14 @@ float instagib_respawntimejitter_ammo = 0;
 GETTER(float, instagib_respawntime_ammo)
 GETTER(float, instagib_respawntimejitter_ammo)
 
+#ifndef MENUQC
+MODEL(VaporizerCells_ITEM, Item_Model("a_cells.md3"));
+#endif
+
 REGISTER_ITEM(VaporizerCells, Ammo) {
-    this.m_model                =   "a_cells.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_VaporizerCells_ITEM;
+#endif
     this.m_sound                =   "misc/itempickup.wav";
     this.m_name                 =   "Vaporizer Ammo";
     this.m_icon                 =   "ammo_supercells";
@@ -18,8 +24,14 @@ REGISTER_ITEM(VaporizerCells, Ammo) {
 #endif
 }
 
+#ifndef MENUQC
+MODEL(ExtraLife_ITEM, Item_Model("g_h100.md3"));
+#endif
+
 REGISTER_ITEM(ExtraLife, Powerup) {
-    this.m_model                =   "g_h100.md3";
+#ifndef MENUQC
+    this.m_model                =   MDL_ExtraLife_ITEM;
+#endif
     this.m_sound                =   "misc/megahealth.wav";
     this.m_name                 =   "Extra life";
     this.m_icon                 =   "item_mega_health";
@@ -29,8 +41,14 @@ REGISTER_ITEM(ExtraLife, Powerup) {
     this.m_itemid               =   IT_NAILS;
 }
 
+#ifndef MENUQC
+MODEL(Invisibility_ITEM, Item_Model("g_strength.md3"));
+#endif
+
 REGISTER_ITEM(Invisibility, Powerup) {
-    this.m_model            =   "g_strength.md3";
+#ifndef MENUQC
+    this.m_model            =   MDL_Invisibility_ITEM;
+#endif
     this.m_sound            =   "misc/powerup.wav";
     this.m_name             =   "Invisibility";
     this.m_icon             =   "strength";
@@ -40,8 +58,14 @@ REGISTER_ITEM(Invisibility, Powerup) {
     this.m_itemid           =   IT_STRENGTH;
 }
 
+#ifndef MENUQC
+MODEL(Speed_ITEM, Item_Model("g_invincible.md3"));
+#endif
+
 REGISTER_ITEM(Speed, Powerup) {
-    this.m_model            =   "g_invincible.md3";
+#ifndef MENUQC
+    this.m_model            =   MDL_Speed_ITEM;
+#endif
     this.m_sound            =   "misc/powerup_shield.wav";
     this.m_name             =   "Speed";
     this.m_icon             =   "shield";
index 99c785482591566d980e983541454aa9def1dcee..19a0aa462c688f842043f9a703cc8bfd50862e44 100644 (file)
@@ -121,7 +121,7 @@ void nade_napalm_ball()
        entity proj;
        vector kick;
 
-       spamsound(self, CH_SHOTS, W_Sound("fireball_fire"), VOL_BASE, ATTEN_NORM);
+       spamsound(self, CH_SHOTS, SND(FIREBALL_FIRE), VOL_BASE, ATTEN_NORM);
 
        proj = spawn ();
        proj.owner = self.owner;
@@ -250,17 +250,9 @@ void nade_ice_think()
        {
                if ( autocvar_g_nades_ice_explode )
                {
-                       entity expef = NULL;
-                       switch(self.realowner.team)
-                       {
-                               case NUM_TEAM_1: expef = EFFECT_NADE_RED_EXPLODE; break;
-                               case NUM_TEAM_2: expef = EFFECT_NADE_BLUE_EXPLODE; break;
-                               case NUM_TEAM_3: expef = EFFECT_NADE_YELLOW_EXPLODE; break;
-                               case NUM_TEAM_4: expef = EFFECT_NADE_PINK_EXPLODE; break;
-                               default:                 expef = EFFECT_NADE_NEUTRAL_EXPLODE; break;
-                       }
+                       entity expef = EFFECT_NADE_EXPLODE(self.realowner.team);
                        Send_Effect(expef, self.origin + '0 0 1', '0 0 0', 1);
-                       sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+                       sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
 
                        RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
                                autocvar_g_nades_nade_radius, self, world, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy);
@@ -517,21 +509,15 @@ void nade_boom()
 
                default:
                case NADE_TYPE_NORMAL:
-                       switch(self.realowner.team)
-                       {
-                               case NUM_TEAM_1: expef = EFFECT_NADE_RED_EXPLODE; break;
-                               case NUM_TEAM_2: expef = EFFECT_NADE_BLUE_EXPLODE; break;
-                               case NUM_TEAM_3: expef = EFFECT_NADE_YELLOW_EXPLODE; break;
-                               case NUM_TEAM_4: expef = EFFECT_NADE_PINK_EXPLODE; break;
-                               default:                 expef = EFFECT_NADE_NEUTRAL_EXPLODE; break;
-                       }
+                       expef = EFFECT_NADE_EXPLODE(self.realowner.team);
+                       break;
        }
 
        if(expef)
                Send_Effect(expef, findbetterlocation(self.origin, 8), '0 0 0', 1);
 
-       sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
-       sound(self, CH_SHOTS, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
 
        self.event_damage = func_null; // prevent somehow calling damage in the next call
 
@@ -584,7 +570,7 @@ void nade_touch()
        //UpdateCSQCProjectile(self);
        if(self.health == self.max_health)
        {
-               spamsound(self, CH_SHOTS, W_Sound(strcat("grenade_bounce", ftos(1 + rint(random() * 5)))), VOL_BASE, ATTEN_NORM);
+               spamsound(self, CH_SHOTS, SND(GRENADE_BOUNCE_RANDOM()), VOL_BASE, ATTEN_NORM);
                return;
        }
 
@@ -594,7 +580,7 @@ void nade_touch()
 
 void nade_beep()
 {SELFPARAM();
-       sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.ogg", VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
+       sound(self, CH_SHOTS_SINGLE, SND_NADE_BEEP, VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
        self.think = nade_boom;
        self.nextthink = max(self.wait, time);
 }
@@ -649,7 +635,7 @@ void nade_damage(entity inflictor, entity attacker, float damage, int deathtype,
 
        if(self.health == self.max_health)
        {
-               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
+               sound(self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
                self.nextthink = max(time + autocvar_g_nades_nade_lifetime, time);
                self.think = nade_beep;
        }
@@ -759,7 +745,7 @@ void nades_GiveBonus(entity player, float score)
                if ( player.bonus_nade_score >= 1 )
                {
                        Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_NADE_BONUS);
-                       play2(player,"kh/alarm.wav");
+                       play2(player, SND(KH_ALARM));
                        player.bonus_nades++;
                        player.bonus_nade_score -= 1;
                }
@@ -1198,15 +1184,6 @@ void nades_Initialize()
        addstat(STAT_NADE_BONUS_SCORE, AS_FLOAT, bonus_nade_score);
        addstat(STAT_HEALING_ORB, AS_FLOAT, stat_healing_orb);
        addstat(STAT_HEALING_ORB_ALPHA, AS_FLOAT, stat_healing_orb_alpha);
-
-       precache_sound(W_Sound("rocket_impact"));
-       precache_sound(W_Sound("grenade_bounce1"));
-       precache_sound(W_Sound("grenade_bounce2"));
-       precache_sound(W_Sound("grenade_bounce3"));
-       precache_sound(W_Sound("grenade_bounce4"));
-       precache_sound(W_Sound("grenade_bounce5"));
-       precache_sound(W_Sound("grenade_bounce6"));
-       precache_sound("overkill/grenadebip.ogg");
 }
 
 MUTATOR_DEFINITION(mutator_nades)
index 172ee4d651430b2d8a6e08458f54cfb71a4f17f9..9b51d9abb8640fbcaf4f3bbcf5ef83d5f652f760 100644 (file)
@@ -190,8 +190,10 @@ MUTATOR_HOOKFUNCTION(nt_SetWeaponreplace)
 
 MUTATOR_HOOKFUNCTION(nt_FilterItem)
 {SELFPARAM();
-       if(nt_IsNewToy(self.weapon) && autocvar_g_new_toys_use_pickupsound)
-               self.item_pickupsound = W_Sound("weaponpickup_new_toys");
+       if(nt_IsNewToy(self.weapon) && autocvar_g_new_toys_use_pickupsound) {
+               self.item_pickupsound = string_null;
+               self.item_pickupsound_ent = SND_WEAPONPICKUP_NEW_TOYS;
+       }
        return 0;
 }
 
@@ -207,8 +209,6 @@ MUTATOR_DEFINITION(mutator_new_toys)
                if(time > 1) // game loads at time 1
                        error("This cannot be added at runtime\n");
 
-               precache_sound(W_Sound("weaponpickup_new_toys"));
-
                // mark the guns as ok to use by e.g. impulse 99
                float i;
                for(i = WEP_FIRST; i <= WEP_LAST; ++i)
index 5b7018b303c595be7813fe4e666625c34030346c..2114efc92d56cc0c1773e3b74a8c42a1e38d3875 100644 (file)
@@ -4,8 +4,8 @@
 #include "mutator.qh"
 
 void W_Blaster_Attack(float, float, float, float, float, float, float, float, float, float);
-void spawnfunc_weapon_hmg();
-void spawnfunc_weapon_rpc();
+spawnfunc(weapon_hmg);
+spawnfunc(weapon_rpc);
 
 void ok_DecreaseCharge(entity ent, int wep)
 {
@@ -84,7 +84,7 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDies)
        self.ok_item = true;
        self.noalign = true;
        self.pickup_anyway = true;
-       spawnfunc_item_armor_small();
+       spawnfunc_item_armor_small(this);
        self.movetype = MOVETYPE_TOSS;
        self.gravity = 1;
        self.reset = SUB_Remove;
@@ -174,7 +174,7 @@ MUTATOR_HOOKFUNCTION(ok_PlayerPreThink)
                {
                        //Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_OVERKILL_CHARGE);
                        self.ok_notice_time = time + 2;
-                       play2(self, W_Sound("dryfire"));
+                       play2(self, SND(DRYFIRE));
                }
                if(self.weaponentity.state != WS_CLEAR)
                        w_ready();
@@ -205,6 +205,9 @@ MUTATOR_HOOKFUNCTION(ok_PlayerSpawn)
        return false;
 }
 
+void _spawnfunc_weapon_hmg() { SELFPARAM(); spawnfunc_weapon_hmg(this); }
+void _spawnfunc_weapon_rpc() { SELFPARAM(); spawnfunc_weapon_rpc(this); }
+
 MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn)
 {SELFPARAM();
        if(autocvar_g_powerups)
@@ -222,7 +225,7 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn)
                        wep.team = self.team;
                        wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
                        wep.pickup_anyway = true;
-                       wep.think = spawnfunc_weapon_hmg;
+                       wep.think = _spawnfunc_weapon_hmg;
                        wep.nextthink = time + 0.1;
                        return true;
                }
@@ -239,7 +242,7 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn)
                        wep.team = self.team;
                        wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
                        wep.pickup_anyway = true;
-                       wep.think = spawnfunc_weapon_rpc;
+                       wep.think = _spawnfunc_weapon_rpc;
                        wep.nextthink = time + 0.1;
                        return true;
                }
@@ -316,8 +319,6 @@ void ok_Initialize()
 
        precache_all_playermodels("models/ok_player/*.dpm");
 
-       precache_sound(W_Sound("dryfire"));
-
        addstat(STAT_OK_AMMO_CHARGE, AS_FLOAT, ok_use_ammocharge);
        addstat(STAT_OK_AMMO_CHARGEPOOL, AS_FLOAT, ok_ammo_charge);
 
index 4f49d550d9704aa1d44a4959288db4dae0168770..faa74bb1dcf74e989eeb50311e1b83c82bd1fba6 100644 (file)
@@ -10,7 +10,7 @@ void PlayerTouchExplode(entity p1, entity p2)
        org = (p1.origin + p2.origin) * 0.5;
        org.z += (p1.mins.z + p2.mins.z) * 0.5;
 
-       sound(self, CH_TRIGGER, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
+       sound(self, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM);
        Send_Effect(EFFECT_EXPLOSION_SMALL, org, '0 0 0', 1);
 
        entity e;
index 509e920511e4cad52582e1737ebeb4f946567972..ed3ffc5e77dfe6c3cd90afdcdad0e8bf2475a3d4 100644 (file)
@@ -30,7 +30,7 @@ void sandbox_ObjectFunction_Touch()
        intensity -= autocvar_g_sandbox_object_material_velocity_min; // start from minimum velocity, not actual velocity
        intensity = bound(0, intensity * autocvar_g_sandbox_object_material_velocity_factor, 1);
 
-       sound(self, CH_TRIGGER, strcat("object/impact_", self.material, "_", ftos(ceil(random() * 5)) , ".wav"), VOL_BASE * intensity, ATTEN_NORM);
+       _sound(self, CH_TRIGGER, strcat("object/impact_", self.material, "_", ftos(ceil(random() * 5)) , ".wav"), VOL_BASE * intensity, ATTEN_NORM);
        Send_Effect_(strcat("impact_", self.material), self.origin, '0 0 0', ceil(intensity * 10)); // allow a count from 1 to 10
 }
 
diff --git a/qcsrc/server/pathlib.qc b/qcsrc/server/pathlib.qc
deleted file mode 100644 (file)
index a563a02..0000000
+++ /dev/null
@@ -1,973 +0,0 @@
-#include "pathlib.qh"
-#include "_all.qh"
-
-#define medium spawnshieldtime
-
-//#define DEBUGPATHING
-#ifdef DEBUGPATHING
-float edge_show(vector point,float fsize);
-void mark_error(vector where,float lifetime);
-void mark_info(vector where,float lifetime);
-entity mark_misc(vector where,float lifetime);
-
-void pathlib_showpath(entity start)
-{
-    entity e;
-    e = start;
-    while(e.path_next)
-    {
-        te_lightning1(e,e.origin,e.path_next.origin);
-        e = e.path_next;
-    }
-}
-
-void path_dbg_think()
-{
-    pathlib_showpath(self);
-    self.nextthink = time + 1;
-}
-
-void __showpath2_think()
-{
-    mark_info(self.origin,1);
-    if(self.path_next)
-    {
-        self.path_next.think     = __showpath2_think;
-        self.path_next.nextthink = time + 0.15;
-    }
-    else
-    {
-        self.owner.think     = __showpath2_think;
-        self.owner.nextthink = time + 0.15;
-    }
-}
-
-void pathlib_showpath2(entity path)
-{
-    path.think     = __showpath2_think;
-    path.nextthink = time;
-}
-
-#endif
-
-void pathlib_deletepath(entity start)
-{
-    entity e;
-
-    e = findchainentity(owner, start);
-    while(e)
-    {
-        e.think = SUB_Remove;
-        e.nextthink = time;
-        e = e.chain;
-    }
-}
-
-float  walknode_stepsize;
-vector walknode_stepup;
-vector walknode_maxdrop;
-vector walknode_boxup;
-vector walknode_boxmax;
-vector walknode_boxmin;
-float  pathlib_movenode_goodnode;
-
-float floor_ok(vector point)
-{
-    float pc;
-
-    if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
-        return 0;
-
-    pc = pointcontents(point);
-
-    switch(pc)
-    {
-        case CONTENT_SOLID:
-        case CONTENT_SLIME:
-        case CONTENT_LAVA:
-        case CONTENT_SKY:
-            return 0;
-        case CONTENT_EMPTY:
-            if(pointcontents(point - '0 0 1') != CONTENT_SOLID)
-                return 0;
-            break;
-        case CONTENT_WATER:
-            return 1;
-    }
-    if(pointcontents(point - '0 0 1') == CONTENT_SOLID)
-        return 1;
-
-    return 0;
-}
-
-#define _pcheck(p) traceline(p+z_up,p-z_down,MOVE_WORLDONLY,self); if (!floor_ok(trace_endpos)) return 1
-float edge_check(vector point,float fsize)
-{
-    vector z_up,z_down;
-
-    z_up   = '0 0 1' * fsize;
-    z_down = '0 0 1' * fsize;
-
-    _pcheck(point + ('1 1 0'  * fsize));
-    _pcheck(point + ('1 -1 0'  * fsize));
-    _pcheck(point + ('1 0 0' * fsize));
-
-    _pcheck(point + ('0 1 0'  * fsize));
-    _pcheck(point + ('0 -1 0' * fsize));
-
-    _pcheck(point + ('-1 0 0'  * fsize));
-    _pcheck(point + ('-1 1 0'  * fsize));
-    _pcheck(point + ('-1 -1 0' * fsize));
-
-    return 0;
-}
-
-#ifdef DEBUGPATHING
-#define _pshow(p) mark_error(p,10)
-float edge_show(vector point,float fsize)
-{
-
-    _pshow(point + ('1 1 0'  * fsize));
-    _pshow(point + ('1 -1 0' * fsize));
-    _pshow(point + ('1 0 0'  * fsize));
-
-    _pshow(point + ('0 1 0'  * fsize));
-    _pshow(point + ('0 -1 0' * fsize));
-
-    _pshow(point + ('-1 0 0'  * fsize));
-    _pshow(point + ('-1 1 0'  * fsize));
-    _pshow(point + ('-1 -1 0' * fsize));
-
-    return 0;
-}
-#endif
-
-var vector pathlib_movenode(vector start,vector end,float doedge);
-vector pathlib_wateroutnode(vector start,vector end,float doedge)
-{
-    vector surface;
-
-    pathlib_movenode_goodnode = 0;
-
-    end.x = fsnap(end.x, pathlib_gridsize);
-    end.y = fsnap(end.y, pathlib_gridsize);
-
-    traceline(end + ('0 0 0.25' * pathlib_gridsize),end - ('0 0 1' * pathlib_gridsize),MOVE_WORLDONLY,self);
-    end = trace_endpos;
-
-    if(pointcontents(end - '0 0 1') != CONTENT_SOLID)
-        return end;
-
-    for(surface = start ; surface.z < (end.z + 32); ++surface.z)
-    {
-        if(pointcontents(surface) == CONTENT_EMPTY)
-            break;
-    }
-
-    if(pointcontents(surface + '0 0 1') != CONTENT_EMPTY)
-        return end;
-
-    tracebox(start + '0 0 64', walknode_boxmin,walknode_boxmax, end + '0 0 64', MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
-
-    if(fabs(surface.z - end.z) > 32)
-        pathlib_movenode_goodnode = 0;
-
-    return end;
-}
-
-vector pathlib_swimnode(vector start,vector end,float doedge)
-{
-    pathlib_movenode_goodnode = 0;
-
-    if(pointcontents(start) != CONTENT_WATER)
-        return end;
-
-    end.x = fsnap(end.x, pathlib_gridsize);
-    end.y = fsnap(end.y, pathlib_gridsize);
-
-    if(pointcontents(end) == CONTENT_EMPTY)
-        return pathlib_wateroutnode( start, end, doedge);
-
-    tracebox(start, walknode_boxmin,walknode_boxmax, end, MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
-
-    return end;
-}
-
-vector pathlib_flynode(vector start,vector end)
-{
-    pathlib_movenode_goodnode = 0;
-
-    end.x = fsnap(end.x, pathlib_gridsize);
-    end.y = fsnap(end.y, pathlib_gridsize);
-
-    tracebox(start, walknode_boxmin,walknode_boxmax, end, MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
-
-    return end;
-}
-
-vector pathlib_walknode(vector start,vector end,float doedge)
-{
-    vector direction,point,last_point,s,e;
-    float steps, distance, i,laststep;
-
-    pathlib_movenode_goodnode = 0;
-
-    s   = start;
-    e   = end;
-    e.z = 0;
-    s.z = 0;
-    direction  = normalize(s - e);
-
-    distance    = vlen(start - end);
-    laststep    = distance / walknode_stepsize;
-    steps       = floor(laststep);
-    laststep    = laststep - steps;
-
-    point = start;
-    s     = point + walknode_stepup;
-    e     = point - walknode_maxdrop;
-
-    traceline(s, e,MOVE_WORLDONLY,self);
-    if(trace_fraction == 1.0)
-        return trace_endpos;
-
-    if (floor_ok(trace_endpos) == 0)
-        return trace_endpos;
-
-    last_point = trace_endpos;
-
-    for(i = 0; i < steps; ++i)
-    {
-        point = last_point + direction * walknode_stepsize;
-
-        s = point + walknode_stepup;
-        e = point - walknode_maxdrop;
-        traceline(s, e,MOVE_WORLDONLY,self);
-        if(trace_fraction == 1.0)
-            return trace_endpos;
-
-        point = trace_endpos;
-        if (!floor_ok(trace_endpos))
-            return trace_endpos;
-
-        tracebox(last_point + walknode_boxup, walknode_boxmin,walknode_boxmax, point + walknode_boxup, MOVE_WORLDONLY, self);
-        if(trace_fraction != 1.0)
-            return trace_endpos;
-
-        if(doedge)
-        if(edge_check(point,pathlib_edge_check_size))
-            return trace_endpos;
-
-        last_point = point;
-    }
-
-    point = last_point + direction * walknode_stepsize * laststep;
-
-    point.x = fsnap(point.x, pathlib_gridsize);
-    point.y = fsnap(point.y, pathlib_gridsize);
-
-    s = point + walknode_stepup;
-    e = point - walknode_maxdrop;
-    traceline(s, e,MOVE_WORLDONLY,self);
-
-    if(trace_fraction == 1.0)
-        return trace_endpos;
-
-    point = trace_endpos;
-
-    if (!floor_ok(trace_endpos))
-        return trace_endpos;
-
-    tracebox(last_point + walknode_boxup, walknode_boxmin,walknode_boxmax, point + walknode_boxup, MOVE_WORLDONLY, self);
-    if(trace_fraction != 1.0)
-        return trace_endpos;
-
-    pathlib_movenode_goodnode = 1;
-    return point;
-}
-
-var float pathlib_cost(entity parent,vector to, float static_cost);
-float pathlib_g_static(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + static_cost * pathlib_movecost_waterfactor;
-    else
-        return parent.pathlib_node_g + static_cost;
-}
-
-float pathlib_g_static_water(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + static_cost * pathlib_movecost_waterfactor;
-    else
-        return parent.pathlib_node_g + static_cost;
-}
-
-float pathlib_g_euclidean(entity parent,vector to, float static_cost)
-{
-    return parent.pathlib_node_g + vlen(parent.origin - to);
-}
-float pathlib_g_euclidean_water(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + vlen(parent.origin - to) * pathlib_movecost_waterfactor;
-    else
-        return parent.pathlib_node_g + vlen(parent.origin - to);
-}
-
-var float(vector from,vector to) pathlib_heuristic;
-
-/**
-    Manhattan Menas we expect to move up,down left or right
-    No diagonal moves espected. (like moving bewteen city blocks)
-**/
-float pathlib_h_manhattan(vector a,vector b)
-{
-    //h(n) = D * (abs(n.x-goal.x) + abs(n.y-goal.y))
-
-    float h;
-    h  = fabs(a.x - b.x);
-    h += fabs(a.y - b.y);
-    h *= pathlib_gridsize;
-
-    return h;
-}
-
-/**
-    This heuristic consider both stright and disagonal moves
-    to have teh same cost.
-**/
-float pathlib_h_diagonal(vector a,vector b)
-{
-    //h(n) = D * max(abs(n.x-goal.x), abs(n.y-goal.y))
-    float h,x,y;
-
-    x = fabs(a.x - b.x);
-    y = fabs(a.y - b.y);
-    h = pathlib_movecost * max(x,y);
-
-    return h;
-}
-
-/**
-    This heuristic only considers the stright line distance.
-    Will usualy mean a lower H then G meaning A* Will speand more
-    and run slower.
-**/
-float pathlib_h_euclidean(vector a,vector b)
-{
-    return vlen(a - b);
-}
-
-/**
-    This heuristic consider both stright and disagonal moves,
-    But has a separate cost for diagonal moves.
-**/
-float pathlib_h_diagonal2(vector a,vector b)
-{
-    float h_diag,h_str,h,x,y;
-
-    /*
-    h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
-    */
-
-    x = fabs(a.x - b.x);
-    y = fabs(a.y - b.y);
-
-    h_diag = min(x,y);
-    h_str = x + y;
-
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
-
-    return h;
-}
-
-/**
-    This heuristic consider both stright and disagonal moves,
-    But has a separate cost for diagonal moves.
-
-
-**/
-float pathlib_h_diagonal2sdp(vector preprev,vector prev,vector point,vector end)
-{
-    float h_diag,h_str,h,x,y,z;
-
-    //h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    //h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    //h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
-
-    x = fabs(point.x - end.x);
-    y = fabs(point.y - end.y);
-    z = fabs(point.z - end.z);
-
-    h_diag = min3(x,y,z);
-    h_str = x + y + z;
-
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
-
-    float m;
-    vector d1,d2;
-
-    d1 = normalize(preprev - point);
-    d2 = normalize(prev    - point);
-    m = vlen(d1-d2);
-    //bprint("pathlib_h_diagonal2sdp-M = ",ftos(m),"\n");
-
-    return h * m;
-}
-
-
-float pathlib_h_diagonal3(vector a,vector b)
-{
-    float h_diag,h_str,h,x,y,z;
-
-    //h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    //h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    //h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
-
-    x = fabs(a.x - b.x);
-    y = fabs(a.y - b.y);
-    z = fabs(a.z - b.z);
-
-    h_diag = min3(x,y,z);
-    h_str = x + y + z;
-
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
-
-    return h;
-}
-
-const float PATHLIB_NODEEXPIRE = 0.05;
-float pathlib_scraplist_cnt;
-entity newnode()
-{
-    entity n;
-#ifdef PATHLIB_USE_NODESCRAP
-    if(pathlib_scraplist_cnt)
-    {
-        n = findentity(world,owner,scraplist);
-        if(n)
-        {
-            --pathlib_scraplist_cnt;
-            ++pathlib_recycle_cnt;
-            return n;
-        }
-        else
-            pathlib_scraplist_cnt = 0;
-    }
-#endif
-    ++pathlib_made_cnt;
-    n = spawn();
-    n.think      = SUB_Remove;
-    n.nextthink  = time + PATHLIB_NODEEXPIRE;
-    return n;
-}
-
-void dumpnode(entity n)
-{
-#ifdef PATHLIB_USE_NODESCRAP
-    ++pathlib_scraplist_cnt;
-
-    n.path_next    = world;
-    n.path_prev    = world;
-    n.is_path_node = false;
-    n.owner        = scraplist;
-#else
-    //n.is_path_node = false;
-    n.think        = SUB_Remove;
-    n.nextthink    = time;
-#endif
-}
-
-entity pathlib_mknode(vector where,entity parent)
-{
-    entity node;
-
-    node              = newnode();
-    node.is_path_node = true;
-    node.owner        = openlist;
-    node.path_prev    = parent;
-
-    setorigin(node, where);
-
-    ++pathlib_open_cnt;
-
-    node.medium = pointcontents(where);
-
-    return node;
-}
-
-var float pathlib_expandnode(entity node, vector start, vector goal);
-float pathlib_expandnode_star(entity node, vector start, vector goal);
-float pathlib_expandnode_box(entity node, vector start, vector goal);
-
-var float pathlib_makenode(entity parent,vector start, vector to, vector goal,float cost);
-float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector goal,float cost)
-{
-    entity node;
-    float h,g,f,doedge;
-    vector where;
-
-    ++pathlib_searched_cnt;
-
-    if(inwater(parent.origin))
-    {
-        pathlib_expandnode = pathlib_expandnode_box;
-        pathlib_movenode   = pathlib_swimnode;
-       doedge = 0;
-    }
-    else
-    {
-        if(inwater(to))
-        {
-            pathlib_expandnode = pathlib_expandnode_box;
-            pathlib_movenode   = pathlib_swimnode;
-           doedge = 0;
-        }
-        else
-        {
-
-            pathlib_expandnode = pathlib_expandnode_star;
-            pathlib_movenode   = pathlib_walknode;
-            doedge = 1;
-        }
-    }
-
-    where = pathlib_movenode(parent.origin,to,0);
-    if (!pathlib_movenode_goodnode)
-        return 0;
-
-    if(doedge)
-    if(edge_check(where,pathlib_edge_check_size))
-        return 0;
-
-    if(parent.path_prev)
-        pathlib_h_diagonal2sdp(parent.path_prev.origin,parent.origin,where,goal);
-
-    h = pathlib_heuristic(where,goal);
-    g = pathlib_cost(parent,where,cost);
-    f = g + h;
-
-    node = findradius(where,pathlib_gridsize * 0.75);
-    while(node)
-    {
-        if(node.is_path_node == true)
-        {
-            ++pathlib_merge_cnt;
-            if(node.owner == openlist)
-            {
-                if(node.pathlib_node_g > g)
-                {
-                    node.pathlib_node_h = h;
-                    node.pathlib_node_g = g;
-                    node.pathlib_node_f = f;
-                    node.path_prev = parent;
-                }
-
-                if (!best_open_node)
-                    best_open_node = node;
-                else if(best_open_node.pathlib_node_f > node.pathlib_node_f)
-                    best_open_node = node;
-            }
-
-            return 1;
-        }
-        node = node.chain;
-    }
-
-    node = pathlib_mknode(where,parent);
-    node.pathlib_node_h = h;
-    node.pathlib_node_g = g;
-    node.pathlib_node_f = f;
-
-    if (!best_open_node)
-        best_open_node = node;
-    else if(best_open_node.pathlib_node_f > node.pathlib_node_f)
-        best_open_node = node;
-
-    return 1;
-}
-
-entity pathlib_getbestopen()
-{
-    entity node;
-    entity bestnode;
-
-    if(best_open_node)
-    {
-        ++pathlib_bestcash_hits;
-        pathlib_bestcash_saved += pathlib_open_cnt;
-
-        return best_open_node;
-    }
-
-    node = findchainentity(owner,openlist);
-    if(!node)
-        return world;
-
-    bestnode = node;
-    while(node)
-    {
-        ++pathlib_bestopen_seached;
-        if(node.pathlib_node_f < bestnode.pathlib_node_f)
-            bestnode = node;
-
-        node = node.chain;
-    }
-
-    return bestnode;
-}
-
-void pathlib_close_node(entity node,vector goal)
-{
-
-    if(node.owner == closedlist)
-    {
-        LOG_TRACE("Pathlib: Tried to close a closed node!\n");
-        return;
-    }
-
-    if(node == best_open_node)
-        best_open_node = world;
-
-    ++pathlib_closed_cnt;
-    --pathlib_open_cnt;
-
-    node.owner = closedlist;
-
-    if(vlen(node.origin - goal) <= pathlib_gridsize)
-    {
-        vector goalmove;
-
-        goalmove = pathlib_walknode(node.origin,goal,1);
-        if(pathlib_movenode_goodnode)
-        {
-            goal_node         = node;
-            pathlib_foundgoal = true;
-        }
-    }
-}
-
-float pathlib_expandnode_star(entity node, vector start, vector goal)
-{
-    vector point;
-    vector where;
-    float nodecnt = 0;
-
-    where = node.origin;
-
-    v_forward = '1 0 0';
-    v_right   = '0 1 0';
-
-    // Forward
-    point = where + v_forward * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
-
-    // Back
-    point = where - v_forward * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
-
-    // Right
-    point = where + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
-
-    // Left
-    point = where - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
-
-    // Forward-right
-    point = where + v_forward * pathlib_gridsize + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    // Forward-left
-    point = where + v_forward * pathlib_gridsize - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    // Back-right
-    point = where - v_forward * pathlib_gridsize + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    // Back-left
-    point = where - v_forward * pathlib_gridsize - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    return pathlib_open_cnt;
-}
-
-float pathlib_expandnode_box(entity node, vector start, vector goal)
-{
-    vector v;
-
-    for(v.z = node.origin.z - pathlib_gridsize; v.z <= node.origin.z + pathlib_gridsize; v.z += pathlib_gridsize)
-    for(v.y = node.origin.y - pathlib_gridsize; v.y <= node.origin.y + pathlib_gridsize; v.y += pathlib_gridsize)
-    for(v.x = node.origin.x - pathlib_gridsize; v.x <= node.origin.x + pathlib_gridsize; v.x += pathlib_gridsize)
-    {
-        if(vlen(v - node.origin))
-            pathlib_makenode(node,start,v,goal,pathlib_movecost);
-    }
-
-    return pathlib_open_cnt;
-}
-
-void pathlib_cleanup()
-{
-    entity node;
-
-    node = findfloat(world,is_path_node, true);
-    while(node)
-    {
-        dumpnode(node);
-        node = findfloat(node,is_path_node, true);
-    }
-
-    if(openlist)
-        remove(openlist);
-
-    if(closedlist)
-        remove(closedlist);
-
-    best_open_node = world;
-    openlist       = world;
-    closedlist     = world;
-}
-
-var float buildpath_nodefilter(vector n,vector c,vector p);
-float buildpath_nodefilter_directional(vector n,vector c,vector p)
-{
-    vector d1,d2;
-
-    d2 = normalize(p - c);
-    d1 = normalize(c - n);
-
-    if(vlen(d1-d2) < 0.25)
-        return 1;
-
-    return 0;
-}
-
-float buildpath_nodefilter_moveskip(vector n,vector c,vector p)
-{
-    pathlib_walknode(p,n,1);
-    if(pathlib_movenode_goodnode)
-        return 1;
-
-    return 0;
-}
-
-entity path_build(entity next, vector where, entity prev, entity start)
-{
-    entity path;
-
-    if(prev && next)
-        if(buildpath_nodefilter)
-            if(buildpath_nodefilter(next.origin,where,prev.origin))
-                return next;
-
-
-    path           = spawn();
-    path.owner     = start;
-    path.path_next = next;
-
-    setorigin(path,where);
-
-    if(!next)
-        path.classname = "path_end";
-    else
-    {
-        if(!prev)
-            path.classname = "path_start";
-        else
-            path.classname = "path_node";
-    }
-
-    return path;
-}
-
-entity pathlib_astar(vector from,vector to)
-{
-    entity path, start, end, open, n, ln;
-    float ptime, ftime, ctime;
-
-    ptime = gettime(GETTIME_REALTIME);
-
-    pathlib_cleanup();
-
-    // Select water<->land capable node make/link
-    pathlib_makenode     = pathlib_makenode_adaptive;
-    // Select XYZ cost estimate
-    pathlib_heuristic    = pathlib_h_diagonal3;
-    // Select distance + waterfactor cost
-    pathlib_cost         = pathlib_g_euclidean_water;
-    // Select star expander
-    pathlib_expandnode   = pathlib_expandnode_star;
-    // Select walk simulation movement test
-    pathlib_movenode     = pathlib_walknode;
-    // Filter final nodes by direction
-    buildpath_nodefilter = buildpath_nodefilter_directional;
-
-    // If the start is in water we need diffrent settings
-    if(inwater(from))
-    {
-        // Select volumetric node expaner
-        pathlib_expandnode = pathlib_expandnode_box;
-
-        // Water movement test
-        pathlib_movenode   = pathlib_swimnode;
-    }
-
-    if (!openlist)
-        openlist       = spawn();
-
-    if (!closedlist)
-        closedlist     = spawn();
-
-    if (!scraplist)
-        scraplist      = spawn();
-
-    pathlib_closed_cnt       = 0;
-    pathlib_open_cnt         = 0;
-    pathlib_made_cnt         = 0;
-    pathlib_merge_cnt        = 0;
-    pathlib_searched_cnt     = 0;
-    pathlib_bestopen_seached = 0;
-    pathlib_bestcash_hits    = 0;
-    pathlib_bestcash_saved   = 0;
-    pathlib_recycle_cnt      = 0;
-
-    pathlib_gridsize       = 128;
-    pathlib_movecost       = pathlib_gridsize;
-    pathlib_movecost_diag  = vlen(('1 1 0' * pathlib_gridsize));
-    pathlib_movecost_waterfactor = 1.1;
-    pathlib_foundgoal      = 0;
-
-    walknode_boxmax   = self.maxs * 1.5;
-    walknode_boxmin   = self.mins * 1.5;
-
-    pathlib_edge_check_size = (vlen(walknode_boxmin - walknode_boxmax) * 0.5);
-
-    walknode_boxup    = '0 0 2' * self.maxs.z;
-    walknode_stepsize = 32;
-    walknode_stepup   = '0 0 1' * walknode_stepsize;
-    walknode_maxdrop  = '0 0 3' * walknode_stepsize;
-
-    from.x = fsnap(from.x,pathlib_gridsize);
-    from.y = fsnap(from.y,pathlib_gridsize);
-
-    to.x = fsnap(to.x,pathlib_gridsize);
-    to.y = fsnap(to.y,pathlib_gridsize);
-
-    LOG_TRACE("AStar init. ", ftos(pathlib_scraplist_cnt), " nodes on scrap\n");
-    path = pathlib_mknode(from,world);
-    pathlib_close_node(path,to);
-    if(pathlib_foundgoal)
-    {
-        LOG_TRACE("AStar: Goal found on first node!\n");
-
-        open           = spawn();
-        open.owner     = open;
-        open.classname = "path_end";
-        setorigin(open,path.origin);
-
-        pathlib_cleanup();
-
-        return open;
-    }
-
-    if(pathlib_expandnode(path,from,to) <= 0)
-    {
-        LOG_TRACE("AStar path fail.\n");
-        pathlib_cleanup();
-
-        return world;
-    }
-
-    best_open_node = pathlib_getbestopen();
-    n = best_open_node;
-    pathlib_close_node(best_open_node,to);
-    if(inwater(n.origin))
-        pathlib_expandnode_box(n,from,to);
-    else
-        pathlib_expandnode_star(n,from,to);
-
-    while(pathlib_open_cnt)
-    {
-        best_open_node = pathlib_getbestopen();
-        n = best_open_node;
-        pathlib_close_node(best_open_node,to);
-
-        if(inwater(n.origin))
-            pathlib_expandnode_box(n,from,to);
-        else
-            pathlib_expandnode(n,from,to);
-
-        if(pathlib_foundgoal)
-        {
-            LOG_TRACE("Target found. Rebuilding and filtering path...\n");
-            ftime = gettime(GETTIME_REALTIME);
-            ptime = ftime - ptime;
-
-            start = path_build(world,path.origin,world,world);
-            end   = path_build(world,goal_node.origin,world,start);
-            ln    = end;
-
-            open = goal_node;
-            for(open = goal_node; open.path_prev != path; open = open.path_prev)
-            {
-                n    = path_build(ln,open.origin,open.path_prev,start);
-                ln.path_prev = n;
-                ln = n;
-            }
-            start.path_next = n;
-            n.path_prev = start;
-            ftime = gettime(GETTIME_REALTIME) - ftime;
-
-            ctime = gettime(GETTIME_REALTIME);
-            pathlib_cleanup();
-            ctime = gettime(GETTIME_REALTIME) - ctime;
-
-
-#ifdef DEBUGPATHING
-            pathlib_showpath2(start);
-
-            LOG_TRACE("Time used -      pathfinding: ", ftos(ptime),"\n");
-            LOG_TRACE("Time used - rebuild & filter: ", ftos(ftime),"\n");
-            LOG_TRACE("Time used -          cleanup: ", ftos(ctime),"\n");
-            LOG_TRACE("Time used -            total: ", ftos(ptime + ftime + ctime),"\n");
-            LOG_TRACE("Time used -         # frames: ", ftos(ceil((ptime + ftime + ctime) / sys_frametime)),"\n\n");
-            LOG_TRACE("Nodes -         created: ", ftos(pathlib_made_cnt),"\n");
-            LOG_TRACE("Nodes -            open: ", ftos(pathlib_open_cnt),"\n");
-            LOG_TRACE("Nodes -          merged: ", ftos(pathlib_merge_cnt),"\n");
-            LOG_TRACE("Nodes -          closed: ", ftos(pathlib_closed_cnt),"\n");
-            LOG_TRACE("Nodes -        searched: ", ftos(pathlib_searched_cnt),"\n");
-
-        if(pathlib_recycle_cnt)
-            LOG_TRACE("Nodes -      make/reuse: ", ftos(pathlib_made_cnt / pathlib_recycle_cnt),"\n");
-        if(pathlib_recycle_cnt)
-            LOG_TRACE("Nodes -          reused: ", ftos(pathlib_recycle_cnt),"\n");
-
-            LOG_TRACE("Nodes bestopen searched: ", ftos(pathlib_bestopen_seached),"\n");
-            LOG_TRACE("Nodes bestcash -   hits: ", ftos(pathlib_bestcash_hits),"\n");
-            LOG_TRACE("Nodes bestcash -   save: ", ftos(pathlib_bestcash_saved),"\n");
-            LOG_TRACE("AStar done. ", ftos(pathlib_scraplist_cnt), " nodes on scrap\n\n");
-#endif
-            return start;
-        }
-    }
-
-    LOG_TRACE("A* Faild to find a path! Try a smaller gridsize.\n");
-
-    pathlib_cleanup();
-
-    return world;
-}
diff --git a/qcsrc/server/pathlib.qh b/qcsrc/server/pathlib.qh
deleted file mode 100644 (file)
index da4ae0c..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef PATHLIB_H
-#define PATHLIB_H
-
-//#define PATHLIB_RDFIELDS
-#ifdef PATHLIB_RDFIELDS
-    #define path_next swampslug
-    #define path_prev lasertarget
-#else
-    .entity path_next;
-    .entity path_prev;
-#endif
-
-entity openlist;
-entity closedlist;
-entity scraplist;
-
-.float pathlib_node_g;
-.float pathlib_node_h;
-.float pathlib_node_f;
-
-float pathlib_open_cnt;
-float pathlib_closed_cnt;
-float pathlib_made_cnt;
-float pathlib_merge_cnt;
-float pathlib_recycle_cnt;
-float pathlib_searched_cnt;
-
-float pathlib_bestopen_seached;
-float pathlib_bestcash_hits;
-float pathlib_bestcash_saved;
-
-float pathlib_gridsize;
-
-float pathlib_movecost;
-float pathlib_movecost_diag;
-float pathlib_movecost_waterfactor;
-
-float pathlib_edge_check_size;
-
-float pathlib_foundgoal;
-entity goal_node;
-
-entity best_open_node;
-.float is_path_node;
-
-#define inwater(point) (pointcontents(point) == CONTENT_WATER)
-
-#endif
index 878e8fd5b113fda6f8e03a6fb6f2b04521999d85..3e452f66e7dc02dbf2937410c44e08ba8684f95d 100644 (file)
@@ -1,4 +1,4 @@
-#include "../pathlib.qh"
+#include "pathlib.qh"
 
 float pathlib_g_static(entity parent,vector to, float static_cost)
 {
index 09dae70edcbfa192dd6dd136f3eeec6197f69f3b..37e167aae71064e0b87c927aaf8f730058b92e0b 100644 (file)
@@ -1,4 +1,4 @@
-#include "../pathlib.qh"
+#include "pathlib.qh"
 
 MODEL(SQUARE,       "models/pathlib/square.md3");
 MODEL(SQUARE_GOOD,  "models/pathlib/goodsquare.md3");
index 7501b63607be225e551f2c4696879acf7fff14d4..30fa073849d9f9b5827a050a5b269ce1b7269b03 100644 (file)
@@ -414,14 +414,14 @@ void Portal_Remove(entity portal, float killed)
        if(killed)
        {
                fixedmakevectors(portal.mangle);
-               sound(portal, CH_SHOTS, "porto/explode.wav", VOL_BASE, ATTEN_NORM);
+               sound(portal, CH_SHOTS, SND_PORTO_EXPLODE, VOL_BASE, ATTEN_NORM);
                Send_Effect(EFFECT_ROCKET_EXPLODE, portal.origin + v_forward * 16, v_forward * 1024, 4);
                remove(portal);
        }
        else
        {
                Portal_MakeBrokenPortal(portal);
-               sound(portal, CH_SHOTS, "porto/expire.wav", VOL_BASE, ATTEN_NORM);
+               sound(portal, CH_SHOTS, SND_PORTO_EXPIRE, VOL_BASE, ATTEN_NORM);
                SUB_SetFade(portal, time, 0.5);
        }
 }
index 069c964590595c381586967b3b13619b6fa4f6e9..5d7af0cd2b85bfe76f5c1b9be8f1e827dae15b99 100644 (file)
@@ -30,7 +30,6 @@
 #include "mapvoting.qc"
 #include "miscfunctions.qc"
 #include "movelib.qc"
-// #include "pathlib.qc" // TODO: was never used. Seems to duplicate `pathlib/`
 #include "playerdemo.qc"
 #include "portals.qc"
 #include "race.qc"
@@ -84,6 +83,7 @@
 #include "../common/campaign_file.qc"
 #include "../common/campaign_setup.qc"
 #include "../common/effects/effects.qc"
+#include "../common/effects/effectinfo.qc"
 #include "../common/mapinfo.qc"
 #include "../common/monsters/spawn.qc"
 #include "../common/monsters/sv_monsters.qc"
 #include "../common/turrets/sv_turrets.qc"
 #include "../common/turrets/config.qc"
 #include "../common/turrets/util.qc"
-#include "../common/turrets/turrets.qc"
+#include "../common/turrets/all.qc"
 #include "../common/turrets/checkpoint.qc"
 #include "../common/turrets/targettrigger.qc"
 #include "../common/weapons/config.qc"
index 1638dc9855d6bc012cc48490a5cbbb0afbc684d3..fbf1eaa185af29a2b6a5d3ab61b72410e6763e6c 100644 (file)
@@ -86,7 +86,7 @@ string race_readName(string map, float pos)
 
 const float MAX_CHECKPOINTS = 255;
 
-void spawnfunc_target_checkpoint();
+spawnfunc(target_checkpoint);
 
 .float race_penalty;
 .float race_penalty_accumulator;
@@ -929,8 +929,8 @@ vector trigger_race_checkpoint_spawn_evalfunc(entity player, entity spot, vector
        return current;
 }
 
-void spawnfunc_trigger_race_checkpoint()
-{SELFPARAM();
+spawnfunc(trigger_race_checkpoint)
+{
        vector o;
        if(!g_race && !g_cts) { remove(self); return; }
 
@@ -977,8 +977,8 @@ void spawnfunc_trigger_race_checkpoint()
        InitializeEntity(self, trigger_race_checkpoint_verify, INITPRIO_FINDTARGET);
 }
 
-void spawnfunc_target_checkpoint() // defrag entity
-{SELFPARAM();
+spawnfunc(target_checkpoint) // defrag entity
+{
        vector o;
        if(!g_race && !g_cts) { remove(self); return; }
        defrag_ents = 1;
@@ -1018,8 +1018,8 @@ void spawnfunc_target_checkpoint() // defrag entity
        InitializeEntity(self, trigger_race_checkpoint_verify, INITPRIO_FINDTARGET);
 }
 
-void spawnfunc_target_startTimer() { spawnfunc_target_checkpoint(); }
-void spawnfunc_target_stopTimer() { spawnfunc_target_checkpoint(); }
+spawnfunc(target_startTimer) { spawnfunc_target_checkpoint(this); }
+spawnfunc(target_stopTimer) { spawnfunc_target_checkpoint(this); }
 
 void race_AbandonRaceCheck(entity p)
 {
@@ -1059,11 +1059,11 @@ void race_RetractPlayer()
        self.race_checkpoint = self.race_respawn_checkpoint;
 }
 
-void spawnfunc_info_player_race (void)
-{SELFPARAM();
+spawnfunc(info_player_race)
+{
        if(!g_race && !g_cts) { remove(self); return; }
        ++race_spawns;
-       spawnfunc_info_player_deathmatch();
+       spawnfunc_info_player_deathmatch(this);
 
        if(self.race_place > race_highest_place_spawn)
                race_highest_place_spawn = self.race_place;
@@ -1141,8 +1141,8 @@ void penalty_use()
        race_ImposePenaltyTime(activator, self.race_penalty, self.race_penalty_reason);
 }
 
-void spawnfunc_trigger_race_penalty()
-{SELFPARAM();
+spawnfunc(trigger_race_penalty)
+{
        EXACTTRIGGER_INIT;
 
        self.use = penalty_use;
index 3a574b28b2bfead37bf5a6eb73380f6f5af382ca..3c2851b91fe4d1da15a9abce1c9e473328d94610 100644 (file)
@@ -141,18 +141,18 @@ void relocate_spawnpoint()
        { Net_LinkEntity(self, false, 0, SpawnPoint_Send); }
 }
 
-void spawnfunc_info_player_survivor (void)
+spawnfunc(info_player_survivor)
 {
-       spawnfunc_info_player_deathmatch();
+       spawnfunc_info_player_deathmatch(this);
 }
 
-void spawnfunc_info_player_start (void)
+spawnfunc(info_player_start)
 {
-       spawnfunc_info_player_deathmatch();
+       spawnfunc_info_player_deathmatch(this);
 }
 
-void spawnfunc_info_player_deathmatch (void)
-{SELFPARAM();
+spawnfunc(info_player_deathmatch)
+{
        self.classname = "info_player_deathmatch";
        relocate_spawnpoint();
 }
@@ -160,47 +160,47 @@ void spawnfunc_info_player_deathmatch (void)
 /*QUAKED spawnfunc_info_player_team1 (1 0 0) (-16 -16 -24) (16 16 24)
 Starting point for a player in team one (Red).
 Keys: "angle" viewing angle when spawning. */
-void spawnfunc_info_player_team1()
-{SELFPARAM();
-       if(g_assault) { remove(self); return; }
+spawnfunc(info_player_team1)
+{
+       if(g_assault) { remove(this); return; }
 
-       self.team = NUM_TEAM_1; // red
-       spawnfunc_info_player_deathmatch();
+       this.team = NUM_TEAM_1; // red
+       spawnfunc_info_player_deathmatch(this);
 }
 
 
 /*QUAKED spawnfunc_info_player_team2 (1 0 0) (-16 -16 -24) (16 16 24)
 Starting point for a player in team two (Blue).
 Keys: "angle" viewing angle when spawning. */
-void spawnfunc_info_player_team2()
-{SELFPARAM();
-       if(g_assault) { remove(self); return; }
+spawnfunc(info_player_team2)
+{
+       if(g_assault) { remove(this); return; }
 
-       self.team = NUM_TEAM_2; // blue
-       spawnfunc_info_player_deathmatch();
+       this.team = NUM_TEAM_2; // blue
+       spawnfunc_info_player_deathmatch(this);
 }
 
 /*QUAKED spawnfunc_info_player_team3 (1 0 0) (-16 -16 -24) (16 16 24)
 Starting point for a player in team three (Yellow).
 Keys: "angle" viewing angle when spawning. */
-void spawnfunc_info_player_team3()
-{SELFPARAM();
-       if(g_assault) { remove(self); return; }
+spawnfunc(info_player_team3)
+{
+       if(g_assault) { remove(this); return; }
 
-       self.team = NUM_TEAM_3; // yellow
-       spawnfunc_info_player_deathmatch();
+       this.team = NUM_TEAM_3; // yellow
+       spawnfunc_info_player_deathmatch(this);
 }
 
 
 /*QUAKED spawnfunc_info_player_team4 (1 0 0) (-16 -16 -24) (16 16 24)
 Starting point for a player in team four (Purple).
 Keys: "angle" viewing angle when spawning. */
-void spawnfunc_info_player_team4()
-{SELFPARAM();
-       if(g_assault) { remove(self); return; }
+spawnfunc(info_player_team4)
+{
+       if(g_assault) { remove(this); return; }
 
-       self.team = NUM_TEAM_4; // purple
-       spawnfunc_info_player_deathmatch();
+       this.team = NUM_TEAM_4; // purple
+       spawnfunc_info_player_deathmatch(this);
 }
 
 // Returns:
index e697001c18145e96233de28a8bfba1e436f59503..c6ed28a4c71f86ca94045029f40127023234d22f 100644 (file)
@@ -6,6 +6,6 @@ float spawnpoint_nag;
 float SpawnEvent_Send(entity to, int sf);
 entity Spawn_FilterOutBadSpots(entity firstspot, float mindist, float teamcheck);
 entity SelectSpawnPoint (float anypoint);
-void spawnfunc_info_player_deathmatch();
+spawnfunc(info_player_deathmatch);
 void spawnpoint_use();
 #endif
index 6ebfc8ad3159409c661cfe8305adbbc9033b2216..fbf84da32be0b06fb2a16d0ae2f790bdc5fcb9da 100644 (file)
@@ -640,7 +640,7 @@ void flocker_hunter_think()
 
 
 float globflockcnt;
-void spawnfunc_flockerspawn()
+spawnfunc(flockerspawn)
 {SELFPARAM();
     ++globflockcnt;
 
index 948e2d37435cdc392bce62b4bb52045fdb2f4054..138051827bcad56fac48d9ed1f993596a8f405cc 100644 (file)
@@ -90,7 +90,7 @@ void CreatureFrame (void)
                                                if (self.watersound_finished < time)
                                                {
                                                        self.watersound_finished = time + 0.5;
-                                                       sound (self, CH_PLAYER_SINGLE, "player/lava.wav", VOL_BASE, ATTEN_NORM);
+                                                       sound (self, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
                                                }
                                                Damage (self, world, world, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
                                        }
@@ -99,7 +99,7 @@ void CreatureFrame (void)
                                                if (self.watersound_finished < time)
                                                {
                                                        self.watersound_finished = time + 0.5;
-                                                       sound (self, CH_PLAYER_SINGLE, "player/slime.wav", VOL_BASE, ATTEN_NORM);
+                                                       sound (self, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
                                                }
                                                Damage (self, world, world, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
                                        }
index bfdcdb860e267fff7a385d17fa76cd4c6fa4c3ab..067e0140976fb18399e1f71ec32247933d6cbac5 100644 (file)
@@ -3,7 +3,6 @@
 
 #define objerror builtin_objerror
 #define droptofloor builtin_droptofloor
-#define sound builtin_sound
 #define remove builtin_remove
 #define cvar_set builtin_cvar_set
 #define cvar_string builtin_cvar_string
index f041dd39659aebd31a8b375b6e14d1fd51820f1c..0438282006c22a072255fb75142b4ee63eaf8b9f 100644 (file)
@@ -5,30 +5,30 @@
 .float  rendermode;
 .vector rendercolor;
 
-void spawnfunc_weapon_crossbow() {}
-void spawnfunc_weapon_handgrenade() {}
-void spawnfunc_ammo_crossbow() {}
-void spawnfunc_ammo_9mmclip() {}
-void spawnfunc_ammo_gaussclip() {}
-void spawnfunc_weapon_rpg() {}
-void spawnfunc_weapon_357() {}
+spawnfunc(weapon_crossbow) {}
+spawnfunc(weapon_handgrenade) {}
+spawnfunc(ammo_crossbow) {}
+spawnfunc(ammo_9mmclip) {}
+spawnfunc(ammo_gaussclip) {}
+spawnfunc(weapon_rpg) {}
+spawnfunc(weapon_357) {}
 void ammo_ARgrenades() {}
-void spawnfunc_item_battery() {}
-void spawnfunc_ammo_rpgclip() {}
+spawnfunc(item_battery) {}
+spawnfunc(ammo_rpgclip) {}
 void weapon_9mmAR() {}
-void spawnfunc_weapon_tripmine() {}
-void spawnfunc_weapon_snark() {}
-void spawnfunc_ammo_buckshot() {}
+spawnfunc(weapon_tripmine) {}
+spawnfunc(weapon_snark) {}
+spawnfunc(ammo_buckshot) {}
 void ammo_9mmAR() {}
-void spawnfunc_ammo_357() {}
-void spawnfunc_weapon_gauss() {}
-void spawnfunc_weapon_hornetgun() {}
-//void spawnfunc_weapon_shotgun() {}
-void spawnfunc_item_healthkit() {}
-void spawnfunc_item_longjump() {}
-void spawnfunc_item_antidote() {}
-void spawnfunc_func_recharge() {}
-void spawnfunc_info_node() {}
-void spawnfunc_env_sound() {}
-void spawnfunc_light_spot() {}
-void spawnfunc_func_healthcharger() {}
+spawnfunc(ammo_357) {}
+spawnfunc(weapon_gauss) {}
+spawnfunc(weapon_hornetgun) {}
+//spawnfunc(weapon_shotgun) {}
+spawnfunc(item_healthkit) {}
+spawnfunc(item_longjump) {}
+spawnfunc(item_antidote) {}
+spawnfunc(func_recharge) {}
+spawnfunc(info_node) {}
+spawnfunc(env_sound) {}
+spawnfunc(light_spot) {}
+spawnfunc(func_healthcharger) {}
index 0fbbf2732ed8545401b320a2fc00ec39c74ee1a5..015d4aeb2cae9d50b22bd734a824a48e150b2e34 100644 (file)
@@ -436,11 +436,11 @@ void Item_Respawn (void)
        Item_Show(self, 1);
        // this is ugly...
        if(self.items == ITEM_Strength.m_itemid)
-               sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTEN_NORM);    // play respawn sound
+               sound (self, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTEN_NORM);   // play respawn sound
        else if(self.items == ITEM_Shield.m_itemid)
-               sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTEN_NORM);      // play respawn sound
+               sound (self, CH_TRIGGER, SND_SHIELD_RESPAWN, VOL_BASE, ATTEN_NORM);     // play respawn sound
        else
-               sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound
+               sound (self, CH_TRIGGER, SND_ITEMRESPAWN, VOL_BASE, ATTEN_NORM);        // play respawn sound
        setorigin (self, self.origin);
 
     if (Item_ItemsTime_Allow(self.itemdef, self.weapons))
@@ -472,15 +472,24 @@ void Item_RespawnCountdown (void)
                if(self.count == 1)
                {
                        MUTATOR_CALLHOOK(Item_RespawnCountdown, string_null, '0 0 0');
-                       int wpextra = 0;
-            entity e = self.itemdef;
-            if (e) wpextra = e.m_id;
-                       if (self.flags & FL_WEAPON) {
-                               entity wi = get_weaponinfo(self.weapon);
-                               if (wi) wpextra = wi.m_id;
-                       }
-            entity wp = WaypointSprite_Spawn(WP_Item, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_POWERUP);
-            wp.wp_extra = wpextra;
+                       do {
+                               {
+                                       entity wi = get_weaponinfo(self.weapon);
+                                       if (wi.m_id) {
+                                               entity wp = WaypointSprite_Spawn(WP_Weapon, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_POWERUP);
+                                               wp.wp_extra = wi.m_id;
+                                               break;
+                                       }
+                               }
+                               {
+                                       entity ii = self.itemdef;
+                                       if (ii.m_id) {
+                                               entity wp = WaypointSprite_Spawn(WP_Item, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, true, RADARICON_POWERUP);
+                                               wp.wp_extra = ii.m_id;
+                                               break;
+                                       }
+                               }
+                       } while (0);
             if(self.waypointsprite_attached)
             {
                 GameItem def = self.itemdef;
@@ -498,7 +507,7 @@ void Item_RespawnCountdown (void)
                                if(self.waypointsprite_visible_for_player(e))
                                {
                                        msg_entity = e;
-                                       soundto(MSG_ONE, this, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTEN_NORM);      // play respawn sound
+                                       soundto(MSG_ONE, this, CH_TRIGGER, SND(ITEMRESPAWNCOUNTDOWN), VOL_BASE, ATTEN_NORM);    // play respawn sound
                                }
                        setself(this);
 
@@ -506,7 +515,7 @@ void Item_RespawnCountdown (void)
                        //WaypointSprite_UpdateHealth(self.waypointsprite_attached, self.count);
                }
                else
-                       sound(self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTEN_NORM); // play respawn sound
+                       sound(self, CH_TRIGGER, SND_ITEMRESPAWNCOUNTDOWN, VOL_BASE, ATTEN_NORM);        // play respawn sound
        }
 }
 
@@ -750,7 +759,7 @@ void Item_Touch (void)
        other.last_pickup = time;
 
        Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(self), '0 0 0', 1);
-       sound (other, CH_TRIGGER, self.item_pickupsound, VOL_BASE, ATTEN_NORM);
+       _sound (other, CH_TRIGGER, (self.item_pickupsound ? self.item_pickupsound : self.item_pickupsound_ent.sound_str()), VOL_BASE, ATTEN_NORM);
 
        if (self.classname == "droppedweapon")
                remove (self);
@@ -1119,14 +1128,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                precache_model (self.model);
                precache_sound (self.item_pickupsound);
 
-               precache_sound ("misc/itemrespawncountdown.wav");
-               if(itemid == ITEM_Strength.m_itemid)
-                       precache_sound ("misc/strength_respawn.wav");
-               else if(itemid == ITEM_Shield.m_itemid)
-                       precache_sound ("misc/shield_respawn.wav");
-               else
-                       precache_sound ("misc/itemrespawn.wav");
-
                if((itemflags & (FL_POWERUP | FL_WEAPON)) || (itemid & (IT_HEALTH | IT_ARMOR | IT_KEY1 | IT_KEY2)))
                        self.target = "###item###"; // for finding the nearest item using find()
 
@@ -1196,21 +1197,14 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
        }
 }
 
-string Item_Model(string item_mdl)
-{
-       string output = strcat("models/items/", item_mdl);
-       MUTATOR_CALLHOOK(ItemModel, item_mdl, output);
-       return strzone(item_model_output);
-}
-
 void StartItemA (entity a)
 {SELFPARAM();
     self.itemdef = a;
-    StartItem(Item_Model(a.m_model), a.m_sound, a.m_respawntime(), a.m_respawntimejitter(), a.m_name, a.m_itemid, 0, a.m_itemflags, a.m_pickupevalfunc, a.m_botvalue);
+    StartItem(strzone(a.m_model.model_str()), a.m_sound, a.m_respawntime(), a.m_respawntimejitter(), a.m_name, a.m_itemid, 0, a.m_itemflags, a.m_pickupevalfunc, a.m_botvalue);
 }
 
-void spawnfunc_item_rockets()
-{SELFPARAM();
+spawnfunc(item_rockets)
+{
        if(!self.ammo_rockets)
                self.ammo_rockets = g_pickup_rockets;
        if(!self.pickup_anyway)
@@ -1218,14 +1212,14 @@ void spawnfunc_item_rockets()
     StartItemA (ITEM_Rockets);
 }
 
-void spawnfunc_item_bullets()
-{SELFPARAM();
+spawnfunc(item_bullets)
+{
        if(!weaponswapping)
        if(autocvar_sv_q3acompat_machineshotgunswap)
        if(self.classname != "droppedweapon")
        {
                weaponswapping = true;
-               spawnfunc_item_shells();
+               spawnfunc_item_shells(this);
                weaponswapping = false;
                return;
        }
@@ -1237,8 +1231,8 @@ void spawnfunc_item_bullets()
     StartItemA (ITEM_Bullets);
 }
 
-void spawnfunc_item_cells()
-{SELFPARAM();
+spawnfunc(item_cells)
+{
        if(!self.ammo_cells)
                self.ammo_cells = g_pickup_cells;
        if(!self.pickup_anyway)
@@ -1246,8 +1240,8 @@ void spawnfunc_item_cells()
        StartItemA (ITEM_Cells);
 }
 
-void spawnfunc_item_plasma()
-{SELFPARAM();
+spawnfunc(item_plasma)
+{
        if(!self.ammo_plasma)
                self.ammo_plasma = g_pickup_plasma;
        if(!self.pickup_anyway)
@@ -1255,14 +1249,14 @@ void spawnfunc_item_plasma()
        StartItemA (ITEM_Plasma);
 }
 
-void spawnfunc_item_shells()
-{SELFPARAM();
+spawnfunc(item_shells)
+{
        if(!weaponswapping)
        if(autocvar_sv_q3acompat_machineshotgunswap)
        if(self.classname != "droppedweapon")
        {
                weaponswapping = true;
-               spawnfunc_item_bullets();
+               spawnfunc_item_bullets(this);
                weaponswapping = false;
                return;
        }
@@ -1274,8 +1268,8 @@ void spawnfunc_item_shells()
        StartItemA (ITEM_Shells);
 }
 
-void spawnfunc_item_armor_small()
-{SELFPARAM();
+spawnfunc(item_armor_small)
+{
        if(!self.armorvalue)
                self.armorvalue = g_pickup_armorsmall;
        if(!self.max_armorvalue)
@@ -1285,8 +1279,8 @@ void spawnfunc_item_armor_small()
        StartItemA (ITEM_ArmorSmall);
 }
 
-void spawnfunc_item_armor_medium()
-{SELFPARAM();
+spawnfunc(item_armor_medium)
+{
        if(!self.armorvalue)
                self.armorvalue = g_pickup_armormedium;
        if(!self.max_armorvalue)
@@ -1296,8 +1290,8 @@ void spawnfunc_item_armor_medium()
        StartItemA (ITEM_ArmorMedium);
 }
 
-void spawnfunc_item_armor_big()
-{SELFPARAM();
+spawnfunc(item_armor_big)
+{
        if(!self.armorvalue)
                self.armorvalue = g_pickup_armorbig;
        if(!self.max_armorvalue)
@@ -1307,8 +1301,8 @@ void spawnfunc_item_armor_big()
        StartItemA (ITEM_ArmorLarge);
 }
 
-void spawnfunc_item_armor_large()
-{SELFPARAM();
+spawnfunc(item_armor_large)
+{
        if(!self.armorvalue)
                self.armorvalue = g_pickup_armorlarge;
        if(!self.max_armorvalue)
@@ -1318,8 +1312,8 @@ void spawnfunc_item_armor_large()
        StartItemA (ITEM_ArmorMega);
 }
 
-void spawnfunc_item_health_small()
-{SELFPARAM();
+spawnfunc(item_health_small)
+{
        if(!self.max_health)
                self.max_health = g_pickup_healthsmall_max;
        if(!self.health)
@@ -1329,8 +1323,8 @@ void spawnfunc_item_health_small()
        StartItemA (ITEM_HealthSmall);
 }
 
-void spawnfunc_item_health_medium()
-{SELFPARAM();
+spawnfunc(item_health_medium)
+{
        if(!self.max_health)
                self.max_health = g_pickup_healthmedium_max;
        if(!self.health)
@@ -1340,8 +1334,8 @@ void spawnfunc_item_health_medium()
     StartItemA (ITEM_HealthMedium);
 }
 
-void spawnfunc_item_health_large()
-{SELFPARAM();
+spawnfunc(item_health_large)
+{
        if(!self.max_health)
                self.max_health = g_pickup_healthlarge_max;
        if(!self.health)
@@ -1351,8 +1345,8 @@ void spawnfunc_item_health_large()
        StartItemA (ITEM_HealthLarge);
 }
 
-void spawnfunc_item_health_mega()
-{SELFPARAM();
+spawnfunc(item_health_mega)
+{
     if(!self.max_health)
         self.max_health = g_pickup_healthmega_max;
     if(!self.health)
@@ -1363,29 +1357,28 @@ void spawnfunc_item_health_mega()
 }
 
 // support old misnamed entities
-void spawnfunc_item_armor1() { spawnfunc_item_armor_small(); }  // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
-void spawnfunc_item_armor25() { spawnfunc_item_armor_large(); }
-void spawnfunc_item_health1() { spawnfunc_item_health_small(); }
-void spawnfunc_item_health25() { spawnfunc_item_health_medium(); }
-void spawnfunc_item_health100() { spawnfunc_item_health_mega(); }
+spawnfunc(item_armor1) { spawnfunc_item_armor_small(this); }  // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
+spawnfunc(item_armor25) { spawnfunc_item_armor_large(this); }
+spawnfunc(item_health1) { spawnfunc_item_health_small(this); }
+spawnfunc(item_health25) { spawnfunc_item_health_medium(this); }
+spawnfunc(item_health100) { spawnfunc_item_health_mega(this); }
 
-void spawnfunc_item_strength()
-{SELFPARAM();
-               precache_sound("weapons/strength_fire.wav");
+spawnfunc(item_strength)
+{
                if(!self.strength_finished)
                        self.strength_finished = autocvar_g_balance_powerup_strength_time;
                StartItemA (ITEM_Strength);
 }
 
-void spawnfunc_item_invincible()
-{SELFPARAM();
+spawnfunc(item_invincible)
+{
                if(!self.invincible_finished)
                        self.invincible_finished = autocvar_g_balance_powerup_invincible_time;
                StartItemA (ITEM_Shield);
 }
 
 // compatibility:
-void spawnfunc_item_quad() {SELFPARAM(); self.classname = "item_strength";spawnfunc_item_strength();}
+spawnfunc(item_quad) { self.classname = "item_strength";spawnfunc_item_strength(this);}
 
 void target_items_use()
 {SELFPARAM();
@@ -1411,8 +1404,8 @@ void target_items_use()
                centerprint(activator, self.message);
 }
 
-void spawnfunc_target_items (void)
-{SELFPARAM();
+spawnfunc(target_items)
+{
        float n, i, j;
        entity e;
        string s;
@@ -1425,13 +1418,6 @@ void spawnfunc_target_items (void)
        if(!self.superweapons_finished)
                self.superweapons_finished = autocvar_g_balance_superweapons_time;
 
-       precache_sound("misc/itempickup.wav");
-       precache_sound("misc/megahealth.wav");
-       precache_sound("misc/armor25.wav");
-       precache_sound("misc/powerup.wav");
-       precache_sound("misc/poweroff.wav");
-       precache_sound(W_Sound("weaponpickup"));
-
        n = tokenize_console(self.netname);
        if(argv(0) == "give")
        {
@@ -1536,8 +1522,8 @@ void spawnfunc_target_items (void)
        }
 }
 
-void spawnfunc_item_fuel(void)
-{SELFPARAM();
+spawnfunc(item_fuel)
+{
        if(!self.ammo_fuel)
                self.ammo_fuel = g_pickup_fuel;
        if(!self.pickup_anyway)
@@ -1545,23 +1531,23 @@ void spawnfunc_item_fuel(void)
        StartItemA (ITEM_JetpackFuel);
 }
 
-void spawnfunc_item_fuel_regen(void)
+spawnfunc(item_fuel_regen)
 {
        if(start_items & ITEM_JetpackRegen.m_itemid)
        {
-               spawnfunc_item_fuel();
+               spawnfunc_item_fuel(this);
                return;
        }
        StartItemA (ITEM_JetpackRegen);
 }
 
-void spawnfunc_item_jetpack(void)
-{SELFPARAM();
+spawnfunc(item_jetpack)
+{
        if(!self.ammo_fuel)
                self.ammo_fuel = g_pickup_fuel_jetpack;
        if(start_items & ITEM_Jetpack.m_itemid)
        {
-               spawnfunc_item_fuel();
+               spawnfunc_item_fuel(this);
                return;
        }
        StartItemA (ITEM_Jetpack);
@@ -1660,12 +1646,12 @@ void GiveSound(entity e, float v0, float v1, float t, string snd_incr, string sn
        if(v1 <= v0 - t)
        {
                if(snd_decr != "")
-                       sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTEN_NORM);
+                       _sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTEN_NORM);
        }
        else if(v0 >= v0 + t)
        {
                if(snd_incr != "")
-                       sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTEN_NORM);
+                       _sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTEN_NORM);
        }
 }
 
@@ -1831,31 +1817,31 @@ float GiveItems(entity e, float beginarg, float endarg)
                op = OP_SET;
        }
 
-       POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, "misc/itempickup.wav", string_null);
-       POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, "misc/powerup.wav", "misc/poweroff.wav");
-       POSTGIVE_BIT(e, items, IT_UNLIMITED_WEAPON_AMMO, "misc/powerup.wav", "misc/poweroff.wav");
-       POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, "misc/itempickup.wav", string_null);
+       POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, SND(ITEMPICKUP), string_null);
+       POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, SND(POWERUP), SND(POWEROFF));
+       POSTGIVE_BIT(e, items, IT_UNLIMITED_WEAPON_AMMO, SND(POWERUP), SND(POWEROFF));
+       POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, SND(ITEMPICKUP), string_null);
        for(j = WEP_FIRST; j <= WEP_LAST; ++j)
        {
                wi = get_weaponinfo(j);
                if(wi.weapon)
                {
-                       POSTGIVE_WEAPON(e, j, W_Sound("weaponpickup"), string_null);
+                       POSTGIVE_WEAPON(e, j, SND(WEAPONPICKUP), string_null);
                        if (!(save_weapons & WepSet_FromWeapon(j)))
                                if(e.weapons & WepSet_FromWeapon(j))
                                        WEP_ACTION(wi.weapon, WR_INIT);
                }
        }
-       POSTGIVE_VALUE(e, strength_finished, 1, "misc/powerup.wav", "misc/poweroff.wav");
-       POSTGIVE_VALUE(e, invincible_finished, 1, "misc/powerup_shield.wav", "misc/poweroff.wav");
-       POSTGIVE_VALUE(e, ammo_nails, 0, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE(e, ammo_cells, 0, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE(e, ammo_plasma, 0, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE(e, ammo_shells, 0, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE(e, ammo_rockets, 0, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, "misc/itempickup.wav", string_null);
-       POSTGIVE_VALUE_ROT(e, armorvalue, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, "misc/armor25.wav", string_null);
-       POSTGIVE_VALUE_ROT(e, health, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, "misc/megahealth.wav", string_null);
+       POSTGIVE_VALUE(e, strength_finished, 1, SND(POWERUP), SND(POWEROFF));
+       POSTGIVE_VALUE(e, invincible_finished, 1, "misc/powerup_shield.wav", SND(POWEROFF));
+       POSTGIVE_VALUE(e, ammo_nails, 0, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE(e, ammo_cells, 0, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE(e, ammo_plasma, 0, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE(e, ammo_shells, 0, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE(e, ammo_rockets, 0, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, SND(ITEMPICKUP), string_null);
+       POSTGIVE_VALUE_ROT(e, armorvalue, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND(ARMOR25), string_null);
+       POSTGIVE_VALUE_ROT(e, health, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND(MEGAHEALTH), string_null);
 
        if(e.superweapons_finished <= 0)
                if(self.weapons & WEPSET_SUPERWEAPONS)
index d93e28bb611053773784fb08612df1f16ba83fdb..1dfe537494cba522feed45f332f8d909486a3c89 100644 (file)
@@ -86,12 +86,12 @@ void ItemRead(float _IsNew);
 
 #endif
 #ifdef SVQC
-void spawnfunc_item_strength();
-void spawnfunc_item_invincible();
-void spawnfunc_item_armor_small();
-void spawnfunc_item_shells();
-void spawnfunc_item_bullets();
-void spawnfunc_item_rockets();
+spawnfunc(item_strength);
+spawnfunc(item_invincible);
+spawnfunc(item_armor_small);
+spawnfunc(item_shells);
+spawnfunc(item_bullets);
+spawnfunc(item_rockets);
 
 float autocvar_sv_simple_items;
 bool ItemSend(entity to, int sf);
index 74a324b98193ad4918fbab1d853d6528e2a9ddcd..9e22b8d06542ddf2236c4cb2a5ba57dbbbe9e546 100644 (file)
@@ -2,27 +2,27 @@
 
 #include "../common/weapons/all.qh"
 
-void spawnfunc_weapon_electro();
-void spawnfunc_weapon_hagar();
-void spawnfunc_weapon_machinegun();
-void spawnfunc_item_bullets();
-void spawnfunc_item_armor_large();
-void spawnfunc_item_armor_large();
-void spawnfunc_item_health_mega();
-void spawnfunc_item_health_medium();
+spawnfunc(weapon_electro);
+spawnfunc(weapon_hagar);
+spawnfunc(weapon_machinegun);
+spawnfunc(item_bullets);
+spawnfunc(item_armor_large);
+spawnfunc(item_armor_large);
+spawnfunc(item_health_mega);
+spawnfunc(item_health_medium);
 
 //***********************
 //QUAKE 1 ENTITIES - So people can play quake1 maps with the xonotic weapons
 //***********************
-void spawnfunc_weapon_nailgun() {spawnfunc_weapon_electro();}
-void spawnfunc_weapon_supernailgun() {spawnfunc_weapon_hagar();}
-void spawnfunc_weapon_supershotgun() {spawnfunc_weapon_machinegun();}
-
-void spawnfunc_item_spikes() {spawnfunc_item_bullets();}
-//void spawnfunc_item_armor1() {spawnfunc_item_armor_medium;}  // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
-void spawnfunc_item_armor2() {spawnfunc_item_armor_large();}
-void item_armorInv() {spawnfunc_item_armor_large();}
-void spawnfunc_item_health() {SELFPARAM();if (self.spawnflags & 2) spawnfunc_item_health_mega();else spawnfunc_item_health_medium();}
+spawnfunc(weapon_nailgun) {spawnfunc_weapon_electro(this);}
+spawnfunc(weapon_supernailgun) {spawnfunc_weapon_hagar(this);}
+spawnfunc(weapon_supershotgun) {spawnfunc_weapon_machinegun(this);}
+
+spawnfunc(item_spikes) {spawnfunc_item_bullets(this);}
+//spawnfunc(item_armor1) {spawnfunc_item_armor_medium(this);}  // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
+spawnfunc(item_armor2) {spawnfunc_item_armor_large(this);}
+void item_armorInv() {SELFPARAM();spawnfunc_item_armor_large(self);}
+spawnfunc(item_health) {if (self.spawnflags & 2) spawnfunc_item_health_mega(this);else spawnfunc_item_health_medium(this);}
 
 //spawnfunc_item_spikes
 //spawnfunc_item_health
index d20c90055dfcdd91024d68d9a2ee5f6cc3270588..8eecc5ee3ba67d16d14204ca3776eee16adcd6b1 100644 (file)
@@ -3,27 +3,27 @@
 #include "../common/weapons/all.qh"
 #include "../common/buffs.qh"
 
-void spawnfunc_weapon_crylink();
-void spawnfunc_weapon_electro();
-void spawnfunc_weapon_hagar();
-void spawnfunc_weapon_machinegun();
-void spawnfunc_weapon_vortex();
+spawnfunc(weapon_crylink);
+spawnfunc(weapon_electro);
+spawnfunc(weapon_hagar);
+spawnfunc(weapon_machinegun);
+spawnfunc(weapon_vortex);
 
-void spawnfunc_target_items();
+spawnfunc(target_items);
 
-void spawnfunc_item_bullets();
-void spawnfunc_item_cells();
-void spawnfunc_item_rockets();
-void spawnfunc_item_shells();
+spawnfunc(item_bullets);
+spawnfunc(item_cells);
+spawnfunc(item_rockets);
+spawnfunc(item_shells);
 
-void spawnfunc_item_jetpack();
+spawnfunc(item_jetpack);
 
-void spawnfunc_item_armor_big();
-void spawnfunc_item_armor_large();
-void spawnfunc_item_armor_small();
+spawnfunc(item_armor_big);
+spawnfunc(item_armor_large);
+spawnfunc(item_armor_small);
 
-void spawnfunc_item_health_medium();
-void spawnfunc_item_health_mega();
+spawnfunc(item_health_medium);
+spawnfunc(item_health_mega);
 
 //***********************
 //QUAKE 3 ENTITIES - So people can play quake3 maps with the xonotic weapons
@@ -32,38 +32,38 @@ void spawnfunc_item_health_mega();
 // NOTE: for best experience, you need to swap MGs with SGs in the map or it won't have a MG
 
 // SG -> SG
-void spawnfunc_ammo_shells()         { spawnfunc_item_shells();         }
+spawnfunc(ammo_shells)         { spawnfunc_item_shells(this);         }
 
 // MG -> MG
-void spawnfunc_ammo_bullets()        { spawnfunc_item_bullets();        }
+spawnfunc(ammo_bullets)        { spawnfunc_item_bullets(this);        }
 
 // GL -> Mortar
-void spawnfunc_ammo_grenades()       { spawnfunc_item_rockets();        }
+spawnfunc(ammo_grenades)       { spawnfunc_item_rockets(this);        }
 
 // LG -> Lightning
-void spawnfunc_weapon_lightning()    { spawnfunc_weapon_electro();      }
-void spawnfunc_ammo_lightning()      { spawnfunc_item_cells();          }
+spawnfunc(weapon_lightning)    { spawnfunc_weapon_electro(this);      }
+spawnfunc(ammo_lightning)      { spawnfunc_item_cells(this);          }
 
 // Plasma -> Hagar
-void spawnfunc_weapon_plasmagun()    { spawnfunc_weapon_hagar();        }
-void spawnfunc_ammo_cells()          { spawnfunc_item_rockets();        }
+spawnfunc(weapon_plasmagun)    { spawnfunc_weapon_hagar(this);        }
+spawnfunc(ammo_cells)          { spawnfunc_item_rockets(this);        }
 
 // Rail -> Vortex
-void spawnfunc_weapon_railgun()      { spawnfunc_weapon_vortex();          }
-void spawnfunc_ammo_slugs()          { spawnfunc_item_cells();          }
+spawnfunc(weapon_railgun)      { spawnfunc_weapon_vortex(this);          }
+spawnfunc(ammo_slugs)          { spawnfunc_item_cells(this);          }
 
 // BFG -> Crylink
-void spawnfunc_weapon_bfg()          { spawnfunc_weapon_crylink();      }
-void spawnfunc_ammo_bfg()            { spawnfunc_item_cells();          }
+spawnfunc(weapon_bfg)          { spawnfunc_weapon_crylink(this);      }
+spawnfunc(ammo_bfg)            { spawnfunc_item_cells(this);          }
 
 // RL -> RL
-void spawnfunc_ammo_rockets()        { spawnfunc_item_rockets();        }
+spawnfunc(ammo_rockets)        { spawnfunc_item_rockets(this);        }
 
 // Armor
-void spawnfunc_item_armor_body()     { spawnfunc_item_armor_large();    }
-void spawnfunc_item_armor_combat()   { spawnfunc_item_armor_big();      }
-void spawnfunc_item_armor_shard()    { spawnfunc_item_armor_small();    }
-void spawnfunc_item_enviro()         { spawnfunc_item_invincible();     }
+spawnfunc(item_armor_body)     { spawnfunc_item_armor_large(this);    }
+spawnfunc(item_armor_combat)   { spawnfunc_item_armor_big(this);      }
+spawnfunc(item_armor_shard)    { spawnfunc_item_armor_small(this);    }
+spawnfunc(item_enviro)         { spawnfunc_item_invincible(this);     }
 
 // weapon remove ent from df
 void target_init_verify()
@@ -84,11 +84,11 @@ void target_init_verify()
                        }
 }
 
-void spawnfunc_target_init()
-{SELFPARAM();
+spawnfunc(target_init)
+{
        self.spawnflags = 0; // remove all weapons except the ones listed below
        self.netname = "shotgun"; // keep these weapons through the remove trigger
-       spawnfunc_target_items();
+       spawnfunc_target_items(this);
        InitializeEntity(self, target_init_verify, INITPRIO_FINDTARGET);
 }
 
@@ -131,30 +131,30 @@ void target_give_init()
         targ.nextthink = time;
        }
        self.spawnflags = 2;
-       spawnfunc_target_items();
+       spawnfunc_target_items(this);
        InitializeEntity(self, target_init_verify, INITPRIO_FINDTARGET);
 }
 
-void spawnfunc_target_give()
-{SELFPARAM();
+spawnfunc(target_give)
+{
        InitializeEntity(self, target_give_init, INITPRIO_FINDTARGET);
 }
 
-//void spawnfunc_item_flight()       /* handled by buffs mutator or jetpack */
-//void spawnfunc_item_haste()        /* handled by buffs mutator */
-//void spawnfunc_item_health()       /* handled in t_quake.qc */
-//void spawnfunc_item_health_large() /* handled in t_items.qc */
-//void spawnfunc_item_health_small() /* handled in t_items.qc */
-//void spawnfunc_item_health_mega()  /* handled in t_items.qc */
-//void spawnfunc_item_invis()        /* handled by buffs mutator */
-//void spawnfunc_item_regen()        /* handled by buffs mutator */
+//spawnfunc(item_flight)       /* handled by buffs mutator or jetpack */
+//spawnfunc(item_haste)        /* handled by buffs mutator */
+//spawnfunc(item_health)       /* handled in t_quake.qc */
+//spawnfunc(item_health_large) /* handled in t_items.qc */
+//spawnfunc(item_health_small) /* handled in t_items.qc */
+//spawnfunc(item_health_mega)  /* handled in t_items.qc */
+//spawnfunc(item_invis)        /* handled by buffs mutator */
+//spawnfunc(item_regen)        /* handled by buffs mutator */
 
 // CTF spawnfuncs handled in mutators/gamemode_ctf.qc now
 
-void spawnfunc_item_flight()
-{SELFPARAM();
+spawnfunc(item_flight)
+{
        if(!cvar("g_buffs") || !cvar("g_buffs_flight"))
-               spawnfunc_item_jetpack();
+               spawnfunc_item_jetpack(this);
        else
                buff_Init_Compat(self, BUFF_FLIGHT);
 }
index db712933d0bd4c31359071ceb26c831de5e34104..f1720757f6607564db7f1a89083570178afac39b 100644 (file)
@@ -30,7 +30,7 @@ void W_PlayStrengthSound(entity player) // void W_PlayStrengthSound
                && ((time > player.prevstrengthsound + autocvar_sv_strengthsound_antispam_time) // prevent insane sound spam
                || (time > player.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)))
                {
-                       sound(player, CH_TRIGGER, W_Sound("strength_fire"), VOL_BASE, ATTEN_NORM);
+                       sound(player, CH_TRIGGER, SND_STRENGTH_FIRE, VOL_BASE, ATTEN_NORM);
                        player.prevstrengthsound = time;
                }
                player.prevstrengthsoundattempt = time;
index de240ce2ef66997ddbec1bf6d5d50c437f51ee7e..ce464c18e49252562f12f5b2b17e8dcd0716a9dc 100644 (file)
@@ -63,7 +63,7 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
                                if (complain)
                                if(IS_REAL_CLIENT(cl))
                                {
-                                       play2(cl, W_Sound("unavailable"));
+                                       play2(cl, SND(UNAVAILABLE));
                                        Send_WeaponComplain (cl, wpn, 0);
                                }
                                return false;
@@ -107,7 +107,7 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
                        Send_WeaponComplain (cl, wpn, 2);
                }
 
-               play2(cl, W_Sound("unavailable"));
+               play2(cl, SND(UNAVAILABLE));
        }
        return false;
 }
index 202b29fda738118ae1e2d282350993e2db822a30..81261383f5f061b3aeeb001fb4e2e0c1bd7a2179 100644 (file)
@@ -177,7 +177,8 @@ void weapon_defaultspawnfunc(float wpn)
        if(self.team)
                f |= FL_NO_WEAPON_STAY;
 
-       StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue);
+       StartItem(e.model, string_null, self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue);
+       self.item_pickupsound_ent = SND_WEAPONPICKUP;
        #if 0 // WEAPONTODO
        if (self.modelindex) // don't precache if self was removed
                WEP_ACTION(e.weapon, WR_INIT);
index 7c033fa889113363cbbd2626138a347ea8e0f697..69821aaaf6d84f42f79055407747e6f521e14d8c 100644 (file)
@@ -131,7 +131,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
 
        if (snd != "")
        {
-               sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
+               _sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
                W_PlayStrengthSound(ent);
        }
 
@@ -287,7 +287,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
                        if(f <= 0)
                                continue;
 
-                       snd = W_Sound(strcat("nexwhoosh", ftos(floor(random() * 3) + 1)));
+                       snd = SND(NEXWHOOSH_RANDOM());
 
                        if(!pseudoprojectile)
                                pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
index 076a172c8da323eb8e46e16bfddfbdddbfc87443..ba33c515ffea422da230ed8648cb308279ab1bf2 100644 (file)
@@ -474,7 +474,7 @@ float weapon_prepareattack_checkammo(float secondary)
 
                if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
                {
-                       sound (self, CH_WEAPON_A, W_Sound("dryfire"), VOL_BASE, ATTEN_NORM);
+                       sound (self, CH_WEAPON_A, SND_DRYFIRE, VOL_BASE, ATTEN_NORM);
                        self.prevdryfire = time;
                }
 
@@ -732,7 +732,7 @@ void W_WeaponFrame()
                        if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5)
                        {
                        #endif
-                               sound(self, CH_WEAPON_SINGLE, W_Sound("weapon_switch"), VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_SINGLE, SND_WEAPON_SWITCH, VOL_BASE, ATTN_NORM);
                                self.weaponentity.state = WS_DROP;
                                weapon_thinkf(WFRAME_DONTCHANGE, oldwep.switchdelay_drop, w_clear);
                        #ifndef INDEPENDENT_ATTACK_FINISHED
@@ -927,7 +927,7 @@ void W_Reload(float sent_ammo_min, string sent_sound)
        {
                if(IS_REAL_CLIENT(self) && self.reload_complain < time)
                {
-                       play2(self, W_Sound("unavailable"));
+                       play2(self, SND(UNAVAILABLE));
                        sprint(self, strcat("You don't have enough ammo to reload the ^2", WEP_NAME(self.weapon), "\n"));
                        self.reload_complain = time + 1;
                }
@@ -951,7 +951,7 @@ void W_Reload(float sent_ammo_min, string sent_sound)
 
        // now begin the reloading process
 
-       sound(self, CH_WEAPON_SINGLE, self.reload_sound, VOL_BASE, ATTEN_NORM);
+       _sound(self, CH_WEAPON_SINGLE, self.reload_sound, VOL_BASE, ATTEN_NORM);
 
        // do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon,
        // then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
index 5d0afc819e903212b4eb9354558ff141b96333d1..d34870ec0110f5a953320a4fcbb5256d3735c82e 100644 (file)
@@ -680,18 +680,18 @@ float warpzone_initialized;
 entity warpzone_position_first;
 entity warpzone_camera_first;
 .entity warpzone_next;
-void spawnfunc_misc_warpzone_position(void)
-{SELFPARAM();
+spawnfunc(misc_warpzone_position)
+{
        // "target", "angles", "origin"
        self.warpzone_next = warpzone_position_first;
        warpzone_position_first = self;
 }
-void spawnfunc_trigger_warpzone_position(void)
+spawnfunc(trigger_warpzone_position)
 {
-       spawnfunc_misc_warpzone_position();
+       spawnfunc_misc_warpzone_position(this);
 }
-void spawnfunc_trigger_warpzone(void)
-{SELFPARAM();
+spawnfunc(trigger_warpzone)
+{
        // warp zone entities must have:
        // "killtarget" pointing to a target_position with a direction arrow
        //              that points AWAY from the warp zone, and that is inside
@@ -723,8 +723,8 @@ void spawnfunc_trigger_warpzone(void)
        self.warpzone_next = warpzone_first;
        warpzone_first = self;
 }
-void spawnfunc_func_camera(void)
-{SELFPARAM();
+spawnfunc(func_camera)
+{
        if(!self.scale)
                self.scale = self.modelscale;
        if(!self.scale)
@@ -877,14 +877,14 @@ void trigger_warpzone_reconnect_use()
        setself(e);
 }
 
-void spawnfunc_trigger_warpzone_reconnect()
-{SELFPARAM();
+spawnfunc(trigger_warpzone_reconnect)
+{
        self.use = trigger_warpzone_reconnect_use;
 }
 
-void spawnfunc_target_warpzone_reconnect()
+spawnfunc(target_warpzone_reconnect)
 {
-       spawnfunc_trigger_warpzone_reconnect(); // both names make sense here :(
+       spawnfunc_trigger_warpzone_reconnect(this); // both names make sense here :(
 }
 
 void WarpZone_PlayerPhysics_FixVAngle(void)