]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into samual/weapons
authorSamual Lenks <samual@xonotic.org>
Tue, 20 Aug 2013 17:49:39 +0000 (13:49 -0400)
committerSamual Lenks <samual@xonotic.org>
Tue, 20 Aug 2013 17:49:39 +0000 (13:49 -0400)
Conflicts:
balanceXonotic.cfg
oldbalanceXPM.cfg
qcsrc/server/autocvars.qh
qcsrc/server/w_crylink.qc

1  2 
balanceXonotic.cfg
oldbalance25.cfg
oldbalanceFruitieX.cfg
oldbalanceXDF.cfg
oldbalanceXPM.cfg
qcsrc/client/hud.qc
qcsrc/common/weapons/w_crylink.qc
qcsrc/common/weapons/w_hlac.qc
qcsrc/common/weapons/w_machinegun.qc
qcsrc/server/mutators/mutator_nades.qc

Simple merge
index 2e659114bb680608c69bdb8a540cecf65864df6d,0000000000000000000000000000000000000000..633bd96370e4e369520e246205cec0f45407b182
mode 100644,000000..100644
--- /dev/null
@@@ -1,783 -1,0 +1,781 @@@
- // 0: only damage from contents (lava/slime) or exceptions 
 +g_mod_balance Nexuiz25
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 150
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 40
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 250 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 250
 +set g_lms_start_armor 100
 +set g_lms_start_ammo_shells 50
 +set g_lms_start_ammo_nails 150
 +set g_lms_start_ammo_rockets 50
 +set g_lms_start_ammo_cells 50
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 15
 +set g_balance_nix_ammo_nails 45
 +set g_balance_nix_ammo_rockets 15
 +set g_balance_nix_ammo_cells 15
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 0
 +set g_pickup_weapons_anyway 0
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 999
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 999
 +set g_pickup_rockets 15
 +set g_pickup_rockets_weapon 15
 +set g_pickup_rockets_max 999
 +set g_pickup_cells 25
 +set g_pickup_cells_weapon 25
 +set g_pickup_cells_max 999
 +set g_pickup_fuel 25
 +set g_pickup_fuel_weapon 25
 +set g_pickup_fuel_jetpack 50
 +set g_pickup_fuel_max 999
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 999
 +set g_pickup_armorsmall_anyway 0
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 999
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 999
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 999
 +set g_pickup_armorlarge_anyway 0
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 999
 +set g_pickup_healthsmall_anyway 0
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 999
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 999
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 999
 +set g_pickup_healthmega_anyway 0
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 15
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 15
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 10
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.1
 +set g_balance_health_regenlinear 0
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.1
 +set g_balance_health_rotlinear 0
 +set g_balance_pause_health_rot 5
 +set g_balance_pause_health_rot_spawn 10
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.1
 +set g_balance_armor_rotlinear 0
 +set g_balance_pause_armor_rot 5
 +set g_balance_pause_armor_rot_spawn 10
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.6
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 1
 +set g_throughfloor_force 1
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
- set g_balance_uzi_burst_damage 18             
++// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.7
 +set g_projectiles_newton_style_2_maxfactor 5
 +set g_projectiles_spread_style 0
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 150
 +set g_balance_falldamage_minspeed 1400
 +set g_balance_falldamage_factor 0.15
 +set g_balance_falldamage_maxdamage 25
 +set g_balance_damagepush_speedfactor 0
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.2
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 4
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 35
 +set g_balance_laser_primary_edgedamage 10
 +set g_balance_laser_primary_force 400
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 9000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.3
 +set g_balance_laser_primary_lifetime 30
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0.05
 +set g_balance_laser_primary_force_zscale 1
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 35
 +set g_balance_laser_secondary_edgedamage 10
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 9000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.3
 +set g_balance_laser_secondary_lifetime 30
 +set g_balance_laser_secondary_shotangle 0
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 1.5
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 100
 +set g_balance_laser_shockwave_spread_min 20
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 6
 +set g_balance_shotgun_primary_damage 9
 +set g_balance_shotgun_primary_force 60
 +set g_balance_shotgun_primary_spread 0.07
 +set g_balance_shotgun_primary_refire 0.5
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
 +set g_balance_shotgun_primary_speed 12000
 +set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 0
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 115
 +set g_balance_shotgun_secondary_force 150
 +set g_balance_shotgun_secondary_refire 1.1
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.15
 +set g_balance_shotgun_switchdelay_raise 0.15
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 0                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.6
 +set g_balance_uzi_spread_add 0.012
 +
 +set g_balance_uzi_burst 0                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.75
 +set g_balance_uzi_burst_refire 0.05           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.75  // refire after burst
 +set g_balance_uzi_burst_spread 0.04
- set g_balance_crylink_primary_jointime 0
++set g_balance_uzi_burst_damage 18
 +set g_balance_uzi_burst_force 50
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 30
 +set g_balance_uzi_first_force 50
 +set g_balance_uzi_first_spread 0.015
 +set g_balance_uzi_first_refire 0.2
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 15
 +set g_balance_uzi_sustained_force 27
 +set g_balance_uzi_sustained_spread 0.05
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
 +set g_balance_uzi_speed 18000
 +set g_balance_uzi_bulletconstant 115 // 13.1qu
 +
 +set g_balance_uzi_switchdelay_drop 0.15
 +set g_balance_uzi_switchdelay_raise 0.15
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 70
 +set g_balance_grenadelauncher_primary_edgedamage 38
 +set g_balance_grenadelauncher_primary_force 400
 +set g_balance_grenadelauncher_primary_radius 140
 +set g_balance_grenadelauncher_primary_speed 2000
 +set g_balance_grenadelauncher_primary_speed_up 200
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 30
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 25
 +set g_balance_grenadelauncher_primary_damageforcescale 4
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 70
 +set g_balance_grenadelauncher_secondary_edgedamage 38
 +set g_balance_grenadelauncher_secondary_force 400
 +set g_balance_grenadelauncher_secondary_radius 140
 +set g_balance_grenadelauncher_secondary_speed 1400
 +set g_balance_grenadelauncher_secondary_speed_up 200
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 2.5
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 10
 +set g_balance_grenadelauncher_secondary_damageforcescale 4
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.15
 +set g_balance_grenadelauncher_switchdelay_raise 0.15
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 65
 +set g_balance_electro_primary_edgedamage 0
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 150
 +set g_balance_electro_primary_comboradius 0
 +set g_balance_electro_primary_speed 2000
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 30
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.3
 +set g_balance_electro_primary_ammo 2
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 50
 +set g_balance_electro_secondary_edgedamage 0
 +set g_balance_electro_secondary_force 200
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 900
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0
 +set g_balance_electro_secondary_lifetime 5
 +set g_balance_electro_secondary_refire 0.3
 +set g_balance_electro_secondary_refire2 0
 +set g_balance_electro_secondary_animtime 0.3
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 0
 +set g_balance_electro_secondary_count 1
 +set g_balance_electro_secondary_bouncefactor 0.5
 +set g_balance_electro_secondary_bouncestop 0.075
 +set g_balance_electro_combo_damage 80
 +set g_balance_electro_combo_edgedamage 0
 +set g_balance_electro_combo_force 200
 +set g_balance_electro_combo_radius 250
 +set g_balance_electro_combo_comboradius 0
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 0
 +set g_balance_electro_switchdelay_drop 0.15
 +set g_balance_electro_switchdelay_raise 0.15
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink
 +set g_balance_crylink_primary_damage 18
 +set g_balance_crylink_primary_edgedamage 0
 +set g_balance_crylink_primary_force -55
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 7000
 +set g_balance_crylink_primary_spread 0.03
 +set g_balance_crylink_primary_shots 4
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.4
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 2
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0
 +set g_balance_crylink_primary_joinspread 0
- set g_balance_crylink_secondary_jointime 0
- set g_balance_crylink_secondary_joinexplode 0                 
- set g_balance_crylink_secondary_joinexplode_damage 0  
 +set g_balance_crylink_primary_joinexplode 0
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450
 +set g_balance_crylink_primary_other_fadetime 0.25
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 18
 +set g_balance_crylink_secondary_edgedamage 0
 +set g_balance_crylink_secondary_force -55
 +set g_balance_crylink_secondary_radius 3
 +set g_balance_crylink_secondary_speed 7000
 +set g_balance_crylink_secondary_spread 0.08
 +set g_balance_crylink_secondary_spreadtype 0
 +set g_balance_crylink_secondary_shots 7
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.5
 +set g_balance_crylink_secondary_animtime 0.3
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
++set g_balance_crylink_secondary_joinexplode 0
++set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 2 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_line_fadetime 2
 +
 +set g_balance_crylink_switchdelay_drop 0.15
 +set g_balance_crylink_switchdelay_raise 0.15
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 100
 +set g_balance_nex_primary_force 600
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.3
 +set g_balance_nex_primary_ammo 5
 +set g_balance_nex_primary_damagefalloff_mindist 0
 +set g_balance_nex_primary_damagefalloff_maxdist 0
 +set g_balance_nex_primary_damagefalloff_halflife 0
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 100
 +set g_balance_nex_secondary_force 600
 +set g_balance_nex_secondary_refire 1.5
 +set g_balance_nex_secondary_animtime 0.3
 +set g_balance_nex_secondary_ammo 5
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 0
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0
 +set g_balance_nex_charge_rate 0.1
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 0.5
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0.5
 +set g_balance_nex_charge_velocity_rate 0.2
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 1000
 +
 +set g_balance_nex_switchdelay_drop 0.15
 +set g_balance_nex_switchdelay_raise 0.15
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0.15
 +set g_balance_minstanex_switchdelay_raise 0.15
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 37
 +set g_balance_hagar_primary_edgedamage 15
 +set g_balance_hagar_primary_force 100
 +set g_balance_hagar_primary_health 0
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 65
 +set g_balance_hagar_primary_spread 0.010
 +set g_balance_hagar_primary_speed 3000
 +set g_balance_hagar_primary_lifetime 30
 +set g_balance_hagar_primary_refire 0.15
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 0
 +set g_balance_hagar_secondary_load_speed 0.6
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 0
 +set g_balance_hagar_secondary_load_releasedeath 1
 +set g_balance_hagar_secondary_load_abort 1
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 37
 +set g_balance_hagar_secondary_edgedamage 15
 +set g_balance_hagar_secondary_force 100
 +set g_balance_hagar_secondary_health 0
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 65
 +set g_balance_hagar_secondary_spread 0.015
 +set g_balance_hagar_secondary_speed 1400
 +set g_balance_hagar_secondary_lifetime_min 30
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.15
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.15
 +set g_balance_hagar_switchdelay_raise 0.15
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 105
 +set g_balance_rocketlauncher_edgedamage 40
 +set g_balance_rocketlauncher_force 600
 +set g_balance_rocketlauncher_radius 150
 +set g_balance_rocketlauncher_speed 850
 +set g_balance_rocketlauncher_speedaccel 0
 +set g_balance_rocketlauncher_speedstart 850
 +set g_balance_rocketlauncher_lifetime 30
 +set g_balance_rocketlauncher_refire 1
 +set g_balance_rocketlauncher_animtime 0.3
 +set g_balance_rocketlauncher_ammo 3
 +set g_balance_rocketlauncher_health 40
 +set g_balance_rocketlauncher_damageforcescale 4
 +set g_balance_rocketlauncher_detonatedelay 0.2 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 90 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 105
 +set g_balance_rocketlauncher_remote_edgedamage 40
 +set g_balance_rocketlauncher_remote_radius 150
 +set g_balance_rocketlauncher_remote_force 600
 +set g_balance_rocketlauncher_switchdelay_drop 0.15
 +set g_balance_rocketlauncher_switchdelay_raise 0.15
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 2000
 +set g_balance_porto_primary_lifetime 30
 +set g_balance_porto_secondary 0
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 2000
 +set g_balance_porto_secondary_lifetime 30
 +set g_balance_porto_switchdelay_drop 0.15
 +set g_balance_porto_switchdelay_raise 0.15
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 30 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 0
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.15
 +set g_balance_hook_switchdelay_raise 0.15
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.15
 +set g_balance_tuba_switchdelay_raise 0.15
 +// }}}
 +// {{{ fireball
 +set g_balance_fireball_primary_animtime 0.15
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 4
 +set g_balance_fireball_primary_edgedamage 0
 +set g_balance_fireball_primary_force 700
 +set g_balance_fireball_primary_health 50
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 5
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 650
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 2
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.15
 +set g_balance_fireball_switchdelay_raise 0.15
 +// }}}
index 52ac863829ab78d6ed47416679ef00fe0fc340e5,0000000000000000000000000000000000000000..a10d8b58d0c5954670576391220de86c8f4d1c8a
mode 100644,000000..100644
--- /dev/null
@@@ -1,783 -1,0 +1,781 @@@
- // 0: only damage from contents (lava/slime) or exceptions 
 +g_mod_balance FruitieX
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 125
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 20
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 200 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 100
 +set g_lms_start_ammo_shells 30
 +set g_lms_start_ammo_nails 200
 +set g_lms_start_ammo_rockets 150
 +set g_lms_start_ammo_cells 150
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 15
 +set g_balance_nix_ammo_nails 45
 +set g_balance_nix_ammo_rockets 15
 +set g_balance_nix_ammo_cells 15
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 20
 +set g_pickup_shells_weapon 10
 +set g_pickup_shells_max 45
 +set g_pickup_nails 120
 +set g_pickup_nails_weapon 60
 +set g_pickup_nails_max 300
 +set g_pickup_rockets 25
 +set g_pickup_rockets_weapon 15
 +set g_pickup_rockets_max 150
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 20
 +set g_pickup_cells_max 150
 +set g_pickup_fuel 25
 +set g_pickup_fuel_weapon 15
 +set g_pickup_fuel_jetpack 50
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 150
 +set g_pickup_armorsmall_anyway 1
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 50
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 150
 +set g_pickup_armorlarge_anyway 1
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 250
 +set g_pickup_healthsmall_anyway 1
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 100
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 150
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 250
 +set g_pickup_healthmega_anyway 1
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 10
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 25
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 10
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.05
 +set g_balance_health_regenlinear 0
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0
 +set g_balance_health_rotlinear 1
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 0
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0
 +set g_balance_armor_rotlinear 1
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 0
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.7
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.65
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.7
 +set g_throughfloor_force 0.8
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
- set g_balance_crylink_primary_jointime 0.1
++// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.7
 +set g_projectiles_newton_style_2_maxfactor 5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 150
 +set g_balance_falldamage_minspeed 800
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 15
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.6
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 4
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
 +set g_balance_laser_primary_edgedamage 20
 +set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
 +set g_balance_laser_primary_radius 60
 +set g_balance_laser_primary_speed 5000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.6
 +set g_balance_laser_primary_animtime 0.4
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 2 // 300 upforce
 +set g_balance_laser_primary_force_velocitybias 0.3
 +set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 200 // dps
 +set g_balance_laser_secondary_edgedamage 0
 +set g_balance_laser_secondary_force 1300
 +set g_balance_laser_secondary_radius 60
 +set g_balance_laser_secondary_speed 0
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.066
 +set g_balance_laser_secondary_animtime 0.066
 +set g_balance_laser_secondary_lifetime 0
 +set g_balance_laser_secondary_shotangle 0
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 0
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 1.5
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 100
 +set g_balance_laser_shockwave_spread_min 20
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 18
 +set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
 +set g_balance_shotgun_primary_force 20
 +set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
 +set g_balance_shotgun_primary_refire 1
 +set g_balance_shotgun_primary_animtime 0.3
 +set g_balance_shotgun_primary_ammo 1
 +set g_balance_shotgun_primary_speed 12000
 +set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 0
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 110
 +set g_balance_shotgun_secondary_force 150
 +set g_balance_shotgun_secondary_refire 1.1
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.15
 +set g_balance_shotgun_switchdelay_raise 0.15
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
 +set g_balance_uzi_spread_add 0.008
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.45
 +set g_balance_uzi_burst_refire 0.05           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.07
 +set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 50
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
 +set g_balance_uzi_first_force 50
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.2
 +set g_balance_uzi_first_ammo 2
 +
 +set g_balance_uzi_sustained_damage 12   // 120 dps
 +set g_balance_uzi_sustained_force 12
 +set g_balance_uzi_sustained_spread 0.06
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
 +set g_balance_uzi_speed 18000
 +set g_balance_uzi_bulletconstant 115 // 13.1qu
 +
 +set g_balance_uzi_switchdelay_drop 0.15
 +set g_balance_uzi_switchdelay_raise 0.15
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 44
 +set g_balance_grenadelauncher_primary_edgedamage 32
 +set g_balance_grenadelauncher_primary_force 300
 +set g_balance_grenadelauncher_primary_radius 115
 +set g_balance_grenadelauncher_primary_speed 1500
 +set g_balance_grenadelauncher_primary_speed_up 225
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 0.65
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 80
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 62
 +set g_balance_grenadelauncher_secondary_edgedamage 32
 +set g_balance_grenadelauncher_secondary_force 300
 +set g_balance_grenadelauncher_secondary_radius 150
 +set g_balance_grenadelauncher_secondary_speed 1000
 +set g_balance_grenadelauncher_secondary_speed_up 250
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 3
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
 +set g_balance_grenadelauncher_secondary_refire 0.8
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 40
 +set g_balance_grenadelauncher_secondary_damageforcescale 0
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.12
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.15
 +set g_balance_grenadelauncher_switchdelay_raise 0.15
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 1
 +set g_balance_electro_primary_damage 100
 +set g_balance_electro_primary_edgedamage 0
 +set g_balance_electro_primary_force 425
 +set g_balance_electro_primary_force_up 125
 +set g_balance_electro_primary_radius 850
 +set g_balance_electro_primary_comboradius 150
 +set g_balance_electro_primary_speed 0
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 0
 +set g_balance_electro_primary_refire 0.4
 +set g_balance_electro_primary_animtime 0.2
 +set g_balance_electro_primary_ammo 5
 +set g_balance_electro_primary_range 800
 +set g_balance_electro_primary_falloff_mindist 0
 +set g_balance_electro_primary_falloff_maxdist 0
 +set g_balance_electro_primary_falloff_halflifedist 0
 +set g_balance_electro_secondary_damage 25
 +set g_balance_electro_secondary_edgedamage 0
 +set g_balance_electro_secondary_force 100
 +set g_balance_electro_secondary_radius 100
 +set g_balance_electro_secondary_speed 700
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.08
 +set g_balance_electro_secondary_lifetime 3.5
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 2
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 10
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 0
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.5
 +set g_balance_electro_secondary_bouncestop 0.075
 +set g_balance_electro_combo_damage 50
 +set g_balance_electro_combo_edgedamage 0
 +set g_balance_electro_combo_force 80
 +set g_balance_electro_combo_radius 250
 +set g_balance_electro_combo_comboradius 0
 +set g_balance_electro_combo_speed 400
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0.15
 +set g_balance_electro_switchdelay_raise 0.15
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink
 +set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
 +set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
 +set g_balance_crylink_primary_force 35
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 1500
 +set g_balance_crylink_primary_spread 0.05
 +set g_balance_crylink_primary_shots 7
 +set g_balance_crylink_primary_bounces 2
 +set g_balance_crylink_primary_refire 0.8
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 2
 +set g_balance_crylink_primary_bouncedamagefactor 0.2
 +set g_balance_crylink_primary_joindelay 0
 +set g_balance_crylink_primary_joinspread 0.2
- set g_balance_crylink_secondary_jointime 0.1
- set g_balance_crylink_secondary_joinexplode 0                 
- set g_balance_crylink_secondary_joinexplode_damage 0  
 +set g_balance_crylink_primary_joinexplode 0
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
 +set g_balance_crylink_primary_middle_fadetime 5
 +set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
 +set g_balance_crylink_primary_other_fadetime 0.25
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
 +set g_balance_crylink_secondary_edgedamage 3
 +set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
 +set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
 +set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
 +set g_balance_crylink_secondary_spread 0.1
 +set g_balance_crylink_secondary_spreadtype 0
 +set g_balance_crylink_secondary_shots 6
 +set g_balance_crylink_secondary_bounces 2
 +set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
 +set g_balance_crylink_secondary_animtime 0.3
 +set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
 +set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0.2
++set g_balance_crylink_secondary_joinexplode 0
++set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 0
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
 +set g_balance_crylink_secondary_middle_fadetime 5
 +set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
 +set g_balance_crylink_secondary_line_fadetime 0.25
 +
 +set g_balance_crylink_switchdelay_drop 0.15
 +set g_balance_crylink_switchdelay_raise 0.15
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 90
 +set g_balance_nex_primary_force 500
 +set g_balance_nex_primary_refire 1
 +set g_balance_nex_primary_animtime 0.3
 +set g_balance_nex_primary_ammo 5
 +set g_balance_nex_primary_damagefalloff_mindist 0
 +set g_balance_nex_primary_damagefalloff_maxdist 0
 +set g_balance_nex_primary_damagefalloff_halflife 0
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_secondary 0 // LOG: disable secondary
 +set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
 +set g_balance_nex_secondary_charge_rate 0.4
 +set g_balance_nex_secondary_chargepool 1
 +set g_balance_nex_secondary_chargepool_regen 0.25
 +set g_balance_nex_secondary_chargepool_pause_regen 2
 +set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 20
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.5
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
 +set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
 +set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 600
 +set g_balance_nex_charge_maxspeed 1000
 +
 +set g_balance_nex_switchdelay_drop 0.15
 +set g_balance_nex_switchdelay_raise 0.15
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.50
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.6
 +set g_balance_minstanex_switchdelay_drop 0.15
 +set g_balance_minstanex_switchdelay_raise 0.15
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 14
 +set g_balance_hagar_primary_edgedamage 6
 +set g_balance_hagar_primary_force 70
 +set g_balance_hagar_primary_health 0
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 110
 +set g_balance_hagar_primary_spread 0.1
 +set g_balance_hagar_primary_speed 1800
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.12
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 0
 +set g_balance_hagar_secondary_load_speed 0.6
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 0
 +set g_balance_hagar_secondary_load_releasedeath 1
 +set g_balance_hagar_secondary_load_abort 1
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 14 // default for _load: 32
 +set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
 +set g_balance_hagar_secondary_force 70 // default for _load: 160
 +set g_balance_hagar_secondary_health 0
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 125
 +set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
 +set g_balance_hagar_secondary_speed 1800
 +set g_balance_hagar_secondary_lifetime_min 5
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.15
 +set g_balance_hagar_switchdelay_raise 0.15
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 82
 +set g_balance_rocketlauncher_edgedamage 32
 +set g_balance_rocketlauncher_force 350
 +set g_balance_rocketlauncher_radius 130
 +set g_balance_rocketlauncher_speed 1400
 +set g_balance_rocketlauncher_speedaccel 1400
 +set g_balance_rocketlauncher_speedstart 800
 +set g_balance_rocketlauncher_lifetime 5
 +set g_balance_rocketlauncher_refire 1
 +set g_balance_rocketlauncher_animtime 0.3
 +set g_balance_rocketlauncher_ammo 3
 +set g_balance_rocketlauncher_health 0
 +set g_balance_rocketlauncher_damageforcescale 0
 +set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 42 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 60
 +set g_balance_rocketlauncher_remote_edgedamage 20
 +set g_balance_rocketlauncher_remote_radius 120
 +set g_balance_rocketlauncher_remote_force 350
 +set g_balance_rocketlauncher_switchdelay_drop 0.15
 +set g_balance_rocketlauncher_switchdelay_raise 0.15
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.2
 +set g_balance_porto_primary_speed 2000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 0
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.2
 +set g_balance_porto_secondary_speed 2000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0.15
 +set g_balance_porto_switchdelay_raise 0.15
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.2 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.2 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 0
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.15
 +set g_balance_hook_switchdelay_raise 0.15
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.15
 +set g_balance_tuba_switchdelay_raise 0.15
 +// }}}
 +// {{{ fireball
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 4
 +set g_balance_fireball_primary_edgedamage 0
 +set g_balance_fireball_primary_force 700
 +set g_balance_fireball_primary_health 50
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 5
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 650
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.2
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 2
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.15
 +set g_balance_fireball_switchdelay_raise 0.15
 +// }}}
index 17b5e88d3d9ea8e4c718c39242387ab112be9fb2,0000000000000000000000000000000000000000..f408bf88027851462e2b76c6f2d5ef6d1a76ee35
mode 100644,000000..100644
--- /dev/null
@@@ -1,753 -1,0 +1,751 @@@
- // 0: only damage from contents (lava/slime) or exceptions 
 +g_mod_balance XDF
 +
 +// {{{ starting gear
 +set g_start_weapon_laser 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi 1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default" // UNTIL IT CAN BE REMOVED FROM CODE
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default"
 +set g_balance_health_start 100
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 15
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 100 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 200
 +set g_lms_start_ammo_shells 60
 +set g_lms_start_ammo_nails 320
 +set g_lms_start_ammo_rockets 160
 +set g_lms_start_ammo_cells 180
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 60
 +set g_balance_nix_ammo_nails 320
 +set g_balance_nix_ammo_rockets 160
 +set g_balance_nix_ammo_cells 180
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 60
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 320
 +set g_pickup_rockets 40
 +set g_pickup_rockets_weapon 40
 +set g_pickup_rockets_max 160
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 30
 +set g_pickup_cells_max 180
 +set g_pickup_fuel 50
 +set g_pickup_fuel_weapon 50
 +set g_pickup_fuel_jetpack 100
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 200
 +set g_pickup_armorsmall_anyway 1
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 200
 +set g_pickup_armormedium_anyway 1
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 200
 +set g_pickup_armorbig_anyway 1
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 200
 +set g_pickup_armorlarge_anyway 1
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 200
 +set g_pickup_healthsmall_anyway 1
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 200
 +set g_pickup_healthmedium_anyway 1
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 200
 +set g_pickup_healthlarge_anyway 1
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 200
 +set g_pickup_healthmega_anyway 1
 +set g_pickup_respawntime_short 0.1
 +set g_pickup_respawntime_medium 0.1
 +set g_pickup_respawntime_long 0.1
 +set g_pickup_respawntime_powerup 0.1
 +set g_pickup_respawntime_weapon 0.1
 +set g_pickup_respawntime_superweapon 0.1
 +set g_pickup_respawntime_ammo 0.1
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 30
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.08
 +set g_balance_health_regenlinear 0.5
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.04
 +set g_balance_health_rotlinear 0.75
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 5
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.04
 +set g_balance_armor_rotlinear 0.75
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 5
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.4
 +set g_throughfloor_force 0.7
 +set g_projectiles_damage 2
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
- set g_balance_uzi_burst_damage 25             
++// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 2
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.8
 +set g_projectiles_newton_style_2_maxfactor 1.5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 250
 +set g_balance_falldamage_minspeed 900
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 40
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
 +set g_balance_powerup_invincible_time 999
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 3
 +set g_balance_powerup_strength_time 999
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 130
 +set g_balance_grapplehook_damagedbycontents 0
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 1 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 25
 +set g_balance_laser_primary_edgedamage 12.5
 +set g_balance_laser_primary_force 250
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 6000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.3
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 1.5
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 0 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 25
 +set g_balance_laser_secondary_edgedamage 12.5
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 12000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.2
 +set g_balance_laser_secondary_lifetime 5
 +set g_balance_laser_secondary_shotangle -90
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 2
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 120
 +set g_balance_laser_shockwave_spread_min 25
 +
 +set g_balance_laser_switchdelay_drop 0
 +set g_balance_laser_switchdelay_raise 0
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 14
 +set g_balance_shotgun_primary_damage 4
 +set g_balance_shotgun_primary_force 15
 +set g_balance_shotgun_primary_spread 0.12
 +set g_balance_shotgun_primary_refire 0.75
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
 +set g_balance_shotgun_primary_speed 8000
 +set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 80
 +set g_balance_shotgun_secondary_force 200
 +set g_balance_shotgun_secondary_refire 1.25
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0
 +set g_balance_shotgun_switchdelay_raise 0
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0
 +set g_balance_uzi_spread_max 0
 +set g_balance_uzi_spread_add 0
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.3
 +set g_balance_uzi_burst_refire 0.06           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.03
- // {{{ crylink 
++set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 20
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 14
 +set g_balance_uzi_first_force 5
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.4
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 12
 +set g_balance_uzi_sustained_force 5
 +set g_balance_uzi_sustained_spread 0
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
 +set g_balance_uzi_speed 18000
 +set g_balance_uzi_bulletconstant 115 // 13.1qu
 +
 +set g_balance_uzi_switchdelay_drop 0
 +set g_balance_uzi_switchdelay_raise 0
 +
 +set g_balance_uzi_reload_ammo 0 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 50
 +set g_balance_grenadelauncher_primary_edgedamage 25
 +set g_balance_grenadelauncher_primary_force 250
 +set g_balance_grenadelauncher_primary_radius 100
 +set g_balance_grenadelauncher_primary_speed 2000
 +set g_balance_grenadelauncher_primary_speed_up 200
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.7
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 0
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 60
 +set g_balance_grenadelauncher_secondary_edgedamage 30
 +set g_balance_grenadelauncher_secondary_force 300
 +set g_balance_grenadelauncher_secondary_radius 200
 +set g_balance_grenadelauncher_secondary_speed 800
 +set g_balance_grenadelauncher_secondary_speed_up 0
 +set g_balance_grenadelauncher_secondary_speed_z 200
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 8
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.5
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 0
 +set g_balance_grenadelauncher_secondary_damageforcescale 0
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0
 +set g_balance_grenadelauncher_switchdelay_raise 0
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 55
 +set g_balance_electro_primary_edgedamage 27.5
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 100
 +set g_balance_electro_primary_comboradius 150
 +set g_balance_electro_primary_speed 2500
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 5
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.1
 +set g_balance_electro_primary_ammo 4
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 40
 +set g_balance_electro_secondary_edgedamage 20
 +set g_balance_electro_secondary_force 200
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 900
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.05
 +set g_balance_electro_secondary_lifetime 3
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 1.5
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 1
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.4
 +set g_balance_electro_secondary_bouncestop 0.05
 +set g_balance_electro_combo_damage 40
 +set g_balance_electro_combo_edgedamage 20
 +set g_balance_electro_combo_force 120
 +set g_balance_electro_combo_radius 175
 +set g_balance_electro_combo_comboradius 275
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0
 +set g_balance_electro_switchdelay_raise 0
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
- set g_balance_crylink_primary_jointime 0
++// {{{ crylink
 +set g_balance_crylink_primary_damage 12
 +set g_balance_crylink_primary_edgedamage 6
 +set g_balance_crylink_primary_force -50
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 2000
 +set g_balance_crylink_primary_spread 0.08
 +set g_balance_crylink_primary_shots 6
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.7
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 3
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0.1
 +set g_balance_crylink_primary_joinspread 0.2
- set g_balance_crylink_primary_other_lifetime 5 
 +set g_balance_crylink_primary_joinexplode 1
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
- set g_balance_crylink_secondary_jointime 0
- set g_balance_crylink_secondary_joinexplode 0                 
- set g_balance_crylink_secondary_joinexplode_damage 0  
++set g_balance_crylink_primary_other_lifetime 5
 +set g_balance_crylink_primary_other_fadetime 5
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 10
 +set g_balance_crylink_secondary_edgedamage 5
 +set g_balance_crylink_secondary_force -150
 +set g_balance_crylink_secondary_radius 100
 +set g_balance_crylink_secondary_speed 3000
 +set g_balance_crylink_secondary_spread 0.01
 +set g_balance_crylink_secondary_spreadtype 1
 +set g_balance_crylink_secondary_shots 5
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.7
 +set g_balance_crylink_secondary_animtime 0.2
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
- set g_balance_crylink_secondary_line_lifetime 5 
++set g_balance_crylink_secondary_joinexplode 0
++set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
- // {{{ fireball // this is a superweapon -- lets make it behave as one. 
++set g_balance_crylink_secondary_line_lifetime 5
 +set g_balance_crylink_secondary_line_fadetime 5
 +
 +set g_balance_crylink_switchdelay_drop 0
 +set g_balance_crylink_switchdelay_raise 0
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 90
 +set g_balance_nex_primary_force 400
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.4
 +set g_balance_nex_primary_ammo 6
 +set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 +set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
 +set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 2
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.4
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down untill this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 800
 +
 +set g_balance_nex_switchdelay_drop 0
 +set g_balance_nex_switchdelay_raise 0
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0
 +set g_balance_minstanex_switchdelay_raise 0
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 25
 +set g_balance_hagar_primary_edgedamage 12.5
 +set g_balance_hagar_primary_force 92
 +set g_balance_hagar_primary_health 15
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 25
 +set g_balance_hagar_primary_spread 0.03
 +set g_balance_hagar_primary_speed 2000
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.11
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 0
 +set g_balance_hagar_secondary_load 1
 +set g_balance_hagar_secondary_load_speed 0.5
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 4
 +set g_balance_hagar_secondary_load_releasedeath 0
 +set g_balance_hagar_secondary_load_abort 0
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 40
 +set g_balance_hagar_secondary_edgedamage 20
 +set g_balance_hagar_secondary_force 75
 +set g_balance_hagar_secondary_health 15
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 80
 +set g_balance_hagar_secondary_spread 0.05
 +set g_balance_hagar_secondary_speed 2000
 +set g_balance_hagar_secondary_lifetime_min 10
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.5
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0
 +set g_balance_hagar_switchdelay_raise 0
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 80
 +set g_balance_rocketlauncher_edgedamage 40
 +set g_balance_rocketlauncher_force 350
 +set g_balance_rocketlauncher_radius 110
 +set g_balance_rocketlauncher_speed 1000
 +set g_balance_rocketlauncher_speedaccel 0
 +set g_balance_rocketlauncher_speedstart 1000
 +set g_balance_rocketlauncher_lifetime 100
 +set g_balance_rocketlauncher_refire 0.9
 +set g_balance_rocketlauncher_animtime 0.7
 +set g_balance_rocketlauncher_ammo 4
 +set g_balance_rocketlauncher_health 0 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
 +set g_balance_rocketlauncher_damageforcescale 0 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
 +set g_balance_rocketlauncher_detonatedelay 999 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 0 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 1 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 70
 +set g_balance_rocketlauncher_remote_edgedamage 35
 +set g_balance_rocketlauncher_remote_radius 110
 +set g_balance_rocketlauncher_remote_force 350
 +set g_balance_rocketlauncher_switchdelay_drop 0
 +set g_balance_rocketlauncher_switchdelay_raise 0
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 5000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 1
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 1000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0
 +set g_balance_porto_switchdelay_raise 0
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 50 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 15
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0
 +set g_balance_hook_switchdelay_raise 0
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0
 +set g_balance_tuba_switchdelay_raise 0
 +// }}}
++// {{{ fireball // this is a superweapon -- lets make it behave as one.
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 0
 +set g_balance_fireball_primary_edgedamage 50
 +set g_balance_fireball_primary_force 600
 +set g_balance_fireball_primary_health 0
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 2
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 1200
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 1.5
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0
 +set g_balance_fireball_switchdelay_raise 0
 +// }}}
index 1b3b5286e89506504d86b15f54fdf4ed81c133ee,0000000000000000000000000000000000000000..8f62776d9c134a2a0418d5844021911569cf5c8e
mode 100644,000000..100644
--- /dev/null
@@@ -1,783 -1,0 +1,781 @@@
- // 0: only damage from contents (lava/slime) or exceptions 
 +g_mod_balance XPM
 +
 +// {{{ starting gear
 +set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
 +set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 +set g_balance_health_start 100
 +set g_balance_armor_start 0
 +set g_start_ammo_shells 15
 +set g_start_ammo_nails 0
 +set g_start_ammo_rockets 0
 +set g_start_ammo_cells 0
 +set g_start_ammo_fuel 0
 +set g_warmup_start_health 100 "starting values when being in warmup-stage"
 +set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
 +set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 +set g_lms_start_health 200
 +set g_lms_start_armor 200
 +set g_lms_start_ammo_shells 60
 +set g_lms_start_ammo_nails 320
 +set g_lms_start_ammo_rockets 160
 +set g_lms_start_ammo_cells 180
 +set g_lms_start_ammo_fuel 0
 +set g_balance_nix_roundtime 25
 +set g_balance_nix_incrtime 1.6
 +set g_balance_nix_ammo_shells 60
 +set g_balance_nix_ammo_nails 320
 +set g_balance_nix_ammo_rockets 160
 +set g_balance_nix_ammo_cells 180
 +set g_balance_nix_ammo_fuel 0
 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
 +set g_balance_nix_ammoincr_nails 6
 +set g_balance_nix_ammoincr_rockets 2
 +set g_balance_nix_ammoincr_cells 2
 +set g_balance_nix_ammoincr_fuel 2
 +// }}}
 +
 +// {{{ pickup items
 +set g_pickup_ammo_anyway 1
 +set g_pickup_weapons_anyway 1
 +set g_pickup_shells 15
 +set g_pickup_shells_weapon 15
 +set g_pickup_shells_max 60
 +set g_pickup_nails 80
 +set g_pickup_nails_weapon 80
 +set g_pickup_nails_max 320
 +set g_pickup_rockets 40
 +set g_pickup_rockets_weapon 40
 +set g_pickup_rockets_max 160
 +set g_pickup_cells 30
 +set g_pickup_cells_weapon 30
 +set g_pickup_cells_max 180
 +set g_pickup_fuel 50
 +set g_pickup_fuel_weapon 50
 +set g_pickup_fuel_jetpack 100
 +set g_pickup_fuel_max 100
 +set g_pickup_armorsmall 5
 +set g_pickup_armorsmall_max 200
 +set g_pickup_armorsmall_anyway 0
 +set g_pickup_armormedium 25
 +set g_pickup_armormedium_max 100
 +set g_pickup_armormedium_anyway 0
 +set g_pickup_armorbig 50
 +set g_pickup_armorbig_max 100
 +set g_pickup_armorbig_anyway 0
 +set g_pickup_armorlarge 100
 +set g_pickup_armorlarge_max 200
 +set g_pickup_armorlarge_anyway 0
 +set g_pickup_healthsmall 5
 +set g_pickup_healthsmall_max 200
 +set g_pickup_healthsmall_anyway 0
 +set g_pickup_healthmedium 25
 +set g_pickup_healthmedium_max 100
 +set g_pickup_healthmedium_anyway 0
 +set g_pickup_healthlarge 50
 +set g_pickup_healthlarge_max 100
 +set g_pickup_healthlarge_anyway 0
 +set g_pickup_healthmega 100
 +set g_pickup_healthmega_max 200
 +set g_pickup_healthmega_anyway 0
 +set g_pickup_respawntime_short 15
 +set g_pickup_respawntime_medium 20
 +set g_pickup_respawntime_long 30
 +set g_pickup_respawntime_powerup 120
 +set g_pickup_respawntime_weapon 10
 +set g_pickup_respawntime_superweapon 120
 +set g_pickup_respawntime_ammo 15
 +set g_pickup_respawntimejitter_short 0
 +set g_pickup_respawntimejitter_medium 0
 +set g_pickup_respawntimejitter_long 0
 +set g_pickup_respawntimejitter_powerup 30
 +set g_pickup_respawntimejitter_weapon 0
 +set g_pickup_respawntimejitter_superweapon 10
 +set g_pickup_respawntimejitter_ammo 0
 +// }}}
 +
 +// {{{ regen/rot
 +set g_balance_health_regen 0.08
 +set g_balance_health_regenlinear 0.5
 +set g_balance_pause_health_regen 5
 +set g_balance_pause_health_regen_spawn 0
 +set g_balance_health_rot 0.03
 +set g_balance_health_rotlinear 0.75
 +set g_balance_pause_health_rot 1
 +set g_balance_pause_health_rot_spawn 5
 +set g_balance_health_regenstable 100
 +set g_balance_health_rotstable 100
 +set g_balance_health_limit 999
 +set g_balance_armor_regen 0
 +set g_balance_armor_regenlinear 0
 +set g_balance_armor_rot 0.03
 +set g_balance_armor_rotlinear 0.75
 +set g_balance_pause_armor_rot 1
 +set g_balance_pause_armor_rot_spawn 5
 +set g_balance_armor_regenstable 100
 +set g_balance_armor_rotstable 100
 +set g_balance_armor_limit 999
 +set g_balance_armor_blockpercent 0.6
 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 +set g_balance_fuel_regenlinear 0
 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
 +set g_balance_fuel_rot 0.05
 +set g_balance_fuel_rotlinear 0
 +set g_balance_pause_fuel_rot 5
 +set g_balance_pause_fuel_rot_spawn 10
 +set g_balance_fuel_regenstable 50
 +set g_balance_fuel_rotstable 100
 +set g_balance_fuel_limit 999
 +// }}}
 +
 +// {{{ misc
 +set g_balance_selfdamagepercent 0.65
 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 +set g_weaponratefactor 1 "weapon fire rate multiplier"
 +set g_weapondamagefactor 1 "weapon damage multiplier"
 +set g_weaponforcefactor 1 "weapon force multiplier"
 +set g_weaponspreadfactor 1 "weapon spread multiplier"
 +set g_balance_firetransfer_time 0.9
 +set g_balance_firetransfer_damage 0.8
 +set g_throughfloor_damage 0.75
 +set g_throughfloor_force 0.75
 +set g_projectiles_damage 1
 +// possible values:
 +// -2: absolutely no damage to projectiles (no exceptions)
 +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines)
- set g_balance_uzi_burst_damage 25             
++// 0: only damage from contents (lava/slime) or exceptions
 +// 1: only self damage or damage from contents or exceptions
 +// 2: allow all damage to projectiles normally
 +set g_projectiles_keep_owner 0
 +set g_projectiles_newton_style 0
 +// possible values:
 +// 0: absolute velocity projectiles (like Quake)
 +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
 +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 +set g_projectiles_newton_style_2_minfactor 0.8
 +set g_projectiles_newton_style_2_maxfactor 1.5
 +set g_projectiles_spread_style 7
 +// possible values:
 +// 0: forward + solid sphere (like Quake) - varies velocity
 +// 1: forward + flattened solid sphere
 +// 2: forward + solid circle
 +// 3: forward + normal distribution 3D - varies velocity
 +// 4: forward + normal distribution on a plane
 +// 5: forward + circle with 1-r falloff
 +// 6: forward + circle with 1-r^2 falloff
 +// 7: forward + circle with (1-r)(2-r) falloff
 +set g_balance_falldamage_deadminspeed 250
 +set g_balance_falldamage_minspeed 900
 +set g_balance_falldamage_factor 0.20
 +set g_balance_falldamage_maxdamage 40
 +set g_balance_damagepush_speedfactor 2.5
 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage
 +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning
 +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning
 +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava
 +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime
 +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime
 +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap"
 +// }}}
 +
 +// {{{ powerups
 +set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
 +set g_balance_powerup_invincible_time 30
 +set g_balance_powerup_strength_damage 3
 +set g_balance_powerup_strength_force 3
 +set g_balance_powerup_strength_time 30
 +set g_balance_powerup_strength_selfdamage 1.5
 +set g_balance_powerup_strength_selfforce 1.5
 +set g_balance_superweapons_time 30
 +// }}}
 +
 +// {{{ jetpack/hook
 +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
 +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
 +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 +set g_jetpack_fuel 8 "fuel per second for jetpack"
 +set g_jetpack_attenuation 2 "jetpack sound attenuation"
 +
 +set g_grappling_hook_tarzan 2 // 2: can also pull players
 +set g_balance_grapplehook_speed_fly 1800
 +set g_balance_grapplehook_speed_pull 2000
 +set g_balance_grapplehook_force_rubber 2000
 +set g_balance_grapplehook_force_rubber_overstretch 1000
 +set g_balance_grapplehook_length_min 50
 +set g_balance_grapplehook_stretch 50
 +set g_balance_grapplehook_airfriction 0.2
 +set g_balance_grapplehook_health 50
 +set g_balance_grapplehook_damagedbycontents 1
 +// }}}
 +
 +// {{{ weapon properties
 +// {{{ laser
 +set g_balance_laser_melee_animtime 0.3
 +set g_balance_laser_melee_damage 80
 +set g_balance_laser_melee_delay 0.25
 +set g_balance_laser_melee_force 200
 +set g_balance_laser_melee_multihit 1
 +set g_balance_laser_melee_no_doubleslap 1
 +set g_balance_laser_melee_nonplayerdamage 40
 +set g_balance_laser_melee_range 120
 +set g_balance_laser_melee_refire 1.25
 +set g_balance_laser_melee_swing_side 120
 +set g_balance_laser_melee_swing_up 30
 +set g_balance_laser_melee_time 0.15
 +set g_balance_laser_melee_traces 10
 +
 +set g_balance_laser_primary 0 // 0 = shockwave attack, 1 = projectile primary
 +set g_balance_laser_primary_damage 25
 +set g_balance_laser_primary_edgedamage 12.5
 +set g_balance_laser_primary_force 300
 +set g_balance_laser_primary_radius 70
 +set g_balance_laser_primary_speed 6000
 +set g_balance_laser_primary_spread 0
 +set g_balance_laser_primary_refire 0.7
 +set g_balance_laser_primary_animtime 0.2
 +set g_balance_laser_primary_lifetime 5
 +set g_balance_laser_primary_shotangle 0
 +set g_balance_laser_primary_delay 0
 +set g_balance_laser_primary_force_zscale 1.2
 +set g_balance_laser_primary_force_velocitybias 0
 +set g_balance_laser_primary_force_other_scale 1
 +
 +set g_balance_laser_secondary 2 // 0 = switch away to last used weapon, 1 = projectile secondary, 2 = melee secondary
 +set g_balance_laser_secondary_damage 25
 +set g_balance_laser_secondary_edgedamage 12.5
 +set g_balance_laser_secondary_force 400
 +set g_balance_laser_secondary_radius 70
 +set g_balance_laser_secondary_speed 12000
 +set g_balance_laser_secondary_spread 0
 +set g_balance_laser_secondary_refire 0.7
 +set g_balance_laser_secondary_animtime 0.2
 +set g_balance_laser_secondary_lifetime 5
 +set g_balance_laser_secondary_shotangle -90
 +set g_balance_laser_secondary_delay 0
 +set g_balance_laser_secondary_force_zscale 1.25
 +set g_balance_laser_secondary_force_velocitybias 0
 +set g_balance_laser_secondary_force_other_scale 1
 +
 +set g_balance_laser_shockwave_damage 20
 +set g_balance_laser_shockwave_distance 2000
 +set g_balance_laser_shockwave_edgedamage 0
 +set g_balance_laser_shockwave_force 200
 +set g_balance_laser_shockwave_force_forwardbias 50
 +set g_balance_laser_shockwave_force_zscale 2
 +set g_balance_laser_shockwave_jump_damage 20
 +set g_balance_laser_shockwave_jump_edgedamage 0
 +set g_balance_laser_shockwave_jump_force 300
 +set g_balance_laser_shockwave_jump_force_velocitybias 0
 +set g_balance_laser_shockwave_jump_force_zscale 1.25
 +set g_balance_laser_shockwave_jump_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_jump_multiplier_distance 0.5
 +set g_balance_laser_shockwave_jump_multiplier_min 0
 +set g_balance_laser_shockwave_jump_radius 150
 +set g_balance_laser_shockwave_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_multiplier_distance 0.5
 +set g_balance_laser_shockwave_multiplier_min 0
 +set g_balance_laser_shockwave_splash_damage 15
 +set g_balance_laser_shockwave_splash_edgedamage 0
 +set g_balance_laser_shockwave_splash_force 100
 +set g_balance_laser_shockwave_splash_force_forwardbias 50
 +set g_balance_laser_shockwave_splash_multiplier_accuracy 0.5
 +set g_balance_laser_shockwave_splash_multiplier_distance 0.5
 +set g_balance_laser_shockwave_splash_multiplier_min 0
 +set g_balance_laser_shockwave_splash_radius 70
 +set g_balance_laser_shockwave_spread_max 120
 +set g_balance_laser_shockwave_spread_min 25
 +
 +set g_balance_laser_switchdelay_drop 0.15
 +set g_balance_laser_switchdelay_raise 0.15
 +set g_balance_laser_reload_ammo 0 //default: 6
 +set g_balance_laser_reload_time 2
 +// }}}
 +// {{{ shotgun
 +set g_balance_shotgun_primary_bullets 14
 +set g_balance_shotgun_primary_damage 4
 +set g_balance_shotgun_primary_force 15
 +set g_balance_shotgun_primary_spread 0.12
 +set g_balance_shotgun_primary_refire 0.75
 +set g_balance_shotgun_primary_animtime 0.2
 +set g_balance_shotgun_primary_ammo 1
 +set g_balance_shotgun_primary_speed 8000
 +set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 +set g_balance_shotgun_secondary 1
 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
 +set g_balance_shotgun_secondary_melee_range 120
 +set g_balance_shotgun_secondary_melee_swing_side 120
 +set g_balance_shotgun_secondary_melee_swing_up 30
 +set g_balance_shotgun_secondary_melee_time 0.15
 +set g_balance_shotgun_secondary_melee_traces 10
 +set g_balance_shotgun_secondary_melee_no_doubleslap 1
 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40
 +set g_balance_shotgun_secondary_melee_multihit 1
 +set g_balance_shotgun_secondary_damage 80
 +set g_balance_shotgun_secondary_force 200
 +set g_balance_shotgun_secondary_refire 1.25
 +set g_balance_shotgun_secondary_animtime 1
 +set g_balance_shotgun_switchdelay_drop 0.2
 +set g_balance_shotgun_switchdelay_raise 0.2
 +set g_balance_shotgun_reload_ammo 0 //default: 5
 +set g_balance_shotgun_reload_time 2
 +// }}}
 +// {{{ uzi
 +set g_balance_uzi_mode 1                              // Activates varible spread for sustained & burst mode secondary
 +set g_balance_uzi_spread_min 0.02
 +set g_balance_uzi_spread_max 0.05
 +set g_balance_uzi_spread_add 0.012
 +
 +set g_balance_uzi_burst 3                             // # of bullets in a burst (if set to 2 or more)
 +set g_balance_uzi_burst_animtime 0.3
 +set g_balance_uzi_burst_refire 0.06           // refire between burst bullets
 +set g_balance_uzi_burst_refire2 0.45  // refire after burst
 +set g_balance_uzi_burst_spread 0.02
- set g_balance_crylink_primary_jointime 0
++set g_balance_uzi_burst_damage 25
 +set g_balance_uzi_burst_force 20
 +set g_balance_uzi_burst_ammo 3
 +
 +set g_balance_uzi_first 1
 +set g_balance_uzi_first_damage 14
 +set g_balance_uzi_first_force 5
 +set g_balance_uzi_first_spread 0.03
 +set g_balance_uzi_first_refire 0.125
 +set g_balance_uzi_first_ammo 1
 +
 +set g_balance_uzi_sustained_damage 10 // 100 dps
 +set g_balance_uzi_sustained_force 5
 +set g_balance_uzi_sustained_spread 0.03
 +set g_balance_uzi_sustained_refire 0.1
 +set g_balance_uzi_sustained_ammo 1
 +
 +set g_balance_uzi_speed 18000
 +set g_balance_uzi_bulletconstant 115 // 13.1qu
 +
 +set g_balance_uzi_switchdelay_drop 0.2
 +set g_balance_uzi_switchdelay_raise 0.2
 +
 +set g_balance_uzi_reload_ammo 60 //default: 30
 +set g_balance_uzi_reload_time 2
 +// }}}
 +// {{{ mortar
 +set g_balance_grenadelauncher_primary_type 0
 +set g_balance_grenadelauncher_primary_damage 50
 +set g_balance_grenadelauncher_primary_edgedamage 25
 +set g_balance_grenadelauncher_primary_force 250
 +set g_balance_grenadelauncher_primary_radius 120
 +set g_balance_grenadelauncher_primary_speed 1900
 +set g_balance_grenadelauncher_primary_speed_up 225
 +set g_balance_grenadelauncher_primary_speed_z 0
 +set g_balance_grenadelauncher_primary_spread 0
 +set g_balance_grenadelauncher_primary_lifetime 5
 +set g_balance_grenadelauncher_primary_lifetime2 1
 +set g_balance_grenadelauncher_primary_refire 0.8
 +set g_balance_grenadelauncher_primary_animtime 0.3
 +set g_balance_grenadelauncher_primary_ammo 2
 +set g_balance_grenadelauncher_primary_health 15
 +set g_balance_grenadelauncher_primary_damageforcescale 0
 +set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 +
 +set g_balance_grenadelauncher_secondary_type 1
 +set g_balance_grenadelauncher_secondary_damage 60
 +set g_balance_grenadelauncher_secondary_edgedamage 30
 +set g_balance_grenadelauncher_secondary_force 250
 +set g_balance_grenadelauncher_secondary_radius 120
 +set g_balance_grenadelauncher_secondary_speed 1400
 +set g_balance_grenadelauncher_secondary_speed_up 150
 +set g_balance_grenadelauncher_secondary_speed_z 0
 +set g_balance_grenadelauncher_secondary_spread 0
 +set g_balance_grenadelauncher_secondary_lifetime 5
 +set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
 +set g_balance_grenadelauncher_secondary_lifetime_stick 0
 +set g_balance_grenadelauncher_secondary_refire 0.7
 +set g_balance_grenadelauncher_secondary_animtime 0.3
 +set g_balance_grenadelauncher_secondary_ammo 2
 +set g_balance_grenadelauncher_secondary_health 30
 +set g_balance_grenadelauncher_secondary_damageforcescale 4
 +set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 +
 +set g_balance_grenadelauncher_bouncefactor 0.5
 +set g_balance_grenadelauncher_bouncestop 0.075
 +
 +set g_balance_grenadelauncher_switchdelay_drop 0.2
 +set g_balance_grenadelauncher_switchdelay_raise 0.2
 +
 +set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 +set g_balance_grenadelauncher_reload_time 2
 +// }}}
 +// {{{ electro
 +set g_balance_electro_lightning 0
 +set g_balance_electro_primary_damage 40
 +set g_balance_electro_primary_edgedamage 20
 +set g_balance_electro_primary_force 200
 +set g_balance_electro_primary_force_up 0
 +set g_balance_electro_primary_radius 100
 +set g_balance_electro_primary_comboradius 200
 +set g_balance_electro_primary_speed 2500
 +set g_balance_electro_primary_spread 0
 +set g_balance_electro_primary_lifetime 5
 +set g_balance_electro_primary_refire 0.6
 +set g_balance_electro_primary_animtime 0.3
 +set g_balance_electro_primary_ammo 4
 +set g_balance_electro_primary_range 0
 +set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
 +set g_balance_electro_primary_falloff_maxdist 850
 +set g_balance_electro_primary_falloff_halflifedist 425
 +set g_balance_electro_secondary_damage 40
 +set g_balance_electro_secondary_edgedamage 20
 +set g_balance_electro_secondary_force 50
 +set g_balance_electro_secondary_radius 150
 +set g_balance_electro_secondary_speed 1000
 +set g_balance_electro_secondary_speed_up 200
 +set g_balance_electro_secondary_speed_z 0
 +set g_balance_electro_secondary_spread 0.04
 +set g_balance_electro_secondary_lifetime 4
 +set g_balance_electro_secondary_refire 0.2
 +set g_balance_electro_secondary_refire2 1.6
 +set g_balance_electro_secondary_animtime 0.2
 +set g_balance_electro_secondary_ammo 2
 +set g_balance_electro_secondary_health 5
 +set g_balance_electro_secondary_damageforcescale 4
 +set g_balance_electro_secondary_damagedbycontents 1
 +set g_balance_electro_secondary_count 3
 +set g_balance_electro_secondary_bouncefactor 0.3
 +set g_balance_electro_secondary_bouncestop 0.05
 +set g_balance_electro_combo_damage 50
 +set g_balance_electro_combo_edgedamage 25
 +set g_balance_electro_combo_force 120
 +set g_balance_electro_combo_radius 150
 +set g_balance_electro_combo_comboradius 300
 +set g_balance_electro_combo_speed 2000
 +set g_balance_electro_combo_safeammocheck 1
 +set g_balance_electro_switchdelay_drop 0.2
 +set g_balance_electro_switchdelay_raise 0.2
 +set g_balance_electro_reload_ammo 0 //default: 20
 +set g_balance_electro_reload_time 2
 +// }}}
 +// {{{ lightning
 +set g_balance_lightning_primary_ammo 5
 +set g_balance_lightning_primary_animtime 0.2
 +set g_balance_lightning_primary_damage 100
 +set g_balance_lightning_primary_edgedamage 0
 +set g_balance_lightning_primary_falloff_mindist 0
 +set g_balance_lightning_primary_falloff_maxdist 0
 +set g_balance_lightning_primary_falloff_halflifedist 0
 +set g_balance_lightning_primary_force 425
 +set g_balance_lightning_primary_lifetime 0
 +set g_balance_lightning_primary_radius 850
 +set g_balance_lightning_primary_range 800
 +set g_balance_lightning_primary_refire 0.4
 +set g_balance_lightning_primary_speed 0
 +set g_balance_lightning_primary_spread 0
 +set g_balance_lightning_secondary_ammo 5
 +set g_balance_lightning_secondary_animtime 0.5
 +set g_balance_lightning_secondary_damage 100
 +set g_balance_lightning_secondary_damageforcescale 4
 +set g_balance_lightning_secondary_edgedamage 80
 +set g_balance_lightning_secondary_flyingdamage 1
 +set g_balance_lightning_secondary_flyingforce -80
 +set g_balance_lightning_secondary_flyingradius 200
 +set g_balance_lightning_secondary_force -200
 +set g_balance_lightning_secondary_health 1
 +set g_balance_lightning_secondary_lifetime 30
 +set g_balance_lightning_secondary_radius 300
 +set g_balance_lightning_secondary_refire 5
 +set g_balance_lightning_secondary_speed 600
 +// }}}
 +// {{{ crylink 
 +set g_balance_crylink_primary_damage 12
 +set g_balance_crylink_primary_edgedamage 6
 +set g_balance_crylink_primary_force -50
 +set g_balance_crylink_primary_radius 80
 +set g_balance_crylink_primary_speed 2000
 +set g_balance_crylink_primary_spread 0.08
 +set g_balance_crylink_primary_shots 6
 +set g_balance_crylink_primary_bounces 1
 +set g_balance_crylink_primary_refire 0.7
 +set g_balance_crylink_primary_animtime 0.3
 +set g_balance_crylink_primary_ammo 3
 +set g_balance_crylink_primary_bouncedamagefactor 0.5
 +set g_balance_crylink_primary_joindelay 0.1
 +set g_balance_crylink_primary_joinspread 0.2
- set g_balance_crylink_primary_other_lifetime 5 
 +set g_balance_crylink_primary_joinexplode 1
 +set g_balance_crylink_primary_joinexplode_damage 0
 +set g_balance_crylink_primary_joinexplode_edgedamage 0
 +set g_balance_crylink_primary_joinexplode_radius 0
 +set g_balance_crylink_primary_joinexplode_force 0
 +set g_balance_crylink_primary_linkexplode 1
 +
 +set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_primary_middle_fadetime 5
- set g_balance_crylink_secondary_jointime 0
- set g_balance_crylink_secondary_joinexplode 0                 
- set g_balance_crylink_secondary_joinexplode_damage 0  
++set g_balance_crylink_primary_other_lifetime 5
 +set g_balance_crylink_primary_other_fadetime 5
 +
 +set g_balance_crylink_secondary 1
 +set g_balance_crylink_secondary_damage 10
 +set g_balance_crylink_secondary_edgedamage 5
 +set g_balance_crylink_secondary_force -250
 +set g_balance_crylink_secondary_radius 100
 +set g_balance_crylink_secondary_speed 3000
 +set g_balance_crylink_secondary_spread 0.01
 +set g_balance_crylink_secondary_spreadtype 1
 +set g_balance_crylink_secondary_shots 5
 +set g_balance_crylink_secondary_bounces 0
 +set g_balance_crylink_secondary_refire 0.7
 +set g_balance_crylink_secondary_animtime 0.2
 +set g_balance_crylink_secondary_ammo 2
 +set g_balance_crylink_secondary_bouncedamagefactor 0.5
 +set g_balance_crylink_secondary_joindelay 0
 +set g_balance_crylink_secondary_joinspread 0
- set g_balance_crylink_secondary_line_lifetime 5 
++set g_balance_crylink_secondary_joinexplode 0
++set g_balance_crylink_secondary_joinexplode_damage 0
 +set g_balance_crylink_secondary_joinexplode_edgedamage 0
 +set g_balance_crylink_secondary_joinexplode_radius 0
 +set g_balance_crylink_secondary_joinexplode_force 0
 +set g_balance_crylink_secondary_linkexplode 1
 +
 +set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 +set g_balance_crylink_secondary_middle_fadetime 5
- // {{{ fireball // this is a superweapon -- lets make it behave as one. 
++set g_balance_crylink_secondary_line_lifetime 5
 +set g_balance_crylink_secondary_line_fadetime 5
 +
 +set g_balance_crylink_switchdelay_drop 0.2
 +set g_balance_crylink_switchdelay_raise 0.2
 +
 +set g_balance_crylink_reload_ammo 0 //default: 10
 +set g_balance_crylink_reload_time 2
 +// }}}
 +// {{{ nex
 +set g_balance_nex_primary_damage 80
 +set g_balance_nex_primary_force 400
 +set g_balance_nex_primary_refire 1.5
 +set g_balance_nex_primary_animtime 0.6
 +set g_balance_nex_primary_ammo 6
 +set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
 +set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
 +set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
 +set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
 +
 +set g_balance_nex_secondary 0
 +set g_balance_nex_secondary_charge 0
 +set g_balance_nex_secondary_charge_rate 0.1
 +set g_balance_nex_secondary_chargepool 0
 +set g_balance_nex_secondary_chargepool_regen 0.15
 +set g_balance_nex_secondary_chargepool_pause_regen 1
 +set g_balance_nex_secondary_chargepool_pause_health_regen 1
 +set g_balance_nex_secondary_damage 0
 +set g_balance_nex_secondary_force 0
 +set g_balance_nex_secondary_refire 0
 +set g_balance_nex_secondary_animtime 0
 +set g_balance_nex_secondary_ammo 2
 +set g_balance_nex_secondary_damagefalloff_mindist 0
 +set g_balance_nex_secondary_damagefalloff_maxdist 0
 +set g_balance_nex_secondary_damagefalloff_halflife 0
 +set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 +
 +set g_balance_nex_charge 1
 +set g_balance_nex_charge_mindmg 40
 +set g_balance_nex_charge_start 0.5
 +set g_balance_nex_charge_rate 0.4
 +set g_balance_nex_charge_animlimit 0.5
 +set g_balance_nex_charge_limit 1
 +set g_balance_nex_charge_rot_rate 0
 +set g_balance_nex_charge_rot_pause 0 // Dont rot down until this long after release of charge button
 +set g_balance_nex_charge_shot_multiplier 0
 +set g_balance_nex_charge_velocity_rate 0
 +set g_balance_nex_charge_minspeed 400
 +set g_balance_nex_charge_maxspeed 800
 +
 +set g_balance_nex_switchdelay_drop 0.3
 +set g_balance_nex_switchdelay_raise 0.25
 +
 +set g_balance_nex_reload_ammo 0 //default: 25
 +set g_balance_nex_reload_time 2
 +// }}}
 +// {{{ minstanex
 +set g_balance_minstanex_refire 1
 +set g_balance_minstanex_animtime 0.3
 +set g_balance_minstanex_ammo 10
 +set g_balance_minstanex_laser_ammo 0
 +set g_balance_minstanex_laser_animtime 0.3
 +set g_balance_minstanex_laser_refire 0.7
 +set g_balance_minstanex_switchdelay_drop 0.2
 +set g_balance_minstanex_switchdelay_raise 0.2
 +set g_balance_minstanex_reload_ammo 0 //default: 50
 +set g_balance_minstanex_reload_time 2
 +// }}}
 +// {{{ hagar
 +set g_balance_hagar_primary_damage 25
 +set g_balance_hagar_primary_edgedamage 12.5
 +set g_balance_hagar_primary_force 100
 +set g_balance_hagar_primary_health 15
 +set g_balance_hagar_primary_damageforcescale 0
 +set g_balance_hagar_primary_radius 65
 +set g_balance_hagar_primary_spread 0.03
 +set g_balance_hagar_primary_speed 2500
 +set g_balance_hagar_primary_lifetime 5
 +set g_balance_hagar_primary_refire 0.16667 // 6 rockets per second
 +set g_balance_hagar_primary_ammo 1
 +set g_balance_hagar_secondary 1
 +set g_balance_hagar_secondary_load 1
 +set g_balance_hagar_secondary_load_speed 0.5
 +set g_balance_hagar_secondary_load_spread 0.075
 +set g_balance_hagar_secondary_load_spread_bias 0.5
 +set g_balance_hagar_secondary_load_max 4
 +set g_balance_hagar_secondary_load_hold 4
 +set g_balance_hagar_secondary_load_releasedeath 0
 +set g_balance_hagar_secondary_load_abort 0
 +set g_balance_hagar_secondary_load_linkexplode 0
 +set g_balance_hagar_secondary_load_animtime 0.2
 +set g_balance_hagar_secondary_damage 40
 +set g_balance_hagar_secondary_edgedamage 20
 +set g_balance_hagar_secondary_force 75
 +set g_balance_hagar_secondary_health 15
 +set g_balance_hagar_secondary_damageforcescale 0
 +set g_balance_hagar_secondary_radius 80
 +set g_balance_hagar_secondary_spread 0.05
 +set g_balance_hagar_secondary_speed 2000
 +set g_balance_hagar_secondary_lifetime_min 10
 +set g_balance_hagar_secondary_lifetime_rand 0
 +set g_balance_hagar_secondary_refire 0.5
 +set g_balance_hagar_secondary_ammo 1
 +set g_balance_hagar_switchdelay_drop 0.2
 +set g_balance_hagar_switchdelay_raise 0.2
 +set g_balance_hagar_reload_ammo 0 //default: 25
 +set g_balance_hagar_reload_time 2
 +// }}}
 +// {{{ rocketlauncher
 +set g_balance_rocketlauncher_damage 80
 +set g_balance_rocketlauncher_edgedamage 40
 +set g_balance_rocketlauncher_force 450
 +set g_balance_rocketlauncher_radius 110
 +set g_balance_rocketlauncher_speed 1300
 +set g_balance_rocketlauncher_speedaccel 1300
 +set g_balance_rocketlauncher_speedstart 1000
 +set g_balance_rocketlauncher_lifetime 10
 +set g_balance_rocketlauncher_refire 1.1
 +set g_balance_rocketlauncher_animtime 0.4
 +set g_balance_rocketlauncher_ammo 4
 +set g_balance_rocketlauncher_health 30 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
 +set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
 +set g_balance_rocketlauncher_detonatedelay 0.02 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 +set g_balance_rocketlauncher_guiderate 90 // max degrees per second
 +set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 +set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
 +set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 +set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
 +set g_balance_rocketlauncher_remote_damage 70
 +set g_balance_rocketlauncher_remote_edgedamage 35
 +set g_balance_rocketlauncher_remote_radius 110
 +set g_balance_rocketlauncher_remote_force 400
 +set g_balance_rocketlauncher_switchdelay_drop 0.2
 +set g_balance_rocketlauncher_switchdelay_raise 0.2
 +set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 +set g_balance_rocketlauncher_reload_time 2
 +// }}}
 +// {{{ porto
 +set g_balance_porto_primary_refire 1.5
 +set g_balance_porto_primary_animtime 0.3
 +set g_balance_porto_primary_speed 1000
 +set g_balance_porto_primary_lifetime 5
 +set g_balance_porto_secondary 1
 +set g_balance_porto_secondary_refire 1.5
 +set g_balance_porto_secondary_animtime 0.3
 +set g_balance_porto_secondary_speed 1000
 +set g_balance_porto_secondary_lifetime 5
 +set g_balance_porto_switchdelay_drop 0.2
 +set g_balance_porto_switchdelay_raise 0.2
 +set g_balance_portal_health 200 // these get recharged whenever the portal is used
 +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
 +// }}}
 +// {{{ hook
 +set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 +set g_balance_hook_primary_refire 0 // hook monkeys set 0
 +set g_balance_hook_primary_animtime 0.3 // good shoot anim
 +set g_balance_hook_primary_hooked_time_max 0 // infinite
 +set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 +set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
 +set g_balance_hook_secondary_damage 25 // not much
 +set g_balance_hook_secondary_edgedamage 5 // not much
 +set g_balance_hook_secondary_radius 500 // LOTS
 +set g_balance_hook_secondary_force -2000 // LOTS
 +set g_balance_hook_secondary_ammo 30 // a whole pack
 +set g_balance_hook_secondary_lifetime 5 // infinite
 +set g_balance_hook_secondary_speed 0 // not much throwing
 +set g_balance_hook_secondary_gravity 5 // fast falling
 +set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
 +set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 +set g_balance_hook_secondary_power 3 // effect behaves like a square function
 +set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 +set g_balance_hook_secondary_health 15
 +set g_balance_hook_secondary_damageforcescale 0
 +set g_balance_hook_switchdelay_drop 0.2
 +set g_balance_hook_switchdelay_raise 0.2
 +// }}}
 +// {{{ tuba
 +set g_balance_tuba_refire 0.05
 +set g_balance_tuba_animtime 0.05
 +set g_balance_tuba_attenuation 0.5
 +set g_balance_tuba_volume 1
 +set g_balance_tuba_fadetime 0.25
 +set g_balance_tuba_damage 5
 +set g_balance_tuba_edgedamage 0
 +set g_balance_tuba_radius 200
 +set g_balance_tuba_force 40
 +set g_balance_tuba_pitchstep 6
 +set g_balance_tuba_switchdelay_drop 0.2
 +set g_balance_tuba_switchdelay_raise 0.2
 +// }}}
++// {{{ fireball // this is a superweapon -- lets make it behave as one.
 +set g_balance_fireball_primary_animtime 0.2
 +set g_balance_fireball_primary_bfgdamage 100
 +set g_balance_fireball_primary_bfgforce 0
 +set g_balance_fireball_primary_bfgradius 1000
 +set g_balance_fireball_primary_damage 200
 +set g_balance_fireball_primary_damageforcescale 0
 +set g_balance_fireball_primary_edgedamage 50
 +set g_balance_fireball_primary_force 600
 +set g_balance_fireball_primary_health 0
 +set g_balance_fireball_primary_laserburntime 0.5
 +set g_balance_fireball_primary_laserdamage 80
 +set g_balance_fireball_primary_laseredgedamage 20
 +set g_balance_fireball_primary_laserradius 256
 +set g_balance_fireball_primary_lifetime 15
 +set g_balance_fireball_primary_radius 200
 +set g_balance_fireball_primary_refire 2
 +set g_balance_fireball_primary_refire2 0
 +set g_balance_fireball_primary_speed 1200
 +set g_balance_fireball_primary_spread 0
 +set g_balance_fireball_secondary_animtime 0.3
 +set g_balance_fireball_secondary_damage 40
 +set g_balance_fireball_secondary_damageforcescale 4
 +set g_balance_fireball_secondary_damagetime 5
 +set g_balance_fireball_secondary_force 100
 +set g_balance_fireball_secondary_laserburntime 0.5
 +set g_balance_fireball_secondary_laserdamage 50
 +set g_balance_fireball_secondary_laseredgedamage 20
 +set g_balance_fireball_secondary_laserradius 110
 +set g_balance_fireball_secondary_lifetime 7
 +set g_balance_fireball_secondary_refire 1.5
 +set g_balance_fireball_secondary_speed 900
 +set g_balance_fireball_secondary_speed_up 100
 +set g_balance_fireball_secondary_speed_z 0
 +set g_balance_fireball_secondary_spread 0
 +set g_balance_fireball_switchdelay_drop 0.2
 +set g_balance_fireball_switchdelay_raise 0.2
 +// }}}
Simple merge
index 523e498fba789256558fdd56932e52de5e1b047e,0000000000000000000000000000000000000000..0e68bc9bf54efadf08af973e7787a5cc4e3ad610
mode 100644,000000..100644
--- /dev/null
@@@ -1,722 -1,0 +1,712 @@@
-       WEP_ADD_CVAR(weapon, MO_BOTH, jointime) \
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id */ CRYLINK,
 +/* function */ w_crylink,
 +/* ammotype */ IT_CELLS,
 +/* impulse  */ 6,
 +/* flags    */ WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH,
 +/* rating   */ BOT_PICKUP_RATING_MID,
 +/* model    */ "crylink",
 +/* netname  */ "crylink",
 +/* fullname */ _("Crylink")
 +);
 +
 +#define CRYLINK_SETTINGS(weapon) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, ammo) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, animtime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, damage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, edgedamage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, radius) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, force) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, spread) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, refire) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, speed) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, shots) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, bounces) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, bouncedamagefactor) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, middle_lifetime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, middle_fadetime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, other_lifetime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, other_fadetime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, linkexplode) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joindelay) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinspread) \
- // jspeed: MINIMUM jing speed
- // jtime: MAXIMUM jing time (0: none)
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinexplode) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinexplode_damage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinexplode_edgedamage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinexplode_radius) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, joinexplode_force) \
 +      WEP_ADD_CVAR(weapon, MO_SEC,  spreadtype) \
 +      WEP_ADD_PROP(weapon, reloading_ammo, reload_ammo) \
 +      WEP_ADD_PROP(weapon, reloading_time, reload_time) \
 +      WEP_ADD_PROP(weapon, switchdelay_raise, switchdelay_raise) \
 +      WEP_ADD_PROP(weapon, switchdelay_drop, switchdelay_drop)
 +
 +#ifdef SVQC
 +CRYLINK_SETTINGS(crylink)
 +.float gravity;
 +.float crylink_waitrelease;
 +.entity crylink_lastgroup;
 +
 +.entity queuenext;
 +.entity queueprev;
 +#endif
 +#else
 +#ifdef SVQC
 +void spawnfunc_weapon_crylink() { weapon_defaultspawnfunc(WEP_CRYLINK); }
 +
 +void W_Crylink_CheckLinks(entity e)
 +{
 +      float i;
 +      entity p;
 +
 +      if(e == world)
 +              error("W_Crylink_CheckLinks: entity is world");
 +      if(e.classname != "spike" || wasfreed(e))
 +              error(sprintf("W_Crylink_CheckLinks: entity is not a spike but a %s (freed: %d)", e.classname, wasfreed(e)));
 +
 +      p = e;
 +      for(i = 0; i < 1000; ++i)
 +      {
 +              if(p.queuenext.queueprev != p || p.queueprev.queuenext != p)
 +                      error("W_Crylink_CheckLinks: queue is inconsistent");
 +              p = p.queuenext;
 +              if(p == e)
 +                      break;
 +      }
 +      if(i >= 1000)
 +              error("W_Crylink_CheckLinks: infinite chain");
 +}
 +
 +void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next)
 +{
 +      W_Crylink_CheckLinks(next);
 +      if(me == own.crylink_lastgroup)
 +              own.crylink_lastgroup = ((me == next) ? world : next);
 +      prev.queuenext = next;
 +      next.queueprev = prev;
 +      me.classname = "spike_oktoremove";
 +      if(me != next)
 +              W_Crylink_CheckLinks(next);
 +}
 +
 +void W_Crylink_Dequeue(entity e)
 +{
 +      W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext);
 +}
 +
 +void W_Crylink_Reset(void)
 +{
 +      W_Crylink_Dequeue(self);
 +      remove(self);
 +}
 +
 +// force projectile to explode
 +void W_Crylink_LinkExplode (entity e, entity e2)
 +{
 +      float a;
 +
 +      if(e == e2)
 +              return;
 +
 +      a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1);
 +
 +      if(e == e.realowner.crylink_lastgroup)
 +              e.realowner.crylink_lastgroup = world;
 +              
 +      float isprimary = !(e.projectiledeathtype & HITTYPE_SECONDARY);
 +              
 +      RadiusDamage(e, e.realowner, WEP_CVAR_BOTH(crylink, isprimary, damage) * a, WEP_CVAR_BOTH(crylink, isprimary, edgedamage) * a, WEP_CVAR_BOTH(crylink, isprimary, radius), world, world, WEP_CVAR_BOTH(crylink, isprimary, force) * a, e.projectiledeathtype, other);
 +
 +      W_Crylink_LinkExplode(e.queuenext, e2);
 +
 +      e.classname = "spike_oktoremove";
 +      remove (e);
 +}
 +
 +// adjust towards center
 +// returns the origin where they will meet... and the time till the meeting is
 +// stored in w_crylink_linkjoin_time.
 +// could possibly network this origin and time, and display a special particle
 +// effect when projectiles meet there :P
- vector W_Crylink_LinkJoin(entity e, float jspeed, float jtime)
++// jspeed: joining speed (calculate this as join spread * initial speed)
 +float w_crylink_linkjoin_time;
-       if(jspeed == 0 && jtime == 0)
++vector W_Crylink_LinkJoin(entity e, float jspeed)
 +{
 +      vector avg_origin, avg_velocity;
 +      vector targ_origin;
 +      float avg_dist, n;
 +      entity p;
 +
 +      // FIXME remove this debug code
 +      W_Crylink_CheckLinks(e);
 +
 +      w_crylink_linkjoin_time = 0;
 +
 +      avg_origin = e.origin;
 +      avg_velocity = e.velocity;
 +      n = 1;
 +      for(p = e; (p = p.queuenext) != e; )
 +      {
 +              avg_origin += WarpZone_RefSys_TransformOrigin(p, e, p.origin);
 +              avg_velocity += WarpZone_RefSys_TransformVelocity(p, e, p.velocity);
 +              ++n;
 +      }
 +      avg_origin *= (1.0 / n);
 +      avg_velocity *= (1.0 / n);
 +
 +      if(n < 2)
 +              return avg_origin; // nothing to do
 +
 +      // yes, mathematically we can do this in ONE step, but beware of 32bit floats...
 +      avg_dist = pow(vlen(e.origin - avg_origin), 2);
 +      for(p = e; (p = p.queuenext) != e; )
 +              avg_dist += pow(vlen(WarpZone_RefSys_TransformOrigin(p, e, p.origin) - avg_origin), 2);
 +      avg_dist *= (1.0 / n);
 +      avg_dist = sqrt(avg_dist);
 +
 +      if(avg_dist == 0)
 +              return avg_origin; // no change needed
 +
-               if(jtime)
-               {
-                       if(jspeed)
-                               w_crylink_linkjoin_time = min(jtime, avg_dist / jspeed);
-                       else
-                               w_crylink_linkjoin_time = jtime;
-               }
-               else
-                       w_crylink_linkjoin_time = avg_dist / jspeed;
++      if(jspeed == 0)
 +      {
 +              e.velocity = avg_velocity;
 +              UpdateCSQCProjectile(e);
 +              for(p = e; (p = p.queuenext) != e; )
 +              {
 +                      p.velocity = WarpZone_RefSys_TransformVelocity(e, p, avg_velocity);
 +                      UpdateCSQCProjectile(p);
 +              }
 +              targ_origin = avg_origin + 1000000000 * normalize(avg_velocity); // HUUUUUUGE
 +      }
 +      else
 +      {
-       if(WEP_CVAR_PRI(crylink, joinspread) != 0 || WEP_CVAR_PRI(crylink, jointime) != 0)
++              w_crylink_linkjoin_time = avg_dist / jspeed;
 +              targ_origin = avg_origin + w_crylink_linkjoin_time * avg_velocity;
 +
 +              e.velocity = (targ_origin - e.origin) * (1.0 / w_crylink_linkjoin_time);
 +              UpdateCSQCProjectile(e);
 +              for(p = e; (p = p.queuenext) != e; )
 +              {
 +                      p.velocity = WarpZone_RefSys_TransformVelocity(e, p, (targ_origin - WarpZone_RefSys_TransformOrigin(p, e, p.origin)) * (1.0 / w_crylink_linkjoin_time));
 +                      UpdateCSQCProjectile(p);
 +              }
 +
 +              // analysis:
 +              //   jspeed -> +infinity:
 +              //      w_crylink_linkjoin_time -> +0
 +              //      targ_origin -> avg_origin
 +              //      p->velocity -> HUEG towards center
 +              //   jspeed -> 0:
 +              //      w_crylink_linkjoin_time -> +/- infinity
 +              //      targ_origin -> avg_velocity * +/- infinity
 +              //      p->velocity -> avg_velocity
 +              //   jspeed -> -infinity:
 +              //      w_crylink_linkjoin_time -> -0
 +              //      targ_origin -> avg_origin
 +              //      p->velocity -> HUEG away from center
 +      }
 +
 +      W_Crylink_CheckLinks(e);
 +
 +      return targ_origin;
 +}
 +
 +void W_Crylink_LinkJoinEffect_Think()
 +{
 +      // is there at least 2 projectiles very close?
 +      entity e, p;
 +      float n;
 +      e = self.owner.crylink_lastgroup;
 +      n = 0;
 +      if(e)
 +      {
 +              if(vlen(e.origin - self.origin) < vlen(e.velocity) * frametime)
 +                      ++n;
 +              for(p = e; (p = p.queuenext) != e; )
 +              {
 +                      if(vlen(p.origin - self.origin) < vlen(p.velocity) * frametime)
 +                              ++n;
 +              }
 +              if(n >= 2)
 +              {
 +                      float isprimary = !(e.projectiledeathtype & HITTYPE_SECONDARY);
 +                      
 +                      if(WEP_CVAR_BOTH(crylink, isprimary, joinexplode))
 +                      {
 +                              n /= WEP_CVAR_BOTH(crylink, isprimary, shots);
 +                              RadiusDamage(e, e.realowner, WEP_CVAR_BOTH(crylink, isprimary, joinexplode_damage) * n,
 +                                                                                       WEP_CVAR_BOTH(crylink, isprimary, joinexplode_edgedamage) * n,
 +                                                                                       WEP_CVAR_BOTH(crylink, isprimary, joinexplode_radius) * n, e.realowner, world,
 +                                                                                       WEP_CVAR_BOTH(crylink, isprimary, joinexplode_force) * n, e.projectiledeathtype, other);
 +                              pointparticles(particleeffectnum("crylink_joinexplode"), self.origin, '0 0 0', n);
 +                      }
 +              }
 +      }
 +      remove(self);
 +}
 +
 +float W_Crylink_Touch_WouldHitFriendly(entity projectile, float rad)
 +{
 +      entity head = WarpZone_FindRadius((projectile.origin + (projectile.mins + projectile.maxs) * 0.5), rad + MAX_DAMAGEEXTRARADIUS, FALSE);
 +      float hit_friendly = 0;
 +      float hit_enemy = 0;
 +
 +      while(head)
 +      {
 +              if((head.takedamage != DAMAGE_NO) && (head.deadflag == DEAD_NO))
 +              {
 +                      if(IsDifferentTeam(head, projectile.realowner))
 +                              ++hit_enemy;
 +                      else
 +                              ++hit_friendly;
 +              }
 +                      
 +              head = head.chain;
 +      }
 +
 +      return (hit_enemy ? FALSE : hit_friendly);
 +}
 +
 +// NO bounce protection, as bounces are limited!
 +void W_Crylink_Touch (void)
 +{
 +      float finalhit;
 +      float f;
 +      float isprimary = !(self.projectiledeathtype & HITTYPE_SECONDARY);
 +      PROJECTILE_TOUCH;
 +
 +      float a;
 +      a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1);
 +
 +      finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
 +      if(finalhit)
 +              f = 1;
 +      else
 +              f = WEP_CVAR_BOTH(crylink, isprimary, bouncedamagefactor);
 +      if(a)
 +              f *= a;
 +
 +      float totaldamage = RadiusDamage(self, self.realowner, WEP_CVAR_BOTH(crylink, isprimary, damage) * f, WEP_CVAR_BOTH(crylink, isprimary, edgedamage) * f, WEP_CVAR_BOTH(crylink, isprimary, radius), world, world, WEP_CVAR_BOTH(crylink, isprimary, force) * f, self.projectiledeathtype, other);
 +              
 +      if(totaldamage && ((WEP_CVAR_BOTH(crylink, isprimary, linkexplode) == 2) || ((WEP_CVAR_BOTH(crylink, isprimary, linkexplode) == 1) && !W_Crylink_Touch_WouldHitFriendly(self, WEP_CVAR_BOTH(crylink, isprimary, radius)))))
 +      {
 +              if(self == self.realowner.crylink_lastgroup)
 +                      self.realowner.crylink_lastgroup = world;
 +              W_Crylink_LinkExplode(self.queuenext, self);
 +              self.classname = "spike_oktoremove";
 +              remove (self);
 +              return;
 +      }
 +      else if(finalhit)
 +      {
 +              // just unlink
 +              W_Crylink_Dequeue(self);
 +              remove(self);
 +              return;
 +      }
 +      self.cnt = self.cnt - 1;
 +      self.angles = vectoangles(self.velocity);
 +      self.owner = world;
 +      self.projectiledeathtype |= HITTYPE_BOUNCE;
 +      // commented out as it causes a little hitch...
 +      //if(proj.cnt == 0)
 +      //      CSQCProjectile(proj, TRUE, PROJECTILE_CRYLINK, TRUE);
 +}
 +
 +void W_Crylink_Fadethink (void)
 +{
 +      W_Crylink_Dequeue(self);
 +      remove(self);
 +}
 +
 +void W_Crylink_Attack (void)
 +{
 +      float counter, shots;
 +      entity proj, prevproj, firstproj;
 +      vector s;
 +      vector forward, right, up;
 +      float maxdmg;
 +
 +      W_DecreaseAmmo(ammo_cells, autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_reload_ammo);
 +
 +      maxdmg = WEP_CVAR_PRI(crylink, damage) * WEP_CVAR_PRI(crylink, shots);
 +      maxdmg *= 1 + WEP_CVAR_PRI(crylink, bouncedamagefactor) * WEP_CVAR_PRI(crylink, bounces);
 +      if(WEP_CVAR_PRI(crylink, joinexplode))
 +              maxdmg += WEP_CVAR_PRI(crylink, joinexplode_damage);
 +
 +      W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CH_WEAPON_A, maxdmg);
 +      forward = v_forward;
 +      right = v_right;
 +      up = v_up;
 +
 +      shots = WEP_CVAR_PRI(crylink, shots);
 +      pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
 +      proj = prevproj = firstproj = world;
 +      for(counter = 0; counter < shots; ++counter)
 +      {
 +              proj = spawn ();
 +              proj.reset = W_Crylink_Reset;
 +              proj.realowner = proj.owner = self;
 +              proj.classname = "spike";
 +              proj.bot_dodge = TRUE;
 +              proj.bot_dodgerating = WEP_CVAR_PRI(crylink, damage);
 +              if(shots == 1) {
 +                      proj.queuenext = proj;
 +                      proj.queueprev = proj;
 +              }
 +              else if(counter == 0) { // first projectile, store in firstproj for now
 +                      firstproj = proj;
 +              }
 +              else if(counter == shots - 1) { // last projectile, link up with first projectile
 +                      prevproj.queuenext = proj;
 +                      firstproj.queueprev = proj;
 +                      proj.queuenext = firstproj;
 +                      proj.queueprev = prevproj;
 +              }
 +              else { // else link up with previous projectile
 +                      prevproj.queuenext = proj;
 +                      proj.queueprev = prevproj;
 +              }
 +
 +              prevproj = proj;
 +
 +              proj.movetype = MOVETYPE_BOUNCEMISSILE;
 +              PROJECTILE_MAKETRIGGER(proj);
 +              proj.projectiledeathtype = WEP_CRYLINK;
 +              //proj.gravity = 0.001;
 +
 +              setorigin (proj, w_shotorg);
 +              setsize(proj, '0 0 0', '0 0 0');
 +
 +
 +              s = '0 0 0';
 +              if (counter == 0)
 +                      s = '0 0 0';
 +              else
 +              {
 +                      makevectors('0 360 0' * (0.75 + (counter - 0.5) / (shots - 1)));
 +                      s_y = v_forward_x;
 +                      s_z = v_forward_y;
 +              }
 +              s = s * WEP_CVAR_PRI(crylink, spread) * g_weaponspreadfactor;
 +              W_SetupProjectileVelocityEx(proj, w_shotdir + right * s_y + up * s_z, v_up, WEP_CVAR_PRI(crylink, speed), 0, 0, 0, FALSE);
 +              proj.touch = W_Crylink_Touch;
 +
 +              proj.think = W_Crylink_Fadethink;
 +              if(counter == 0)
 +              {
 +                      proj.fade_time = time + WEP_CVAR_PRI(crylink, middle_lifetime);
 +                      proj.fade_rate = 1 / WEP_CVAR_PRI(crylink, middle_fadetime);
 +                      proj.nextthink = time + WEP_CVAR_PRI(crylink, middle_lifetime) + WEP_CVAR_PRI(crylink, middle_fadetime);
 +              }
 +              else
 +              {
 +                      proj.fade_time = time + WEP_CVAR_PRI(crylink, other_lifetime);
 +                      proj.fade_rate = 1 / WEP_CVAR_PRI(crylink, other_fadetime);
 +                      proj.nextthink = time + WEP_CVAR_PRI(crylink, other_lifetime) + WEP_CVAR_PRI(crylink, other_fadetime);
 +              }
 +              proj.teleport_time = time + WEP_CVAR_PRI(crylink, joindelay);
 +              proj.cnt = WEP_CVAR_PRI(crylink, bounces);
 +              //proj.scale = 1 + 1 * proj.cnt;
 +
 +              proj.angles = vectoangles (proj.velocity);
 +
 +              //proj.glow_size = 20;
 +
 +              proj.flags = FL_PROJECTILE;
 +    proj.missile_flags = MIF_SPLASH;
 +    
 +              CSQCProjectile(proj, TRUE, (proj.cnt ? PROJECTILE_CRYLINK_BOUNCING : PROJECTILE_CRYLINK), TRUE);
 +
 +              other = proj; MUTATOR_CALLHOOK(EditProjectile);
 +      }
-       if(WEP_CVAR_SEC(crylink, joinspread) != 0 || WEP_CVAR_SEC(crylink, jointime) != 0)
++      if(WEP_CVAR_PRI(crylink, joinspread) != 0)
 +      {
 +              self.crylink_lastgroup = proj;
 +              W_Crylink_CheckLinks(proj);
 +              self.crylink_waitrelease = 1;
 +      }
 +}
 +
 +void W_Crylink_Attack2 (void)
 +{
 +      float counter, shots;
 +      entity proj, prevproj, firstproj;
 +      vector s;
 +      vector forward, right, up;
 +      float maxdmg;
 +
 +      W_DecreaseAmmo(ammo_cells, autocvar_g_balance_crylink_secondary_ammo, autocvar_g_balance_crylink_reload_ammo);
 +
 +      maxdmg = WEP_CVAR_SEC(crylink, damage) * WEP_CVAR_SEC(crylink, shots);
 +      maxdmg *= 1 + WEP_CVAR_SEC(crylink, bouncedamagefactor) * WEP_CVAR_SEC(crylink, bounces);
 +      if(WEP_CVAR_SEC(crylink, joinexplode))
 +              maxdmg += WEP_CVAR_SEC(crylink, joinexplode_damage);
 +
 +      W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CH_WEAPON_A, maxdmg);
 +      forward = v_forward;
 +      right = v_right;
 +      up = v_up;
 +
 +      shots = WEP_CVAR_SEC(crylink, shots);
 +      pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
 +      proj = prevproj = firstproj = world;
 +      for(counter = 0; counter < shots; ++counter)
 +      {
 +              proj = spawn ();
 +              proj.reset = W_Crylink_Reset;
 +              proj.realowner = proj.owner = self;
 +              proj.classname = "spike";
 +              proj.bot_dodge = TRUE;
 +              proj.bot_dodgerating = WEP_CVAR_SEC(crylink, damage);
 +              if(shots == 1) {
 +                      proj.queuenext = proj;
 +                      proj.queueprev = proj;
 +              }
 +              else if(counter == 0) { // first projectile, store in firstproj for now
 +                      firstproj = proj;
 +              }
 +              else if(counter == shots - 1) { // last projectile, link up with first projectile
 +                      prevproj.queuenext = proj;
 +                      firstproj.queueprev = proj;
 +                      proj.queuenext = firstproj;
 +                      proj.queueprev = prevproj;
 +              }
 +              else { // else link up with previous projectile
 +                      prevproj.queuenext = proj;
 +                      proj.queueprev = prevproj;
 +              }
 +
 +              prevproj = proj;
 +
 +              proj.movetype = MOVETYPE_BOUNCEMISSILE;
 +              PROJECTILE_MAKETRIGGER(proj);
 +              proj.projectiledeathtype = WEP_CRYLINK | HITTYPE_SECONDARY;
 +              //proj.gravity = 0.001;
 +
 +              setorigin (proj, w_shotorg);
 +              setsize(proj, '0 0 0', '0 0 0');
 +
 +              if(WEP_CVAR_SEC(crylink, spreadtype) == 1)
 +              {
 +                      s = '0 0 0';
 +                      if (counter == 0)
 +                              s = '0 0 0';
 +                      else
 +                      {
 +                              makevectors('0 360 0' * (0.75 + (counter - 0.5) / (shots - 1)));
 +                              s_y = v_forward_x;
 +                              s_z = v_forward_y;
 +                      }
 +                      s = s * WEP_CVAR_SEC(crylink, spread) * g_weaponspreadfactor;
 +                      s = w_shotdir + right * s_y + up * s_z;
 +              }
 +              else
 +              {
 +                      s = (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * WEP_CVAR_SEC(crylink, spread) * g_weaponspreadfactor);
 +              }
 +
 +              W_SetupProjectileVelocityEx(proj, s, v_up, WEP_CVAR_SEC(crylink, speed), 0, 0, 0, FALSE);
 +              proj.touch = W_Crylink_Touch;
 +              proj.think = W_Crylink_Fadethink;
 +              if(counter == (shots - 1) / 2)
 +              {
 +                      proj.fade_time = time + WEP_CVAR_SEC(crylink, middle_lifetime);
 +                      proj.fade_rate = 1 / WEP_CVAR_SEC(crylink, middle_fadetime);
 +                      proj.nextthink = time + WEP_CVAR_SEC(crylink, middle_lifetime) + WEP_CVAR_SEC(crylink, middle_fadetime);
 +              }
 +              else
 +              {
 +                      proj.fade_time = time + WEP_CVAR_SEC(crylink, other_lifetime);
 +                      proj.fade_rate = 1 / WEP_CVAR_SEC(crylink, other_fadetime);
 +                      proj.nextthink = time + WEP_CVAR_SEC(crylink, other_lifetime) + WEP_CVAR_SEC(crylink, other_fadetime);
 +              }
 +              proj.teleport_time = time + WEP_CVAR_SEC(crylink, joindelay);
 +              proj.cnt = WEP_CVAR_SEC(crylink, bounces);
 +              //proj.scale = 1 + 1 * proj.cnt;
 +
 +              proj.angles = vectoangles (proj.velocity);
 +
 +              //proj.glow_size = 20;
 +
 +              proj.flags = FL_PROJECTILE;
 +        proj.missile_flags = MIF_SPLASH;
 +        
 +              CSQCProjectile(proj, TRUE, (proj.cnt ? PROJECTILE_CRYLINK_BOUNCING : PROJECTILE_CRYLINK), TRUE);
 +
 +              other = proj; MUTATOR_CALLHOOK(EditProjectile);
 +      }
-                                               pos = W_Crylink_LinkJoin(self.crylink_lastgroup, WEP_CVAR_BOTH(crylink, isprimary, joinspread) * WEP_CVAR_BOTH(crylink, isprimary, speed), WEP_CVAR_BOTH(crylink, isprimary, jointime));
++      if(WEP_CVAR_SEC(crylink, joinspread) != 0)
 +      {
 +              self.crylink_lastgroup = proj;
 +              W_Crylink_CheckLinks(proj);
 +              self.crylink_waitrelease = 2;
 +      }
 +}
 +
 +float w_crylink(float req)
 +{
 +      float ammo_amount;
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      if (random() < 0.10)
 +                              self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(crylink, speed), 0, WEP_CVAR_PRI(crylink, middle_lifetime), FALSE);
 +                      else
 +                              self.BUTTON_ATCK2 = bot_aim(WEP_CVAR_SEC(crylink, speed), 0, WEP_CVAR_SEC(crylink, middle_lifetime), FALSE);
 +                              
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(autocvar_g_balance_crylink_reload_ammo && self.clip_load < min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo)) // forced reload
 +                              WEP_ACTION(self.weapon, WR_RELOAD);
 +
 +                      if (self.BUTTON_ATCK)
 +                      {
 +                              if (self.crylink_waitrelease != 1)
 +                              if (weapon_prepareattack(0, WEP_CVAR_PRI(crylink, refire)))
 +                              {
 +                                      W_Crylink_Attack();
 +                                      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(crylink, animtime), w_ready);
 +                              }
 +                      }
 +
 +                      if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
 +                      {
 +                              if (self.crylink_waitrelease != 2)
 +                              if (weapon_prepareattack(1, WEP_CVAR_SEC(crylink, refire)))
 +                              {
 +                                      W_Crylink_Attack2();
 +                                      weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(crylink, animtime), w_ready);
 +                              }
 +                      }
 +
 +                      if ((self.crylink_waitrelease == 1 && !self.BUTTON_ATCK) || (self.crylink_waitrelease == 2 && !self.BUTTON_ATCK2))
 +                      {
 +                              if (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time)
 +                              {
 +                                      // fired and released now!
 +                                      if(self.crylink_lastgroup)
 +                                      {
 +                                              vector pos;
 +                                              entity linkjoineffect;
 +                                              float isprimary = (self.crylink_waitrelease == 1);
 +                                              
++                                              pos = W_Crylink_LinkJoin(self.crylink_lastgroup, WEP_CVAR_BOTH(crylink, isprimary, joinspread) * WEP_CVAR_BOTH(crylink, isprimary, speed));
 +
 +                                              linkjoineffect = spawn();
 +                                              linkjoineffect.think = W_Crylink_LinkJoinEffect_Think;
 +                                              linkjoineffect.classname = "linkjoineffect";
 +                                              linkjoineffect.nextthink = time + w_crylink_linkjoin_time;
 +                                              linkjoineffect.owner = self;
 +                                              setorigin(linkjoineffect, pos);
 +                                      }
 +                                      self.crylink_waitrelease = 0;
 +                                      if(!w_crylink(WR_CHECKAMMO1) && !w_crylink(WR_CHECKAMMO2))
 +                                      if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 +                                      {
 +                                              // ran out of ammo!
 +                                              self.cnt = WEP_CRYLINK;
 +                                              self.switchweapon = w_getbestweapon(self);
 +                                      }
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/weapons/g_crylink.md3");
 +                      precache_model ("models/weapons/v_crylink.md3");
 +                      precache_model ("models/weapons/h_crylink.iqm");
 +                      precache_sound ("weapons/crylink_fire.wav");
 +                      precache_sound ("weapons/crylink_fire2.wav");
 +                      precache_sound ("weapons/crylink_linkjoin.wav");
 +                      WEP_SET_PROPS(CRYLINK_SETTINGS(crylink), WEP_CRYLINK)
 +                      return TRUE;
 +              }
 +              case WR_SETUP:
 +              {
 +                      self.current_ammo = ammo_cells;
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              {
 +                      // don't "run out of ammo" and switch weapons while waiting for release
 +                      if(self.crylink_lastgroup && self.crylink_waitrelease)
 +                              return TRUE;
 +
 +                      ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_primary_ammo;
 +                      ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_primary_ammo;
 +                      return ammo_amount;
 +              }
 +              case WR_CHECKAMMO2:
 +              {
 +                      // don't "run out of ammo" and switch weapons while waiting for release
 +                      if(self.crylink_lastgroup && self.crylink_waitrelease)
 +                              return TRUE;
 +
 +                      ammo_amount = self.ammo_cells >= autocvar_g_balance_crylink_secondary_ammo;
 +                      ammo_amount += self.(weapon_load[WEP_CRYLINK]) >= autocvar_g_balance_crylink_secondary_ammo;
 +                      return ammo_amount;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      WEP_CONFIG_SETTINGS(CRYLINK_SETTINGS(crylink))
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo), autocvar_g_balance_crylink_reload_ammo, autocvar_g_balance_crylink_reload_time, "weapons/reload.wav");
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_CRYLINK_SUICIDE;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      return WEAPON_CRYLINK_MURDER;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +float w_crylink(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 2;
 +                      if(w_deathtype & HITTYPE_SECONDARY)
 +                      {
 +                              pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1);
 +                              if(!w_issilent)
 +                                      sound(self, CH_SHOTS, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
 +                      }
 +                      else
 +                      {
 +                              pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1);
 +                              if(!w_issilent)
 +                                      sound(self, CH_SHOTS, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/crylink_impact2.wav");
 +                      precache_sound("weapons/crylink_impact.wav");
 +                      return TRUE;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#endif
index c860c8e5d7650fbbc3d1f6060d28555935474d53,0000000000000000000000000000000000000000..ed99847e95e2d1965e7a2c9400092d1a5f90243a
mode 100644,000000..100644
--- /dev/null
@@@ -1,304 -1,0 +1,304 @@@
-       if (!g_norecoil)
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id */ HLAC,
 +/* function */ w_hlac,
 +/* ammotype */ IT_CELLS,
 +/* impulse  */ 6,
 +/* flags    */ WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH,
 +/* rating   */ BOT_PICKUP_RATING_MID,
 +/* model    */ "hlac",
 +/* netname  */ "hlac",
 +/* fullname */ _("Heavy Laser Assault Cannon")
 +);
 +
 +#define HLAC_SETTINGS(weapon) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, ammo) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, animtime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, damage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, edgedamage) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, force) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, lifetime) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, radius) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, refire) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, speed) \
 +      WEP_ADD_CVAR(weapon, MO_BOTH, spread_crouchmod) \
 +      WEP_ADD_CVAR(weapon, MO_PRI,  spread_add) \
 +      WEP_ADD_CVAR(weapon, MO_PRI,  spread_max) \
 +      WEP_ADD_CVAR(weapon, MO_PRI,  spread_min) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, secondary) \
 +      WEP_ADD_CVAR(weapon, MO_SEC,  shots) \
 +      WEP_ADD_CVAR(weapon, MO_SEC,  spread) \
 +      WEP_ADD_PROP(weapon, reloading_ammo, reload_ammo) \
 +      WEP_ADD_PROP(weapon, reloading_time, reload_time) \
 +      WEP_ADD_PROP(weapon, switchdelay_raise, switchdelay_raise) \
 +      WEP_ADD_PROP(weapon, switchdelay_drop, switchdelay_drop)
 +
 +#ifdef SVQC
 +HLAC_SETTINGS(hlac)
 +#endif
 +#else
 +#ifdef SVQC
 +void spawnfunc_weapon_hlac() { weapon_defaultspawnfunc(WEP_HLAC); }
 +
 +void W_HLAC_Touch (void)
 +{
 +      float isprimary;
 +
 +      PROJECTILE_TOUCH;
 +
 +      self.event_damage = func_null;
 +      
 +      isprimary = !(self.projectiledeathtype & HITTYPE_SECONDARY);
 +      
 +      RadiusDamage(self, self.realowner, WEP_CVAR_BOTH(hlac, isprimary, damage), WEP_CVAR_BOTH(hlac, isprimary, edgedamage), WEP_CVAR_BOTH(hlac, isprimary, radius), world, world, WEP_CVAR_BOTH(hlac, isprimary, force), self.projectiledeathtype, other);
 +
 +      remove (self);
 +}
 +
 +void W_HLAC_Attack (void)
 +{
 +      entity missile;
 +    float spread;
 +
 +      W_DecreaseAmmo(ammo_cells, WEP_CVAR_PRI(hlac, ammo), autocvar_g_balance_hlac_reload_ammo);
 +
 +    spread = WEP_CVAR_PRI(hlac, spread_min) + (WEP_CVAR_PRI(hlac, spread_add) * self.misc_bulletcounter);
 +    spread = min(spread,WEP_CVAR_PRI(hlac, spread_max));
 +    if(self.crouch)
 +        spread = spread * WEP_CVAR_PRI(hlac, spread_crouchmod);
 +
 +      W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage));
 +      pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-       if (!g_norecoil)
++      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      missile = spawn ();
 +      missile.owner = missile.realowner = self;
 +      missile.classname = "hlacbolt";
 +      missile.bot_dodge = TRUE;
 +
 +    missile.bot_dodgerating = WEP_CVAR_PRI(hlac, damage);
 +
 +      missile.movetype = MOVETYPE_FLY;
 +      PROJECTILE_MAKETRIGGER(missile);
 +
 +      setorigin (missile, w_shotorg);
 +      setsize(missile, '0 0 0', '0 0 0');
 +
 +      W_SetupProjectileVelocity(missile, WEP_CVAR_PRI(hlac, speed), spread);
 +      //missile.angles = vectoangles (missile.velocity); // csqc
 +
 +      missile.touch = W_HLAC_Touch;
 +      missile.think = SUB_Remove;
 +
 +    missile.nextthink = time + WEP_CVAR_PRI(hlac, lifetime);
 +
 +      missile.flags = FL_PROJECTILE;
 +      missile.projectiledeathtype = WEP_HLAC;
 +
 +      CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
 +
 +      other = missile; MUTATOR_CALLHOOK(EditProjectile);
 +}
 +
 +void W_HLAC_Attack2f (void)
 +{
 +      entity missile;
 +    float spread;
 +
 +    spread = WEP_CVAR_SEC(hlac, spread);
 +
 +
 +    if(self.crouch)
 +        spread = spread * WEP_CVAR_SEC(hlac, spread_crouchmod);
 +
 +      W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage));
 +      pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      missile = spawn ();
 +      missile.owner = missile.realowner = self;
 +      missile.classname = "hlacbolt";
 +      missile.bot_dodge = TRUE;
 +
 +    missile.bot_dodgerating = WEP_CVAR_SEC(hlac, damage);
 +
 +      missile.movetype = MOVETYPE_FLY;
 +      PROJECTILE_MAKETRIGGER(missile);
 +
 +      setorigin (missile, w_shotorg);
 +      setsize(missile, '0 0 0', '0 0 0');
 +
 +      W_SetupProjectileVelocity(missile, WEP_CVAR_SEC(hlac, speed), spread);
 +      //missile.angles = vectoangles (missile.velocity); // csqc
 +
 +      missile.touch = W_HLAC_Touch;
 +      missile.think = SUB_Remove;
 +
 +    missile.nextthink = time + WEP_CVAR_SEC(hlac, lifetime);
 +
 +      missile.flags = FL_PROJECTILE;
 +      missile.missile_flags = MIF_SPLASH; 
 +      missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
 +
 +      CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
 +
 +      other = missile; MUTATOR_CALLHOOK(EditProjectile);
 +}
 +
 +void W_HLAC_Attack2 (void)
 +{
 +    float i;
 +
 +      W_DecreaseAmmo(ammo_cells, WEP_CVAR_SEC(hlac, ammo), autocvar_g_balance_hlac_reload_ammo);
 +
 +    for(i=WEP_CVAR_SEC(hlac, shots);i>0;--i)
 +        W_HLAC_Attack2f();
 +
++      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +}
 +
 +// weapon frames
 +void HLAC_fire1_02()
 +{
 +      if(self.weapon != self.switchweapon) // abort immediately if switching
 +      {
 +              w_ready();
 +              return;
 +      }
 +
 +      if (self.BUTTON_ATCK)
 +      {
 +              if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1))
 +              if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 +              {
 +                      W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +                      w_ready();
 +                      return;
 +              }
 +
 +              ATTACK_FINISHED(self) = time + WEP_CVAR_PRI(hlac, refire) * W_WeaponRateFactor();
 +              W_HLAC_Attack();
 +              self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +        weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(hlac, refire), HLAC_fire1_02);
 +      }
 +      else
 +      {
 +              weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(hlac, animtime), w_ready);
 +      }
 +}
 +
 +float w_hlac(float req)
 +{
 +      float ammo_amount;
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(hlac, speed), 0, WEP_CVAR_PRI(hlac, lifetime), FALSE);
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(autocvar_g_balance_hlac_reload_ammo && self.clip_load < min(WEP_CVAR_PRI(hlac, ammo), WEP_CVAR_SEC(hlac, ammo))) // forced reload
 +                              WEP_ACTION(self.weapon, WR_RELOAD);
 +                      else if (self.BUTTON_ATCK)
 +                      {
 +                              if (weapon_prepareattack(0, WEP_CVAR_PRI(hlac, refire)))
 +                              {
 +                                      self.misc_bulletcounter = 0;
 +                                      W_HLAC_Attack();
 +                                      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(hlac, refire), HLAC_fire1_02);
 +                              }
 +                      }
 +
 +                      else if (self.BUTTON_ATCK2 && WEP_CVAR(hlac, secondary))
 +                      {
 +                              if (weapon_prepareattack(1, WEP_CVAR_SEC(hlac, refire)))
 +                              {
 +                                      W_HLAC_Attack2();
 +                                      weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(hlac, animtime), w_ready);
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/weapons/g_hlac.md3");
 +                      precache_model ("models/weapons/v_hlac.md3");
 +                      precache_model ("models/weapons/h_hlac.iqm");
 +                      precache_sound ("weapons/lasergun_fire.wav");
 +                      WEP_SET_PROPS(HLAC_SETTINGS(hlac), WEP_HLAC)
 +                      return TRUE;
 +              }
 +              case WR_SETUP:
 +              {
 +                      self.current_ammo = ammo_cells;
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              {
 +                      ammo_amount = self.ammo_cells >= WEP_CVAR_PRI(hlac, ammo);
 +                      ammo_amount += self.(weapon_load[WEP_HLAC]) >= WEP_CVAR_PRI(hlac, ammo);
 +                      return ammo_amount;
 +              }
 +              case WR_CHECKAMMO2:
 +              {
 +                      ammo_amount = self.ammo_cells >= WEP_CVAR_SEC(hlac, ammo);
 +                      ammo_amount += self.(weapon_load[WEP_HLAC]) >= WEP_CVAR_SEC(hlac, ammo);
 +                      return ammo_amount;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      WEP_CONFIG_SETTINGS(HLAC_SETTINGS(hlac))
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(min(WEP_CVAR_PRI(hlac, ammo), WEP_CVAR_SEC(hlac, ammo)), autocvar_g_balance_hlac_reload_ammo, autocvar_g_balance_hlac_reload_time, "weapons/reload.wav");
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_HLAC_SUICIDE;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      return WEAPON_HLAC_MURDER;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +float w_hlac(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 6;
 +                      pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
 +                      if(!w_issilent)
 +                              sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
 +                              
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/laserimpact.wav");
 +                      return TRUE;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#endif
index afdda53e9ec3cb32c6f7589426edbaf522dc79ae,0000000000000000000000000000000000000000..90939c5839885ec6735e3aefc19c00885f742c0f
mode 100644,000000..100644
--- /dev/null
@@@ -1,403 -1,0 +1,403 @@@
-       if (!g_norecoil)
 +#ifdef REGISTER_WEAPON
 +REGISTER_WEAPON(
 +/* WEP_##id */ UZI,
 +/* function */ w_uzi,
 +/* ammotype */ IT_NAILS,
 +/* impulse  */ 3,
 +/* flags    */ WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN,
 +/* rating   */ BOT_PICKUP_RATING_MID,
 +/* model    */ "uzi",
 +/* netname  */ "uzi",
 +/* fullname */ _("Machine Gun")
 +);
 +
 +#define UZI_SETTINGS(weapon) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, speed) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, spread_min) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, spread_max) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, spread_add) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, mode) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, bulletconstant) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first_damage) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first_force) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first_refire) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first_spread) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, first_ammo) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, sustained_damage) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, sustained_force) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, sustained_refire) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, sustained_spread) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, sustained_ammo) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst_refire) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst_refire2) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst_animtime) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst_speed) \
 +      WEP_ADD_CVAR(weapon, MO_NONE, burst_ammo) \
 +      WEP_ADD_PROP(weapon, reloading_ammo, reload_ammo) \
 +      WEP_ADD_PROP(weapon, reloading_time, reload_time) \
 +      WEP_ADD_PROP(weapon, switchdelay_raise, switchdelay_raise) \
 +      WEP_ADD_PROP(weapon, switchdelay_drop, switchdelay_drop)
 +
 +#ifdef SVQC
 +UZI_SETTINGS(uzi)
 +#endif
 +#else
 +#ifdef SVQC
 +
 +void spawnfunc_weapon_uzi()
 +{
 +      if(autocvar_sv_q3acompat_machineshotgunswap)
 +      if(self.classname != "droppedweapon")
 +      {
 +              weapon_defaultspawnfunc(WEP_SHOTGUN);
 +              return;
 +      }
 +      weapon_defaultspawnfunc(WEP_UZI);
 +}
 +
 +// leilei's fancy muzzleflash stuff
 +void UZI_Flash_Go()
 +{
 +      self.frame = self.frame + 2;
 +      self.scale = self.scale * 0.5;
 +      self.alpha = self.alpha - 0.25;
 +      self.nextthink = time + 0.05;
 +
 +      if (self.alpha <= 0)
 +      {
 +              self.think = SUB_Remove;
 +              self.nextthink = time;
 +              self.realowner.muzzle_flash = world;
 +              return;
 +      }
 +
 +}
 +
 +void UziFlash()
 +{
 +      if (self.muzzle_flash == world)
 +              self.muzzle_flash = spawn();
 +
 +      // muzzle flash for 1st person view
 +      setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
 +
 +      self.muzzle_flash.scale = 0.75;
 +      self.muzzle_flash.think = UZI_Flash_Go;
 +      self.muzzle_flash.nextthink = time + 0.02;
 +      self.muzzle_flash.frame = 2;
 +      self.muzzle_flash.alpha = 0.75;
 +      self.muzzle_flash.angles_z = random() * 180;
 +      self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
 +      self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
 +}
 +
 +void W_UZI_Attack (float deathtype)
 +{
 +      W_SetupShot (self, autocvar_g_antilag_bullets && WEP_CVAR(uzi, speed) >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? WEP_CVAR(uzi, first_damage) : WEP_CVAR(uzi, sustained_damage)));
-       if (!g_norecoil)
++      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      // this attack_finished just enforces a cooldown at the end of a burst
 +      ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, first_refire) * W_WeaponRateFactor();
 +
 +      if (self.misc_bulletcounter == 1)
 +              fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, first_spread), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, first_damage), WEP_CVAR(uzi, first_force), deathtype, 0, 1, WEP_CVAR(uzi, bulletconstant));
 +      else
 +              fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, sustained_spread), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), deathtype, 0, 1, WEP_CVAR(uzi, bulletconstant));
 +      endFireBallisticBullet();
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      // casing code
 +      if (autocvar_g_casings >= 2)
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      if (self.misc_bulletcounter == 1)
 +              W_DecreaseAmmo(ammo_nails, WEP_CVAR(uzi, first_ammo), autocvar_g_balance_uzi_reload_ammo);
 +      else
 +              W_DecreaseAmmo(ammo_nails, WEP_CVAR(uzi, sustained_ammo), autocvar_g_balance_uzi_reload_ammo);
 +}
 +
 +// weapon frames
 +void uzi_fire1_02()
 +{
 +      if(self.weapon != self.switchweapon) // abort immediately if switching
 +      {
 +              w_ready();
 +              return;
 +      }
 +      if (self.BUTTON_ATCK)
 +      {
 +              if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2))
 +              if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 +              {
 +                      W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +                      w_ready();
 +                      return;
 +              }
 +              self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +              W_UZI_Attack(WEP_UZI);
 +              weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_fire1_02);
 +      }
 +      else
 +              weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), w_ready);
 +}
 +
 +
 +void uzi_mode1_fire_auto()
 +{
 +      float uzi_spread;
 +
 +      if (!self.BUTTON_ATCK)
 +      {
 +              w_ready();
 +              return;
 +      }
 +
 +      if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1))
 +      if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 +      {
 +              W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +              w_ready();
 +              return;
 +      }
 +
 +      W_DecreaseAmmo(ammo_nails, WEP_CVAR(uzi, sustained_ammo), autocvar_g_balance_uzi_reload_ammo);
 +
 +      W_SetupShot (self, autocvar_g_antilag_bullets && WEP_CVAR(uzi, speed) >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, WEP_CVAR(uzi, sustained_damage));
-       if (!g_norecoil)
++      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      uzi_spread = bound(WEP_CVAR(uzi, spread_min), WEP_CVAR(uzi, spread_min) + (WEP_CVAR(uzi, spread_add) * self.misc_bulletcounter), WEP_CVAR(uzi, spread_max));
 +      fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0, 1, WEP_CVAR(uzi, bulletconstant));
 +      endFireBallisticBullet();
 +
 +      self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      if (autocvar_g_casings >= 2) // casing code
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, first_refire) * W_WeaponRateFactor();
 +      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_mode1_fire_auto);
 +}
 +
 +void uzi_mode1_fire_burst()
 +{
 +      W_SetupShot (self, autocvar_g_antilag_bullets && WEP_CVAR(uzi, speed) >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, WEP_CVAR(uzi, sustained_damage));
++      if (!autocvar_g_norecoil)
 +      {
 +              self.punchangle_x = random () - 0.5;
 +              self.punchangle_y = random () - 0.5;
 +      }
 +
 +      fireBallisticBullet(w_shotorg, w_shotdir, WEP_CVAR(uzi, burst_speed), WEP_CVAR(uzi, speed), 5, WEP_CVAR(uzi, sustained_damage), WEP_CVAR(uzi, sustained_force), WEP_UZI, 0, 1, WEP_CVAR(uzi, bulletconstant));
 +      endFireBallisticBullet();
 +
 +
 +      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 +
 +      UziFlash();
 +      W_AttachToShotorg(self.muzzle_flash, '5 0 0');
 +
 +      if (autocvar_g_casings >= 2) // casing code
 +              SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
 +
 +      self.misc_bulletcounter = self.misc_bulletcounter + 1;
 +      if (self.misc_bulletcounter == 0)
 +      {
 +              ATTACK_FINISHED(self) = time + WEP_CVAR(uzi, burst_refire2) * W_WeaponRateFactor();
 +              weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, burst_animtime), w_ready);
 +      }
 +      else
 +      {
 +              weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, burst_refire), uzi_mode1_fire_burst);
 +      }
 +
 +}
 +
 +float w_uzi(float req)
 +{
 +      float ammo_amount;
 +      switch(req)
 +      {
 +              case WR_AIM:
 +              {
 +                      if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
 +                              self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
 +                      else
 +                              self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
 +                      
 +                      return TRUE;
 +              }
 +              case WR_THINK:
 +              {
 +                      if(autocvar_g_balance_uzi_reload_ammo && self.clip_load < min(max(WEP_CVAR(uzi, sustained_ammo), WEP_CVAR(uzi, first_ammo)), WEP_CVAR(uzi, burst_ammo))) // forced reload
 +                              WEP_ACTION(self.weapon, WR_RELOAD);
 +                      else if(WEP_CVAR(uzi, mode) == 1)
 +                      {
 +                              if (self.BUTTON_ATCK)
 +                              if (weapon_prepareattack(0, 0))
 +                              {
 +                                      self.misc_bulletcounter = 0;
 +                                      uzi_mode1_fire_auto();
 +                              }
 +
 +                              if(self.BUTTON_ATCK2)
 +                              if(weapon_prepareattack(1, 0))
 +                              {
 +                                      if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2))
 +                                      if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 +                                      {
 +                                              W_SwitchWeapon_Force(self, w_getbestweapon(self));
 +                                              w_ready();
 +                                              return FALSE;
 +                                      }
 +
 +                                      W_DecreaseAmmo(ammo_nails, WEP_CVAR(uzi, burst_ammo), autocvar_g_balance_uzi_reload_ammo);
 +
 +                                      self.misc_bulletcounter = WEP_CVAR(uzi, burst) * -1;
 +                                      uzi_mode1_fire_burst();
 +                              }
 +                      }
 +                      else
 +                      {
 +
 +                              if (self.BUTTON_ATCK)
 +                              if (weapon_prepareattack(0, 0))
 +                              {
 +                                      self.misc_bulletcounter = 1;
 +                                      W_UZI_Attack(WEP_UZI); // sets attack_finished
 +                                      weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(uzi, sustained_refire), uzi_fire1_02);
 +                              }
 +
 +                              if (self.BUTTON_ATCK2 && WEP_CVAR(uzi, first))
 +                              if (weapon_prepareattack(1, 0))
 +                              {
 +                                      self.misc_bulletcounter = 1;
 +                                      W_UZI_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
 +                                      weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(uzi, first_refire), w_ready);
 +                              }
 +                      }
 +                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_model ("models/uziflash.md3");
 +                      precache_model ("models/weapons/g_uzi.md3");
 +                      precache_model ("models/weapons/v_uzi.md3");
 +                      precache_model ("models/weapons/h_uzi.iqm");
 +                      precache_sound ("weapons/uzi_fire.wav");
 +                      WEP_SET_PROPS(UZI_SETTINGS(uzi), WEP_UZI)
 +                      return TRUE;
 +              }
 +              case WR_SETUP:
 +              {
 +                      self.current_ammo = ammo_nails;
 +                      return TRUE;
 +              }
 +              case WR_CHECKAMMO1:
 +              {
 +                      if(WEP_CVAR(uzi, mode) == 1)
 +                              ammo_amount = self.ammo_nails >= WEP_CVAR(uzi, sustained_ammo);
 +                      else
 +                              ammo_amount = self.ammo_nails >= WEP_CVAR(uzi, first_ammo);
 +
 +                      if(autocvar_g_balance_uzi_reload_ammo)
 +                      {
 +                              if(WEP_CVAR(uzi, mode) == 1)
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, sustained_ammo);
 +                              else
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, first_ammo);
 +                      }
 +                      return ammo_amount;
 +              }
 +              case WR_CHECKAMMO2:
 +              {
 +                      if(WEP_CVAR(uzi, mode) == 1)
 +                              ammo_amount = self.ammo_nails >= WEP_CVAR(uzi, burst_ammo);
 +                      else
 +                              ammo_amount = self.ammo_nails >= WEP_CVAR(uzi, first_ammo);
 +
 +                      if(autocvar_g_balance_uzi_reload_ammo)
 +                      {
 +                              if(WEP_CVAR(uzi, mode) == 1)
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, burst_ammo);
 +                              else
 +                                      ammo_amount += self.(weapon_load[WEP_UZI]) >= WEP_CVAR(uzi, first_ammo);
 +                      }
 +                      return ammo_amount;
 +              }
 +              case WR_CONFIG:
 +              {
 +                      WEP_CONFIG_SETTINGS(UZI_SETTINGS(uzi))
 +                      return TRUE;
 +              }
 +              case WR_RELOAD:
 +              {
 +                      W_Reload(min(max(WEP_CVAR(uzi, sustained_ammo), WEP_CVAR(uzi, first_ammo)), WEP_CVAR(uzi, burst_ammo)), autocvar_g_balance_uzi_reload_ammo, autocvar_g_balance_uzi_reload_time, "weapons/reload.wav");
 +                      return TRUE;
 +              }
 +              case WR_SUICIDEMESSAGE:
 +              {
 +                      return WEAPON_THINKING_WITH_PORTALS;
 +              }
 +              case WR_KILLMESSAGE:
 +              {
 +                      if(w_deathtype & HITTYPE_SECONDARY)
 +                              return WEAPON_UZI_MURDER_SNIPE;
 +                      else
 +                              return WEAPON_UZI_MURDER_SPRAY;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#ifdef CSQC
 +float w_uzi(float req)
 +{
 +      switch(req)
 +      {
 +              case WR_IMPACTEFFECT:
 +              {
 +                      vector org2;
 +                      org2 = w_org + w_backoff * 2;
 +                      pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
 +                      if(!w_issilent)
 +                              if(w_random < 0.05)
 +                                      sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.1)
 +                                      sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
 +                              else if(w_random < 0.2)
 +                                      sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
 +                                      
 +                      return TRUE;
 +              }
 +              case WR_INIT:
 +              {
 +                      precache_sound("weapons/ric1.wav");
 +                      precache_sound("weapons/ric2.wav");
 +                      precache_sound("weapons/ric3.wav");
 +                      return TRUE;
 +              }
 +      }
 +      return TRUE;
 +}
 +#endif
 +#endif
index a223f8be2b2c9e6a20ab1863b578c38a63ffb9b3,a223f8be2b2c9e6a20ab1863b578c38a63ffb9b3..0a5ac3acd5cb9e6ee61b0eacdfa9ed0ed4ba02c4
@@@ -72,7 -72,7 +72,7 @@@ void nade_boom(
  
        self.takedamage = DAMAGE_NO;
        RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
--                               autocvar_g_nades_nade_radius, self, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy);
++                               autocvar_g_nades_nade_radius, self, world, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy);
  
        remove(self);
  }