ZIPEXCLUDE ?= -x\!*.pk3 -xr\!\.svn -x\!qcsrc
DIFF ?= diff
-FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"^1$(shell git describe) TEST BUILD"'
+FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"^1$(shell git describe) TEST BUILD"' -DCVAR_POPCON
FTEQCCFLAGS ?= -Werror -Wno-Q302 -O3 -Ono-c -Ono-cs $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
FTEQCCFLAGS_PROGS ?=
FTEQCCFLAGS_MENU ?=
clean:
rm -f progs.dat menu.dat csprogs.dat
-FILES_CSPROGS = qcsrc/client/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^ ],qcsrc/client/&,' < qcsrc/client/progs.src)
+FILES_CSPROGS = $(shell find qcsrc/client qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
csprogs.dat: $(FILES_CSPROGS)
@echo make[1]: Entering directory \`$(PWD)/qcsrc/client\'
cd qcsrc/client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
-FILES_PROGS = qcsrc/server/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^ ],qcsrc/server/&,' < qcsrc/server/progs.src)
+FILES_PROGS = $(shell find qcsrc/server qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
progs.dat: $(FILES_PROGS)
@echo make[1]: Entering directory \`$(PWD)/qcsrc/server\'
cd qcsrc/server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
-FILES_MENU = qcsrc/menu/progs.src $(shell sed '/\.dat/d; s,//.*,,; s,[^ ],qcsrc/menu/&,' < qcsrc/menu/progs.src)
+FILES_MENU = $(shell find qcsrc/menu qcsrc/common qcsrc/warpzonelib -type f -not -name fteqcc.log -not -name qc.asm) qcsrc/server/w_*.qc
menu.dat: $(FILES_MENU)
@echo make[1]: Entering directory \`$(PWD)/qcsrc/menu\'
cd qcsrc/menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
seta hud_panel_weapons_complainbubble_color_unavailable "" "color of the complainbubble when showing weapon unavailable message"
seta hud_panel_weapons_ammo_color "" "color of status bar"
seta hud_panel_weapons_ammo_alpha "" "alpha of status bar"
+seta hud_panel_weapons_timeout "" "panel disappears if you don't switch weapon for this amount of seconds"
+seta hud_panel_weapons_timeout_effect "" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
seta hud_panel_ammo "" "enable/disable this panel"
seta hud_panel_ammo_pos "" "position of this panel"
seta hud_panel_ammo_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
seta hud_panel_ammo_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_ammo_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+seta hud_panel_ammo_progressbar "" "use progressbar behind ammo icons"
+seta hud_panel_ammo_progressbar_xoffset "" "percentage of mySize_x to offset progressbar with"
+seta hud_panel_ammo_progressbar_name "" "name of progressbar to use behind ammo icons"
+seta hud_panel_ammo_text "" "show text/icons in the ammo panel"
seta hud_panel_powerups "" "enable/disable this panel"
seta hud_panel_powerups_pos "" "position of this panel"
seta hud_panel_powerups_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_powerups_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
seta hud_panel_powerups_progressbar "" "enable progressbar in panel"
+seta hud_panel_powerups_progressbar_strength "" "progressbar image for strength"
+seta hud_panel_powerups_progressbar_shield "" "progressbar image for shield"
+seta hud_panel_powerups_text "" "show text/icons in the powerups panel"
seta hud_panel_healtharmor "" "enable/disable this panel, 2 = combined health/armor display"
seta hud_panel_healtharmor_pos "" "position of this panel"
seta hud_panel_healtharmor_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_healtharmor_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
seta hud_panel_healtharmor_progressbar "" "enable progressbar in panel"
+seta hud_panel_healtharmor_progressbar_health "" "progressbar image for health"
+seta hud_panel_healtharmor_progressbar_armor "" "progressbar image for armor"
+seta hud_panel_healtharmor_text "" "show text/icons in the healtharmor panel"
seta hud_panel_notify "" "enable/disable this panel"
seta hud_panel_notify_pos "" "position of this base of the panel"
+++ /dev/null
-#!/bin/sh
-
-while read -r EXT EOLSTYLE; do
- echo "Fixing $EXT..."
- find . -name .svn -prune -o -type f \( -name "*.$EXT" -o -name "$EXT" \) -print0 | \
- case "$EOLSTYLE" in
- 1)
- xargs -0 svn propset svn:eol-style native
- ;;
- 0)
- xargs -0 svn propdel svn:eol-style
- ;;
- esac
-done <eol-style.txt
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_hlac -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_campingrifle -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_sniperrifle -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_start_weapon_seeker -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_laser_primary_gauntlet 0
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 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 35
set g_balance_laser_secondary_edgedamage 10
set g_balance_laser_secondary_gauntlet 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
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 6
set g_balance_shotgun_secondary_animtime 1
// }}}
// {{{ 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_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_grenadelauncher_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
set g_balance_minelayer_damage 35
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_proximityradius 150
set g_balance_minelayer_speed 750
set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_lifetime_countdown 0
set g_balance_minelayer_refire 1.5
set g_balance_minelayer_animtime 0.4
set g_balance_minelayer_ammo 5
set g_balance_electro_secondary_health 5
set g_balance_electro_secondary_damageforcescale 4
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_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_joinspeed 0
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0
+set g_balance_crylink_primary_jointime 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_secondary_animtime 0.3
set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joinspeed 0
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_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_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_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_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 untill 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_hlac_secondary_ammo 10
set g_balance_hlac_secondary_shots 6
// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0
-set g_balance_campingrifle_primary_tracer 0
-set g_balance_campingrifle_primary_damage 60
-set g_balance_campingrifle_primary_headshotaddeddamage 100
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.8
-set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_primary_burstcost 0
-set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 35
-set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
-set g_balance_campingrifle_secondary_spread 0.008
-set g_balance_campingrifle_secondary_force 1
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.15
-set g_balance_campingrifle_secondary_animtime 0.1
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_campingrifle_secondary_burstcost 0
-set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
+// {{{ sniperrifle
+set g_balance_sniperrifle_magazinecapacity 8
+set g_balance_sniperrifle_reloadtime 2 // matches reload anim
+set g_balance_sniperrifle_auto_reload_on_switch 0
+set g_balance_sniperrifle_bursttime 0
+set g_balance_sniperrifle_primary_tracer 0
+set g_balance_sniperrifle_primary_damage 60
+set g_balance_sniperrifle_primary_headshotaddeddamage 100
+set g_balance_sniperrifle_primary_spread 0
+set g_balance_sniperrifle_primary_force 2
+set g_balance_sniperrifle_primary_speed 35000
+set g_balance_sniperrifle_primary_lifetime 5
+set g_balance_sniperrifle_primary_refire 0.8
+set g_balance_sniperrifle_primary_animtime 0.3
+set g_balance_sniperrifle_primary_ammo 10
+set g_balance_sniperrifle_primary_bulletconstant 130 // 56.3qu
+set g_balance_sniperrifle_primary_burstcost 0
+set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_secondary 1
+set g_balance_sniperrifle_secondary_reload 0
+set g_balance_sniperrifle_secondary_tracer 0
+set g_balance_sniperrifle_secondary_damage 35
+set g_balance_sniperrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
+set g_balance_sniperrifle_secondary_spread 0.008
+set g_balance_sniperrifle_secondary_force 1
+set g_balance_sniperrifle_secondary_speed 20000
+set g_balance_sniperrifle_secondary_lifetime 5
+set g_balance_sniperrifle_secondary_refire 0.15
+set g_balance_sniperrifle_secondary_animtime 0.1
+set g_balance_sniperrifle_secondary_ammo 10
+set g_balance_sniperrifle_secondary_bulletconstant 130 // 18.3qu
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
set g_balance_seeker_flac_speed_up 1000
set g_balance_seeker_flac_speed_z 0
set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_accel 3000
set g_balance_seeker_missile_ammo 2
set g_balance_seeker_missile_animtime 0.3
set g_balance_seeker_missile_count 4
set g_balance_seeker_missile_damage 40
set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_decel 6000
set g_balance_seeker_missile_delay 0.25
set g_balance_seeker_missile_edgedamage 10
set g_balance_seeker_missile_force 250
set g_balance_seeker_missile_smart_trace_max 2500
set g_balance_seeker_missile_smart_trace_min 1000
set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
set g_balance_seeker_missile_speed_up 300
set g_balance_seeker_missile_speed_z 0
set g_balance_seeker_missile_speed_max 1250
-////2.4.2 weapons (with some tweaks) VS balanceLeeStricklin
-
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-// }}}
-
// {{{ 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_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_hlac 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_campingrifle -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_sniperrifle -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 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_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
// }}}
// {{{ pickup items
-// Ammo caps copied from balanceFruit
set g_pickup_ammo_anyway 0
set g_pickup_weapons_anyway 1
set g_pickup_shells 20
set g_balance_laser_primary_gauntlet 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 1
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 200 // dps
set g_balance_laser_secondary_edgedamage 0
set g_balance_laser_secondary_gauntlet 1
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
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 5
set g_balance_shotgun_secondary_animtime 1
// }}}
// {{{ 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_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 26
set g_balance_uzi_first_force -30
set g_balance_uzi_first_spread 0.01
set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 1
+
set g_balance_uzi_sustained_damage 17
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 300 // 13.1qu
// }}}
set g_balance_grenadelauncher_bouncefactor 0.7
set g_balance_grenadelauncher_bouncestop 0.12
// }}}
-// {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
+// {{{ minelayer
+set g_balance_minelayer_damage 65
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_radius 175
set g_balance_minelayer_proximityradius 150
set g_balance_minelayer_speed 750
set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_lifetime_countdown 0
+set g_balance_minelayer_refire 1.3
set g_balance_minelayer_animtime 0.4
set g_balance_minelayer_ammo 5
set g_balance_minelayer_health 15
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_lifetime 3
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
set g_balance_electro_secondary_animtime 0.3
set g_balance_electro_secondary_health 10
set g_balance_electro_secondary_damageforcescale 4
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 70
set g_balance_electro_combo_edgedamage 0
set g_balance_electro_combo_force 200
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 6950
+set g_balance_crylink_primary_speed 6820
set g_balance_crylink_primary_spread 0.03
set g_balance_crylink_primary_shots 4
set g_balance_crylink_primary_bounces 2
set g_balance_crylink_primary_animtime 0.30008
set g_balance_crylink_primary_ammo 3
set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joinspeed 0
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0
+set g_balance_crylink_primary_jointime 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_secondary_animtime 0.3
set g_balance_crylink_secondary_ammo 3
set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joinspeed 0
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_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_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: 10000 full, fades to 10000
set g_balance_crylink_secondary_middle_fadetime 5
set g_balance_crylink_secondary_line_fadetime 2
// }}}
// {{{ nex
-set g_balance_nex_primary_ammo 13
-set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_damage 78
+set g_balance_nex_primary_damage 72
set g_balance_nex_primary_force 600
set g_balance_nex_primary_refire 1.505
+set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_ammo 5
set g_balance_nex_primary_damagefalloff_mindist 9999999
set g_balance_nex_primary_damagefalloff_maxdist 9999999
set g_balance_nex_primary_damagefalloff_halflife 9999999
set g_balance_nex_primary_damagefalloff_forcehalflife 9999999
-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 1
+set g_balance_nex_secondary_charge 1
+set g_balance_nex_secondary_charge_rate 0.25
+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 80
set g_balance_nex_secondary_force -500
set g_balance_nex_secondary_refire 1.25
set g_balance_nex_secondary_animtime 0.75
-set g_balance_nex_secondary_ammo 5
+set g_balance_nex_secondary_ammo 2
set g_balance_nex_secondary_damagefalloff_mindist 9999999
set g_balance_nex_secondary_damagefalloff_maxdist 9999999
set g_balance_nex_secondary_damagefalloff_halflife 9999999
set g_balance_nex_secondary_damagefalloff_forcehalflife 9999999
-set g_balance_nex_charge 0
+set g_balance_nex_charge 1
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_shot_multiplier 0.5
+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.2
-set g_balance_nex_charge_minspeed 400
-set g_balance_nex_charge_maxspeed 1000
+set g_balance_nex_charge_minspeed ""
+set g_balance_nex_charge_maxspeed ""
// }}}
// {{{ minstanex
set g_balance_minstanex_refire 1
set g_balance_hlac_secondary_ammo 11
set g_balance_hlac_secondary_shots 6
// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_campingrifle_primary_tracer 0
-set g_balance_campingrifle_primary_damage 75
-set g_balance_campingrifle_primary_headshotaddeddamage 90
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.7
-set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_primary_burstcost 0 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 40
-set g_balance_campingrifle_secondary_headshotaddeddamage 20
-set g_balance_campingrifle_secondary_spread 0.008
-set g_balance_campingrifle_secondary_force 1
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.0006
-set g_balance_campingrifle_secondary_animtime 0.1
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_campingrifle_secondary_burstcost 0
-set g_balance_campingrifle_secondary_bullethail 0
+// {{{ sniperrifle
+set g_balance_sniperrifle_magazinecapacity 8
+set g_balance_sniperrifle_reloadtime 2 // matches reload anim
+set g_balance_sniperrifle_auto_reload_on_switch 0
+set g_balance_sniperrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
+set g_balance_sniperrifle_primary_tracer 0
+set g_balance_sniperrifle_primary_damage 75
+set g_balance_sniperrifle_primary_headshotaddeddamage 90
+set g_balance_sniperrifle_primary_spread 0
+set g_balance_sniperrifle_primary_force 2
+set g_balance_sniperrifle_primary_speed 35000
+set g_balance_sniperrifle_primary_lifetime 5
+set g_balance_sniperrifle_primary_refire 0.7
+set g_balance_sniperrifle_primary_animtime 0.3
+set g_balance_sniperrifle_primary_ammo 10
+set g_balance_sniperrifle_primary_bulletconstant 130 // 56.3qu
+set g_balance_sniperrifle_primary_burstcost 0 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_secondary 1
+set g_balance_sniperrifle_secondary_reload 0
+set g_balance_sniperrifle_secondary_tracer 0
+set g_balance_sniperrifle_secondary_damage 40
+set g_balance_sniperrifle_secondary_headshotaddeddamage 20
+set g_balance_sniperrifle_secondary_spread 0.008
+set g_balance_sniperrifle_secondary_force 1
+set g_balance_sniperrifle_secondary_speed 20000
+set g_balance_sniperrifle_secondary_lifetime 5
+set g_balance_sniperrifle_secondary_refire 0.0006
+set g_balance_sniperrifle_secondary_animtime 0.1
+set g_balance_sniperrifle_secondary_ammo 10
+set g_balance_sniperrifle_secondary_bulletconstant 130 // 18.3qu
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_secondary_bullethail 0
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
set g_balance_seeker_flac_speed_up 1000
set g_balance_seeker_flac_speed_z 0
set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_accel 3000
set g_balance_seeker_missile_ammo 2
set g_balance_seeker_missile_animtime 0.3
set g_balance_seeker_missile_count 8
-set g_balance_seeker_missile_damage 15
+set g_balance_seeker_missile_damage 25
set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_decel 6000
set g_balance_seeker_missile_delay 0.25
set g_balance_seeker_missile_edgedamage 10
set g_balance_seeker_missile_force 250
set g_balance_seeker_missile_smart_trace_max 2500
set g_balance_seeker_missile_smart_trace_min 1000
set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
set g_balance_seeker_missile_speed_up 300
set g_balance_seeker_missile_speed_z 0
set g_balance_seeker_missile_speed_max 1250
+++ /dev/null
-// {{{ 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_minelayer -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_hlac -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_campingrifle -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_start_weapon_seeker -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_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_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_balance_weaponswitchdelay 0.15
-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_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)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-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
-// }}}
-
-// {{{ 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 3
-set g_balance_powerup_strength_time 30
-set g_balance_powerup_strength_selfdamage 1.5
-set g_balance_powerup_strength_selfforce 1.5
-// }}}
-
-// {{{ 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
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-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.03
-set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1
-set g_balance_laser_primary_force_velocitybias 0
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-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_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1
-set g_balance_laser_secondary_force_velocitybias 0
-// }}
-// {{{ 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.35 // match the anim
-set g_balance_shotgun_secondary_melee_range 60
-set g_balance_shotgun_secondary_melee_swing 50
-set g_balance_shotgun_secondary_melee_time 0.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
-// }}}
-// {{{ uzi
-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
-// }}}
-// {{{ 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_lifetime2 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
-// }}}
-// {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
-set g_balance_minelayer_edgedamage 30
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.4
-set g_balance_minelayer_ammo 5
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 4 // 0 disables the limit
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // 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_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-// }}}
-// {{{ 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_count 1
-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
-// }}}
-// {{{ 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_joinspeed 0
-
-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_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_joinspeed 0
-
-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
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 90
-set g_balance_nex_primary_force 200
-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 1000
-set g_balance_nex_primary_damagefalloff_maxdist 3000
-set g_balance_nex_primary_damagefalloff_halflife 1500
-set g_balance_nex_primary_damagefalloff_forcehalflife 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_damage 90
-set g_balance_nex_secondary_force 200
-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 1000
-set g_balance_nex_secondary_damagefalloff_maxdist 3000
-set g_balance_nex_secondary_damagefalloff_halflife 1500
-set g_balance_nex_secondary_damagefalloff_forcehalflife 1500
-
-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_limit 0.5
-set g_balance_nex_charge_rot_rate 0
-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
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-// }}}
-// {{{ 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_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_damage 37
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 100
-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
-// }}}
-// {{{ 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
-// }}}
-// {{{ 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 30
-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
-// }}}
-// {{{ hlac
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.25
-set g_balance_hlac_primary_spread_add 0.0045
-set g_balance_hlac_primary_spread_crouchmod 0.25
-
-set g_balance_hlac_primary_damage 23
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 100
-set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
-set g_balance_hlac_primary_lifetime 5
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.4
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.15
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 23
-set g_balance_hlac_secondary_edgedamage 10
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.3
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
-// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 0
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_campingrifle_primary_tracer 0
-set g_balance_campingrifle_primary_damage 50
-set g_balance_campingrifle_primary_headshotaddeddamage 50
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 0
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.7
-set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_campingrifle_primary_bullethail 0
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 15
-set g_balance_campingrifle_secondary_headshotaddeddamage 25
-set g_balance_campingrifle_secondary_spread 0.02
-set g_balance_campingrifle_secondary_force 0
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.1
-set g_balance_campingrifle_secondary_animtime 0.1
-set g_balance_campingrifle_secondary_ammo 4
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_campingrifle_secondary_burstcost 0.35
-set g_balance_campingrifle_secondary_bullethail 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
-// }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 40
-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_ammo 5
-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
-// }}}
-// {{{ seeker
-set g_balance_seeker_flac_ammo 0.5
-set g_balance_seeker_flac_animtime 0.1
-set g_balance_seeker_flac_damage 15
-set g_balance_seeker_flac_edgedamage 10
-set g_balance_seeker_flac_force 50
-set g_balance_seeker_flac_lifetime 0.1
-set g_balance_seeker_flac_lifetime_rand 0.05
-set g_balance_seeker_flac_radius 100
-set g_balance_seeker_flac_refire 0.1
-set g_balance_seeker_flac_speed 3000
-set g_balance_seeker_flac_speed_up 1000
-set g_balance_seeker_flac_speed_z 0
-set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1.05
-set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.3
-set g_balance_seeker_missile_count 4
-set g_balance_seeker_missile_damage 40
-set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
-set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_edgedamage 10
-set g_balance_seeker_missile_force 250
-set g_balance_seeker_missile_health 5
-set g_balance_seeker_missile_lifetime 15
-set g_balance_seeker_missile_proxy 0
-set g_balance_seeker_missile_proxy_delay 0.2
-set g_balance_seeker_missile_proxy_maxrange 45
-set g_balance_seeker_missile_radius 80
-set g_balance_seeker_missile_refire 0.5
-set g_balance_seeker_missile_smart 1
-set g_balance_seeker_missile_smart_mindist 800
-set g_balance_seeker_missile_smart_trace_max 2500
-set g_balance_seeker_missile_smart_trace_min 1000
-set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
-set g_balance_seeker_missile_speed_up 300
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1250
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.3
-set g_balance_seeker_tag_damageforcescale 4
-set g_balance_seeker_tag_health 5
-set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.7
-set g_balance_seeker_tag_speed 9000
-set g_balance_seeker_tag_spread 0
-// End new seeker
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_hagar 0 "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_hlac 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_campingrifle -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_hlac 0 "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_sniperrifle -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 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_seeker 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_balance_health_start 125
+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_start_weapon_seeker -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 30
+set g_start_ammo_shells 15
set g_start_ammo_nails 0
set g_start_ammo_rockets 0
set g_start_ammo_cells 0
// {{{ pickup items
set g_pickup_ammo_anyway 1
set g_pickup_weapons_anyway 1
-set g_pickup_shells 30
-set g_pickup_shells_weapon 30
-set g_pickup_shells_max 120
+set g_pickup_shells 15
+set g_pickup_shells_weapon 15
+set g_pickup_shells_max 90
set g_pickup_nails 80
set g_pickup_nails_weapon 80
-set g_pickup_nails_max 400
-set g_pickup_rockets 30
-set g_pickup_rockets_weapon 30
-set g_pickup_rockets_max 120
+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 50
set g_pickup_cells_weapon 50
set g_pickup_cells_max 200
-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_fuel 50
+set g_pickup_fuel_weapon 50
+set g_pickup_fuel_jetpack 100
+set g_pickup_fuel_max 100
set g_pickup_armorsmall 10
set g_pickup_armorsmall_max 200
set g_pickup_armorsmall_anyway 1
set g_pickup_armorlarge_max 200
set g_pickup_armorlarge_anyway 1
set g_pickup_healthsmall 10
-set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_max 250
set g_pickup_healthsmall_anyway 1
set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 200
+set g_pickup_healthmedium_max 250
set g_pickup_healthmedium_anyway 1
set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_max 250
set g_pickup_healthlarge_anyway 1
set g_pickup_healthmega 100
-set g_pickup_healthmega_max 200
+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 15
-set g_pickup_respawntime_ammo 15
+set g_pickup_respawntime_weapon 10
+set g_pickup_respawntime_ammo 10
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
set g_pickup_respawntimejitter_long 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 5
+set g_balance_health_rotlinear 4
set g_balance_pause_health_rot 3
-set g_balance_pause_health_rot_spawn 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_rotstable 150
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 3
-set g_balance_pause_armor_rot 1
-set g_balance_pause_armor_rot_spawn 1
+set g_balance_armor_rotlinear 2
+set g_balance_pause_armor_rot 3
+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
// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
set g_projectiles_newton_style_2_minfactor 0.8
set g_projectiles_newton_style_2_maxfactor 1.5
-set g_projectiles_spread_style 0
+set g_projectiles_spread_style 7
// possible values:
// 0: forward + solid sphere (like Quake) - varies velocity
// 1: forward + flattened solid sphere
// 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_falldamage_minspeed 1000
+set g_balance_falldamage_factor 0.20
+set g_balance_falldamage_maxdamage 15
// }}}
// {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.2
+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
// {{{ weapon properties
// {{{ laser
set g_balance_laser_primary_damage 25
-set g_balance_laser_primary_edgedamage 10
-set g_balance_laser_primary_force 400
+set g_balance_laser_primary_edgedamage 12.5
+set g_balance_laser_primary_force 175
set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 12000
+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 30
set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0.03
+set g_balance_laser_primary_delay 0
set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1
-set g_balance_laser_primary_force_velocitybias 0
+set g_balance_laser_primary_force_zscale 2 // 350 upforce
+set g_balance_laser_primary_force_velocitybias 0.3
+set g_balance_laser_primary_force_other_scale 1
set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 25
-set g_balance_laser_secondary_edgedamage 10
+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_shotangle -90
set g_balance_laser_secondary_delay 0
set g_balance_laser_secondary_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1
+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
// }}}
// {{{ shotgun
-set g_balance_shotgun_primary_bullets 6
-set g_balance_shotgun_primary_damage 8
+set g_balance_shotgun_primary_bullets 12
+set g_balance_shotgun_primary_damage 5
set g_balance_shotgun_primary_force 15
set g_balance_shotgun_primary_spread 0.11
-set g_balance_shotgun_primary_refire 0.5
+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.35 // match the anim
-set g_balance_shotgun_secondary_melee_range 60
+set g_balance_shotgun_secondary_melee_range 85
set g_balance_shotgun_secondary_melee_swing 50
set g_balance_shotgun_secondary_melee_time 0.1
set g_balance_shotgun_secondary_damage 115
set g_balance_shotgun_secondary_animtime 1
// }}}
// {{{ 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.1
+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.75 // refire after burst
+set g_balance_uzi_burst_spread 0.03
+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 12
-set g_balance_uzi_first_force 5
-set g_balance_uzi_first_spread 0.015
-set g_balance_uzi_first_refire 0.15
+set g_balance_uzi_first_damage 18
+set g_balance_uzi_first_force 20
+set g_balance_uzi_first_spread 0.03
+set g_balance_uzi_first_refire 0.2
set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 7
-set g_balance_uzi_sustained_force 5
-set g_balance_uzi_sustained_spread 0.05
-set g_balance_uzi_sustained_refire 0.075
+
+set g_balance_uzi_sustained_damage 14
+set g_balance_uzi_sustained_force 20
+set g_balance_uzi_sustained_spread 0.04
+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
// }}}
// {{{ mortar
set g_balance_grenadelauncher_primary_type 0
set g_balance_grenadelauncher_primary_damage 50
-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 2200
-set g_balance_grenadelauncher_primary_speed_up 220
+set g_balance_grenadelauncher_primary_edgedamage 25
+set g_balance_grenadelauncher_primary_force 250
+set g_balance_grenadelauncher_primary_radius 130
+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_spread 0.02
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_secondary_type 1
set g_balance_grenadelauncher_secondary_damage 60
-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_edgedamage 30
+set g_balance_grenadelauncher_secondary_force 250
+set g_balance_grenadelauncher_secondary_radius 130
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_spread 0.02
set g_balance_grenadelauncher_secondary_lifetime 1
set g_balance_grenadelauncher_secondary_lifetime2 0
set g_balance_grenadelauncher_secondary_refire 0.7
set g_balance_grenadelauncher_secondary_ammo 2
set g_balance_grenadelauncher_secondary_health 70
set g_balance_grenadelauncher_secondary_damageforcescale 4
-set g_balance_grenadelauncher_secondary_remote_detonateprimary 1
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
set g_balance_grenadelauncher_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
-set g_balance_minelayer_edgedamage 30
+// {{{ minelayer
+set g_balance_minelayer_damage 40
+set g_balance_minelayer_edgedamage 20
set g_balance_minelayer_force 250
set g_balance_minelayer_radius 175
set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_speed 1000
+set g_balance_minelayer_lifetime 10
+set g_balance_minelayer_lifetime_countdown 0.5
set g_balance_minelayer_refire 1.5
set g_balance_minelayer_animtime 0.4
set g_balance_minelayer_ammo 5
// }}}
// {{{ 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_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 150
-set g_balance_electro_primary_comboradius 0
-set g_balance_electro_primary_speed 2000
+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 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_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 50
-set g_balance_electro_secondary_edgedamage 0
+set g_balance_electro_secondary_damage 45
+set g_balance_electro_secondary_edgedamage 22.5
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 2.5
+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
+set g_balance_electro_secondary_refire2 1.25
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_count 3
-set g_balance_electro_combo_damage 50
-set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_secondary_bouncefactor 0.5
+set g_balance_electro_secondary_bouncestop 0.075
+set g_balance_electro_combo_damage 40
+set g_balance_electro_combo_edgedamage 20
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
// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 14
-set g_balance_crylink_primary_edgedamage 0
+// {{{ crylink
+set g_balance_crylink_primary_damage 10
+set g_balance_crylink_primary_edgedamage 5
set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 50
-set g_balance_crylink_primary_speed 7000
-set g_balance_crylink_primary_spread 0.02
-set g_balance_crylink_primary_shots 4
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_speed 1800
+set g_balance_crylink_primary_spread 0.075
+set g_balance_crylink_primary_shots 7
set g_balance_crylink_primary_bounces 1
-set g_balance_crylink_primary_refire 0.4
+set g_balance_crylink_primary_refire 0.5
set g_balance_crylink_primary_animtime 0.3
-set g_balance_crylink_primary_ammo 2
+set g_balance_crylink_primary_ammo 4
set g_balance_crylink_primary_bouncedamagefactor 0.5
-set g_balance_crylink_primary_joinspeed 0
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0.4
+set g_balance_crylink_primary_jointime 0
+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_primary_other_lifetime 0.1 // range: 700 full, fades to 2450
-set g_balance_crylink_primary_other_fadetime 0.25
+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 0
+set g_balance_crylink_secondary_damage 5
+set g_balance_crylink_secondary_edgedamage 5
set g_balance_crylink_secondary_force -40
-set g_balance_crylink_secondary_radius 10
-set g_balance_crylink_secondary_speed 4000
-set g_balance_crylink_secondary_spread 0.01
+set g_balance_crylink_secondary_radius 50
+set g_balance_crylink_secondary_speed 2000
+set g_balance_crylink_secondary_spread 0.02
set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.1
-set g_balance_crylink_secondary_animtime 0.1
+set g_balance_crylink_secondary_bounces 1
+set g_balance_crylink_secondary_refire 0.2
+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_joinspeed 0
+set g_balance_crylink_secondary_bouncedamagefactor 0.25
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_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_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_secondary_line_lifetime 5
+set g_balance_crylink_secondary_line_fadetime 5
// }}}
// {{{ nex
set g_balance_nex_primary_damage 90
-set g_balance_nex_primary_force 300
+set g_balance_nex_primary_force 400
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 1000
-set g_balance_nex_primary_damagefalloff_maxdist 3000
-set g_balance_nex_primary_damagefalloff_halflife 1500
-set g_balance_nex_primary_damagefalloff_forcehalflife 1500
+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_damage 90
-set g_balance_nex_secondary_force 300
-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 1000
-set g_balance_nex_secondary_damagefalloff_maxdist 3000
-set g_balance_nex_secondary_damagefalloff_halflife 1500
-set g_balance_nex_secondary_damagefalloff_forcehalflife 1500
+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 0
+set g_balance_nex_charge 1
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_limit 0.5
+set g_balance_nex_charge_start 0.5
+set g_balance_nex_charge_rate 0.3
+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_shot_multiplier 0.5
-set g_balance_nex_charge_velocity_rate 0.2
+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.25
+set g_balance_nex_charge_velocity_rate 0
set g_balance_nex_charge_minspeed 400
-set g_balance_nex_charge_maxspeed 1000
+set g_balance_nex_charge_maxspeed 800
// }}}
// {{{ minstanex
set g_balance_minstanex_refire 1
// }}}
// {{{ hagar
set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 0
+set g_balance_hagar_primary_edgedamage 15
set g_balance_hagar_primary_force 50
set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.05
-set g_balance_hagar_primary_speed 2400
-set g_balance_hagar_primary_lifetime 30
+set g_balance_hagar_primary_spread 0.08
+set g_balance_hagar_primary_speed 2000
+set g_balance_hagar_primary_lifetime 0.12
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_damage 20
-set g_balance_hagar_secondary_edgedamage 10
-set g_balance_hagar_secondary_force 50
-set g_balance_hagar_secondary_radius 90
-set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_damage 35
+set g_balance_hagar_secondary_edgedamage 17.5
+set g_balance_hagar_secondary_force 100
+set g_balance_hagar_secondary_radius 65
+set g_balance_hagar_secondary_spread 0.015
set g_balance_hagar_secondary_speed 2000
-set g_balance_hagar_secondary_lifetime_min 0.1
-set g_balance_hagar_secondary_lifetime_rand 0.05
-set g_balance_hagar_secondary_refire 0.1
-set g_balance_hagar_secondary_ammo 0.5
+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
// }}}
// {{{ rocketlauncher
set g_balance_rocketlauncher_damage 80
set g_balance_rocketlauncher_edgedamage 40
-set g_balance_rocketlauncher_force 600
+set g_balance_rocketlauncher_force 400
set g_balance_rocketlauncher_radius 100
-set g_balance_rocketlauncher_speed 1600
-set g_balance_rocketlauncher_speedaccel 1600
-set g_balance_rocketlauncher_speedstart 1000
+set g_balance_rocketlauncher_speed 1500
+set g_balance_rocketlauncher_speedaccel 1500
+set g_balance_rocketlauncher_speedstart 800
set g_balance_rocketlauncher_lifetime 30
-set g_balance_rocketlauncher_refire 1.2
+set g_balance_rocketlauncher_refire 1.1
set g_balance_rocketlauncher_animtime 0.3
set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 40
+set g_balance_rocketlauncher_health 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 4
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 140 // max degrees per second
+set g_balance_rocketlauncher_guiderate 130 // 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 80
-set g_balance_rocketlauncher_remote_edgedamage 40
+set g_balance_rocketlauncher_remote_damage 70
+set g_balance_rocketlauncher_remote_edgedamage 35
set g_balance_rocketlauncher_remote_radius 100
-set g_balance_rocketlauncher_remote_force 600
+set g_balance_rocketlauncher_remote_force 400
// }}}
// {{{ 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 30
+set g_balance_porto_primary_lifetime 5
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 2 // hook monkeys set 0
+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 3 // fuel per second hooked
+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_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_hlac_primary_spread_add 0.0045
set g_balance_hlac_primary_spread_crouchmod 0.25
-set g_balance_hlac_primary_damage 23
+set g_balance_hlac_primary_damage 20
set g_balance_hlac_primary_edgedamage 10
set g_balance_hlac_primary_force 100
set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_speed 12000
set g_balance_hlac_primary_lifetime 5
-set g_balance_hlac_primary_refire 0.1
+set g_balance_hlac_primary_refire 0.15
set g_balance_hlac_primary_animtime 0.4
set g_balance_hlac_primary_ammo 1
set g_balance_hlac_secondary_spread 0.15
set g_balance_hlac_secondary_spread_crouchmod 0.5
-set g_balance_hlac_secondary_damage 23
+set g_balance_hlac_secondary_damage 20
set g_balance_hlac_secondary_edgedamage 10
set g_balance_hlac_secondary_force 100
set g_balance_hlac_secondary_radius 70
set g_balance_hlac_secondary_ammo 10
set g_balance_hlac_secondary_shots 6
// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 0
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_campingrifle_primary_tracer 0
-set g_balance_campingrifle_primary_damage 50
-set g_balance_campingrifle_primary_headshotaddeddamage 50
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 50
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.7
-set g_balance_campingrifle_primary_animtime 0.3
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_campingrifle_primary_bullethail 0
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 15
-set g_balance_campingrifle_secondary_headshotaddeddamage 25
-set g_balance_campingrifle_secondary_spread 0.02
-set g_balance_campingrifle_secondary_force 30
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.1
-set g_balance_campingrifle_secondary_animtime 0.1
-set g_balance_campingrifle_secondary_ammo 4
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_campingrifle_secondary_burstcost 0.35
-set g_balance_campingrifle_secondary_bullethail 0
+// {{{ sniperrifle
+set g_balance_sniperrifle_magazinecapacity 8 // make it pretty much useless in close combat
+set g_balance_sniperrifle_reloadtime 2 // matches reload anim
+set g_balance_sniperrifle_auto_reload_on_switch 0
+set g_balance_sniperrifle_bursttime 0
+set g_balance_sniperrifle_primary_tracer 1
+set g_balance_sniperrifle_primary_damage 50
+set g_balance_sniperrifle_primary_headshotaddeddamage 50
+set g_balance_sniperrifle_primary_spread 0
+set g_balance_sniperrifle_primary_force 100
+set g_balance_sniperrifle_primary_speed 40000
+set g_balance_sniperrifle_primary_lifetime 5
+set g_balance_sniperrifle_primary_refire 1.25
+set g_balance_sniperrifle_primary_animtime 0.5
+set g_balance_sniperrifle_primary_ammo 10
+set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_sniperrifle_primary_burstcost 0
+set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_secondary 0 // Nex and sniper rifle should never be on the same map, so this (zoom on secondary) is okay
+set g_balance_sniperrifle_secondary_reload 0
+set g_balance_sniperrifle_secondary_tracer 0
+set g_balance_sniperrifle_secondary_damage 25
+set g_balance_sniperrifle_secondary_headshotaddeddamage 35
+set g_balance_sniperrifle_secondary_spread 0.01
+set g_balance_sniperrifle_secondary_force 50
+set g_balance_sniperrifle_secondary_speed 20000
+set g_balance_sniperrifle_secondary_lifetime 5
+set g_balance_sniperrifle_secondary_refire 0.6
+set g_balance_sniperrifle_secondary_animtime 0.3
+set g_balance_sniperrifle_secondary_ammo 10
+set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
// {{{ seeker
set g_balance_seeker_flac_ammo 0.5
set g_balance_seeker_flac_animtime 0.1
-set g_balance_seeker_flac_damage 15
-set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_damage 16
+set g_balance_seeker_flac_edgedamage 8
set g_balance_seeker_flac_force 50
-set g_balance_seeker_flac_lifetime 0.1
-set g_balance_seeker_flac_lifetime_rand 0.05
-set g_balance_seeker_flac_radius 100
-set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_lifetime 0.05
+set g_balance_seeker_flac_lifetime_rand 0.01
+set g_balance_seeker_flac_radius 70
+set g_balance_seeker_flac_refire 0.15
set g_balance_seeker_flac_speed 3000
-set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_up 0
set g_balance_seeker_flac_speed_z 0
-set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_flac_spread 0.05
+set g_balance_seeker_missile_accel 3000
set g_balance_seeker_missile_ammo 2
set g_balance_seeker_missile_animtime 0.3
set g_balance_seeker_missile_count 4
set g_balance_seeker_missile_damage 40
set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_decel 6000
set g_balance_seeker_missile_delay 0.25
set g_balance_seeker_missile_edgedamage 10
set g_balance_seeker_missile_force 250
set g_balance_seeker_missile_smart_trace_max 2500
set g_balance_seeker_missile_smart_trace_min 1000
set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
set g_balance_seeker_missile_speed_up 300
set g_balance_seeker_missile_speed_z 0
set g_balance_seeker_missile_speed_max 1250
+++ /dev/null
-// {{{ 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_minelayer -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_hlac -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_campingrifle -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_start_weapon_seeker -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 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 250
-set g_lms_start_ammo_rockets 100
-set g_lms_start_ammo_cells 200
-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 200
-set g_pickup_fuel 25
-set g_pickup_fuel_weapon 15
-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 5
-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_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 2.5
-set g_balance_pause_health_rot 4
-set g_balance_pause_health_rot_spawn 8
-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 2.5
-set g_balance_pause_armor_rot 4
-set g_balance_pause_armor_rot_spawn 8
-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 4
-set g_balance_pause_fuel_rot_spawn 8
-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_balance_weaponswitchdelay 0.15
-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.5
-set g_throughfloor_force 0.7
-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)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-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.02 // maxspeed = minspeed + maxdamage / factor = 4550
-set g_balance_falldamage_maxdamage 75
-// }}}
-
-// {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.3
-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
-// }}}
-
-// {{{ 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
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-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 200 // 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 4000
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.6
-set g_balance_laser_primary_animtime 0.6
-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_gauntlet 0
-set g_balance_laser_primary_force_zscale 1.35 // 270 upforce
-set g_balance_laser_primary_force_velocitybias 0.25
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-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_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1
-set g_balance_laser_secondary_force_velocitybias 0.25
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 10
-set g_balance_shotgun_primary_damage 5
-set g_balance_shotgun_primary_force 60
-set g_balance_shotgun_primary_spread 0.07
-set g_balance_shotgun_primary_refire 0.8
-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.35 // match the anim
-set g_balance_shotgun_secondary_melee_range 85
-set g_balance_shotgun_secondary_melee_swing 50
-set g_balance_shotgun_secondary_melee_time 0.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
-// }}}
-// {{{ uzi
-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.3
-set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 15
-set g_balance_uzi_sustained_force 10
-set g_balance_uzi_sustained_spread 0.08
-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
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 60
-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_lifetime2 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
-// }}}
-// {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
-set g_balance_minelayer_edgedamage 30
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.4
-set g_balance_minelayer_ammo 5
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 4 // 0 disables the limit
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // 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_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 110
-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.03333333
-set g_balance_electro_primary_ammo 7
-set g_balance_electro_primary_range 800
-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 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 500
-set g_balance_electro_secondary_speed_up 150
-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.1
-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_count 3
-set g_balance_electro_combo_damage 60
-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
-// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 5
-set g_balance_crylink_primary_edgedamage 2.5
-set g_balance_crylink_primary_force 25
-set g_balance_crylink_primary_radius 50
-set g_balance_crylink_primary_speed 2500
-set g_balance_crylink_primary_spread 0.04
-set g_balance_crylink_primary_shots 12
-set g_balance_crylink_primary_bounces 1
-set g_balance_crylink_primary_refire 1
-set g_balance_crylink_primary_animtime 0.4
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joinspeed 150
-
-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 2
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -20
-set g_balance_crylink_secondary_radius 5
-set g_balance_crylink_secondary_speed 1600
-set g_balance_crylink_secondary_spread 0.03
-set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.15
-set g_balance_crylink_secondary_animtime 0.15
-set g_balance_crylink_secondary_ammo 1
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joinspeed 150
-
-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 2
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 100
-set g_balance_nex_primary_force 600
-set g_balance_nex_primary_refire 0.75
-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 1
-set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.7
-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 1
-set g_balance_nex_charge_mindmg 10
-set g_balance_nex_charge_start 0
-set g_balance_nex_charge_rate 0.35
-set g_balance_nex_charge_limit 0.5
-set g_balance_nex_charge_rot_rate 0
-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 1000
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 50
-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_damage 30
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 50
-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
-// }}}
-// {{{ rocketlauncher // TODO
-set g_balance_rocketlauncher_damage 110
-set g_balance_rocketlauncher_edgedamage 25
-set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 125
-set g_balance_rocketlauncher_speed 1000
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
-set g_balance_rocketlauncher_lifetime 5
-set g_balance_rocketlauncher_refire 1
-set g_balance_rocketlauncher_animtime 0.4
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 10
-set g_balance_rocketlauncher_damageforcescale 0
-set g_balance_rocketlauncher_detonatedelay -1 // 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 45 // 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 90
-set g_balance_rocketlauncher_remote_edgedamage 20
-set g_balance_rocketlauncher_remote_radius 125
-set g_balance_rocketlauncher_remote_force 350
-// }}}
-// {{{ 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_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
-// }}}
-// {{{ hlac
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.6
-set g_balance_hlac_primary_spread_add 0.01
-set g_balance_hlac_primary_spread_crouchmod 0.5
-
-set g_balance_hlac_primary_damage 22
-set g_balance_hlac_primary_edgedamage 2
-set g_balance_hlac_primary_force -100
-set g_balance_hlac_primary_radius 100
-set g_balance_hlac_primary_speed 5000
-set g_balance_hlac_primary_lifetime 3
-
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.4
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.2
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 3
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 50
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 3
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.7
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
-// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8 // make it pretty much useless in close combat
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0
-set g_balance_campingrifle_primary_tracer 1
-set g_balance_campingrifle_primary_damage 75
-set g_balance_campingrifle_primary_headshotaddeddamage 75
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 40000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 1.5
-set g_balance_campingrifle_primary_animtime 0.6
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_campingrifle_primary_burstcost 0
-set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 50
-set g_balance_campingrifle_secondary_headshotaddeddamage 50 // 50 damage only on head
-set g_balance_campingrifle_secondary_spread 0
-set g_balance_campingrifle_secondary_force 2
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 1.5
-set g_balance_campingrifle_secondary_animtime 0.6
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_campingrifle_secondary_burstcost 0
-set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
-// }}}
-// {{{ 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
-// }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 40
-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_ammo 5
-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
-// }}}
-// {{{ seeker
-set g_balance_seeker_flac_ammo 0.5
-set g_balance_seeker_flac_animtime 0.1
-set g_balance_seeker_flac_damage 15
-set g_balance_seeker_flac_edgedamage 10
-set g_balance_seeker_flac_force 50
-set g_balance_seeker_flac_lifetime 0.05
-set g_balance_seeker_flac_lifetime_rand 0.02
-set g_balance_seeker_flac_radius 100
-set g_balance_seeker_flac_refire 0.1
-set g_balance_seeker_flac_speed 5000
-set g_balance_seeker_flac_speed_up 500
-set g_balance_seeker_flac_speed_z 0
-set g_balance_seeker_flac_spread 0.25
-set g_balance_seeker_missile_accel 1.05
-set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.3
-set g_balance_seeker_missile_count 4
-set g_balance_seeker_missile_damage 40
-set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
-set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_edgedamage 10
-set g_balance_seeker_missile_force 250
-set g_balance_seeker_missile_health 5
-set g_balance_seeker_missile_lifetime 15
-set g_balance_seeker_missile_proxy 0
-set g_balance_seeker_missile_proxy_delay 0.2
-set g_balance_seeker_missile_proxy_maxrange 45
-set g_balance_seeker_missile_radius 80
-set g_balance_seeker_missile_refire 0.5
-set g_balance_seeker_missile_smart 1
-set g_balance_seeker_missile_smart_mindist 800
-set g_balance_seeker_missile_smart_trace_max 2500
-set g_balance_seeker_missile_smart_trace_min 1000
-set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
-set g_balance_seeker_missile_speed_up 300
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1250
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.3
-set g_balance_seeker_tag_damageforcescale 4
-set g_balance_seeker_tag_health 5
-set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.7
-set g_balance_seeker_tag_speed 9000
-set g_balance_seeker_tag_spread 0
-// End new seeker
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_hlac -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_campingrifle -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_sniperrifle -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_start_weapon_seeker -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_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 250
+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 250
-set g_lms_start_ammo_rockets 100
-set g_lms_start_ammo_cells 200
+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_pickup_fuel_jetpack 50
set g_pickup_fuel_max 100
set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 250
+set g_pickup_armorsmall_max 150
set g_pickup_armorsmall_anyway 1
set g_pickup_armormedium 25
-set g_pickup_armormedium_max 250
-set g_pickup_armormedium_anyway 1
+set g_pickup_armormedium_max 50
+set g_pickup_armormedium_anyway 0
set g_pickup_armorbig 50
-set g_pickup_armorbig_max 250
-set g_pickup_armorbig_anyway 1
+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 250
+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 150
+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_respawntime_medium 20
set g_pickup_respawntime_long 30
set g_pickup_respawntime_powerup 120
-set g_pickup_respawntime_weapon 5
+set g_pickup_respawntime_weapon 10
set g_pickup_respawntime_ammo 25
set g_pickup_respawntimejitter_short 0
set g_pickup_respawntimejitter_medium 0
// {{{ misc
set g_balance_selfdamagepercent 0.65
-set g_balance_weaponswitchdelay 0.1
+set g_balance_weaponswitchdelay 0.15
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_weaponspreadfactor 1 "weapon spread multiplier"
set g_balance_firetransfer_time 0.9
set g_balance_firetransfer_damage 0.8
-set g_throughfloor_damage 0.5
-set g_throughfloor_force 0.7
+set g_throughfloor_damage 0.7
+set g_throughfloor_force 0.8
set g_projectiles_newton_style 2
// possible values:
// 0: absolute velocity projectiles (like Quake)
// }}}
// {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.3
+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_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 4000
+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.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_gauntlet 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 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 200 // dps
set g_balance_laser_secondary_edgedamage 0
set g_balance_laser_secondary_gauntlet 1
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
// }}}
// {{{ shotgun
-set g_balance_shotgun_primary_bullets 20
-set g_balance_shotgun_primary_damage 3
+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
+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.4
+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_animtime 1
// }}}
// {{{ 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 18
-set g_balance_uzi_first_force 35
+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 10
-set g_balance_uzi_sustained_force 7.5
-set g_balance_uzi_sustained_spread 0.1
+
+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
// }}}
-// {{{ mortar // TODO
+// {{{ 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_damage 44
+set g_balance_grenadelauncher_primary_edgedamage 32
set g_balance_grenadelauncher_primary_force 300
-set g_balance_grenadelauncher_primary_radius 100
-set g_balance_grenadelauncher_primary_speed 1200
+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.4
+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 70
+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 1200
-set g_balance_grenadelauncher_secondary_speed_up 225
+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_lifetime2 0.65
set g_balance_grenadelauncher_secondary_refire 0.8
-set g_balance_grenadelauncher_secondary_animtime 0.4
+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_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.12
// }}}
-// {{{ minelayer // TODO
-set g_balance_minelayer_damage 35
+// {{{ minelayer
+set g_balance_minelayer_damage 42
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_radius 175
set g_balance_minelayer_proximityradius 150
set g_balance_minelayer_speed 750
set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_lifetime_countdown 0
set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.4
+set g_balance_minelayer_animtime 0.3
set g_balance_minelayer_ammo 5
set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 4 // 0 disables the limit
+set g_balance_minelayer_limit 3 // 0 disables the limit // LOG: 4 -> 3
set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
set g_balance_minelayer_damageforcescale 0
set g_balance_minelayer_detonatedelay -1 // 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_minelayer_remote_radius 200
set g_balance_minelayer_remote_force 300
// }}}
-// {{{ electro // TODO
+// {{{ electro
set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 90
+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 75
+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.03333333
-set g_balance_electro_primary_ammo 7
+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 255 // 0.3 * radius
-set g_balance_electro_primary_falloff_maxdist 850
-set g_balance_electro_primary_falloff_halflifedist 425
+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_health 10
set g_balance_electro_secondary_damageforcescale 4
set g_balance_electro_secondary_count 3
-set g_balance_electro_combo_damage 40
+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_speed 400
// }}}
// {{{ crylink
-set g_balance_crylink_primary_damage 8
-set g_balance_crylink_primary_edgedamage 6
-set g_balance_crylink_primary_force 40
+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 1200
-set g_balance_crylink_primary_spread 0.1
+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.4
+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_joinspeed 150
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_jointime 0.1
+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_fadetime 0.25
set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 2
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -20
-set g_balance_crylink_secondary_radius 5
-set g_balance_crylink_secondary_speed 1600
-set g_balance_crylink_secondary_spread 0.03
-set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.15
-set g_balance_crylink_secondary_animtime 0.15
-set g_balance_crylink_secondary_ammo 1
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joinspeed 0
+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_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_jointime 0.1
+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 2
+set g_balance_crylink_secondary_line_fadetime 0.25
// }}}
// {{{ nex
-set g_balance_nex_primary_damage 100
+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.75
+set g_balance_nex_primary_animtime 0.3
set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 1000
-set g_balance_nex_primary_damagefalloff_maxdist 3000
-set g_balance_nex_primary_damagefalloff_halflife 1000
-set g_balance_nex_primary_damagefalloff_forcehalflife 2000
+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 1
-set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.1
+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 2
+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 40
+set g_balance_nex_charge_mindmg 20
set g_balance_nex_charge_start 0.5
-set g_balance_nex_charge_rate 0.05
-set g_balance_nex_charge_limit 0.5
-set g_balance_nex_charge_rot_rate 0.01
-set g_balance_nex_charge_shot_multiplier 0.675
-set g_balance_nex_charge_velocity_rate 0.15
-set g_balance_nex_charge_minspeed 400
+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
// }}}
// {{{ minstanex
-set g_balance_minstanex_refire 1.25
-set g_balance_minstanex_animtime 1
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 0.50
set g_balance_minstanex_ammo 10
// }}}
// {{{ hagar
-set g_balance_hagar_primary_damage 12
+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_radius 125
+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_damage 12
+set g_balance_hagar_secondary_damage 14
set g_balance_hagar_secondary_edgedamage 6
set g_balance_hagar_secondary_force 70
-set g_balance_hagar_secondary_radius 135
+set g_balance_hagar_secondary_radius 125
set g_balance_hagar_secondary_spread 0.15
set g_balance_hagar_secondary_speed 1800
set g_balance_hagar_secondary_lifetime_min 5
set g_balance_hagar_secondary_refire 0.12
set g_balance_hagar_secondary_ammo 1
// }}}
-// {{{ rocketlauncher // TODO
-set g_balance_rocketlauncher_damage 90
-set g_balance_rocketlauncher_edgedamage 33
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 82
+set g_balance_rocketlauncher_edgedamage 32
set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 125
-set g_balance_rocketlauncher_speed 1000
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
+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.4
+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 45 // max degrees per second
+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 50
-set g_balance_rocketlauncher_remote_edgedamage 16.5
+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
// }}}
// {{{ porto
set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.3
+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_portal_health 200 // 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_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_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_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_hlac_primary_spread_crouchmod 0.25
set g_balance_hlac_primary_damage 15
-set g_balance_hlac_primary_edgedamage 5
+set g_balance_hlac_primary_edgedamage 10
set g_balance_hlac_primary_force 70
-set g_balance_hlac_primary_radius 30
-set g_balance_hlac_primary_speed 2500
+set g_balance_hlac_primary_radius 40
+set g_balance_hlac_primary_speed 9000
set g_balance_hlac_primary_lifetime 5
set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.3
+set g_balance_hlac_primary_animtime 0.2
set g_balance_hlac_primary_ammo 1
set g_balance_hlac_secondary 1
set g_balance_hlac_secondary_spread_crouchmod 0.5
set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 5
+set g_balance_hlac_secondary_edgedamage 13
set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 35
-set g_balance_hlac_secondary_speed 2500
+set g_balance_hlac_secondary_radius 45
+set g_balance_hlac_secondary_speed 9000
set g_balance_hlac_secondary_lifetime 5
set g_balance_hlac_secondary_refire 0.8
-set g_balance_hlac_secondary_animtime 0.6
+set g_balance_hlac_secondary_animtime 0.4
set g_balance_hlac_secondary_ammo 4
set g_balance_hlac_secondary_shots 6
// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8 // make it pretty much useless in close combat
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0
-set g_balance_campingrifle_primary_tracer 1
-set g_balance_campingrifle_primary_damage 75
-set g_balance_campingrifle_primary_headshotaddeddamage 125
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 40000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 1.5
-set g_balance_campingrifle_primary_animtime 1.4
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_campingrifle_primary_burstcost 0
-set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 50
-set g_balance_campingrifle_secondary_headshotaddeddamage 75
-set g_balance_campingrifle_secondary_spread 0
-set g_balance_campingrifle_secondary_force 2
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 1.5
-set g_balance_campingrifle_secondary_animtime 1.4
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_campingrifle_secondary_burstcost 0
-set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
+// {{{ sniperrifle
+set g_balance_sniperrifle_magazinecapacity 8 // make it pretty much useless in close combat
+set g_balance_sniperrifle_reloadtime 2 // matches reload anim
+set g_balance_sniperrifle_auto_reload_on_switch 0
+set g_balance_sniperrifle_bursttime 0
+set g_balance_sniperrifle_primary_tracer 1
+set g_balance_sniperrifle_primary_damage 60
+set g_balance_sniperrifle_primary_headshotaddeddamage 60
+set g_balance_sniperrifle_primary_spread 0
+set g_balance_sniperrifle_primary_force 2
+set g_balance_sniperrifle_primary_speed 40000
+set g_balance_sniperrifle_primary_lifetime 5
+set g_balance_sniperrifle_primary_refire 1.5
+set g_balance_sniperrifle_primary_animtime 1.4
+set g_balance_sniperrifle_primary_ammo 10
+set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_sniperrifle_primary_burstcost 0
+set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_secondary 1
+set g_balance_sniperrifle_secondary_reload 1
+set g_balance_sniperrifle_secondary_tracer 0
+set g_balance_sniperrifle_secondary_damage 42
+set g_balance_sniperrifle_secondary_headshotaddeddamage 42
+set g_balance_sniperrifle_secondary_spread 0
+set g_balance_sniperrifle_secondary_force 2
+set g_balance_sniperrifle_secondary_speed 20000
+set g_balance_sniperrifle_secondary_lifetime 5
+set g_balance_sniperrifle_secondary_refire 1.5
+set g_balance_sniperrifle_secondary_animtime 1.4
+set g_balance_sniperrifle_secondary_ammo 10
+set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
// }}}
// {{{ fireball
set g_balance_fireball_primary_ammo 40
-set g_balance_fireball_primary_animtime 0.15
+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_speed 650
set g_balance_fireball_primary_spread 0
set g_balance_fireball_secondary_ammo 5
-set g_balance_fireball_secondary_animtime 0.3
+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_seeker_flac_speed_up 1000
set g_balance_seeker_flac_speed_z 0
set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_accel 1400
set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.3
-set g_balance_seeker_missile_count 8
-set g_balance_seeker_missile_damage 15
+set g_balance_seeker_missile_animtime 0.2
+set g_balance_seeker_missile_count 3 // LOG: 8 -> 3
+set g_balance_seeker_missile_damage 30 // LOG: 15 -> 30
set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_decel 1400
set g_balance_seeker_missile_delay 0.25
set g_balance_seeker_missile_edgedamage 10
-set g_balance_seeker_missile_force 250
+set g_balance_seeker_missile_force 150 // LOG: 100 -> 150
set g_balance_seeker_missile_health 5
set g_balance_seeker_missile_lifetime 15
set g_balance_seeker_missile_proxy 0
set g_balance_seeker_missile_smart_trace_max 2500
set g_balance_seeker_missile_smart_trace_min 1000
set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
set g_balance_seeker_missile_speed_up 300
set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_speed_max 1300 // LOG: 1400 -> 1300
set g_balance_seeker_missile_spread 0
set g_balance_seeker_missile_turnrate 0.65
set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.3
+set g_balance_seeker_tag_animtime 0.2
set g_balance_seeker_tag_damageforcescale 4
set g_balance_seeker_tag_health 5
set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.7
-set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 0.75
+set g_balance_seeker_tag_speed 5000
set g_balance_seeker_tag_spread 0
// End new seeker
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_hlac -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_campingrifle -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_sniperrifle -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_start_weapon_seeker -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_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_shells_max 50
+set g_pickup_nails 60
set g_pickup_nails_weapon 60
set g_pickup_nails_max 300
set g_pickup_rockets 25
set g_pickup_rockets_max 150
set g_pickup_cells 30
set g_pickup_cells_weapon 20
-set g_pickup_cells_max 200
+set g_pickup_cells_max 300
set g_pickup_fuel 25
set g_pickup_fuel_weapon 15
set g_pickup_fuel_jetpack 50
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_max 100
set g_pickup_armormedium_anyway 0
set g_pickup_armorbig 50
-set g_pickup_armorbig_max 999
+set g_pickup_armorbig_max 150
set g_pickup_armorbig_anyway 0
set g_pickup_armorlarge 100
set g_pickup_armorlarge_max 999
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_max 100
set g_pickup_healthmedium_anyway 0
set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 999
+set g_pickup_healthlarge_max 150
set g_pickup_healthlarge_anyway 0
set g_pickup_healthmega 100
set g_pickup_healthmega_max 999
set g_pickup_respawntime_medium 20
set g_pickup_respawntime_long 30
set g_pickup_respawntime_powerup 120
-set g_pickup_respawntime_weapon 5
-set g_pickup_respawntime_ammo 25
+set g_pickup_respawntime_weapon 20
+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_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_rotlinear 2.5
+set g_balance_pause_health_rot 4
+set g_balance_pause_health_rot_spawn 8
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_rotlinear 2.5
+set g_balance_pause_armor_rot 4
+set g_balance_pause_armor_rot_spawn 8
set g_balance_armor_regenstable 100
set g_balance_armor_rotstable 100
set g_balance_armor_limit 999
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_pause_fuel_rot 4
+set g_balance_pause_fuel_rot_spawn 8
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_balance_selfdamagepercent 0.6
set g_balance_weaponswitchdelay 0.15
set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
set g_weaponratefactor 1 "weapon fire rate multiplier"
// 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_falldamage_factor 0.02 // maxspeed = minspeed + maxdamage / factor = 4550
+set g_balance_falldamage_maxdamage 75
// }}}
// {{{ powerups
set g_balance_powerup_invincible_takedamage 0.3
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_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
// {{{ weapon properties
// {{{ laser
-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 270
+set g_balance_laser_primary_damage 20
+set g_balance_laser_primary_edgedamage 10
+set g_balance_laser_primary_force 230
set g_balance_laser_primary_radius 60
-set g_balance_laser_primary_speed 4000
+set g_balance_laser_primary_speed 9000
set g_balance_laser_primary_spread 0
set g_balance_laser_primary_refire 0.6
set g_balance_laser_primary_animtime 0.6
set g_balance_laser_primary_shotangle 0
set g_balance_laser_primary_delay 0
set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1
+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 0 // when 1, a secondary laser mode exists
set g_balance_laser_secondary_damage 35
set g_balance_laser_secondary_edgedamage 10
set g_balance_laser_secondary_gauntlet 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
// }}}
// {{{ shotgun
set g_balance_shotgun_primary_bullets 10
set g_balance_shotgun_primary_damage 5
-set g_balance_shotgun_primary_force 60
+set g_balance_shotgun_primary_force 5
set g_balance_shotgun_primary_spread 0.07
set g_balance_shotgun_primary_refire 0.8
set g_balance_shotgun_primary_animtime 0.2
set g_balance_shotgun_secondary_animtime 1
// }}}
// {{{ 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.6
+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.4
+set g_balance_uzi_burst_refire 0.05 // refire between burst bullets
+set g_balance_uzi_burst_refire2 0.4 // refire after burst
+set g_balance_uzi_burst_spread 0.03
+set g_balance_uzi_burst_damage 18 // 90 dps (but 90 dmg deliverd in .25s)
+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.3
+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 10
-set g_balance_uzi_sustained_spread 0.08
+
+set g_balance_uzi_sustained_damage 14 // 120 dps
+set g_balance_uzi_sustained_force 12
+set g_balance_uzi_sustained_spread 0.02
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
// }}}
// {{{ mortar
set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 60
-set g_balance_grenadelauncher_primary_edgedamage 38
-set g_balance_grenadelauncher_primary_force 400
+set g_balance_grenadelauncher_primary_damage 50
+set g_balance_grenadelauncher_primary_edgedamage 30
+set g_balance_grenadelauncher_primary_force 250
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_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_damage 60
+set g_balance_grenadelauncher_secondary_edgedamage 35
+set g_balance_grenadelauncher_secondary_force 300
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_bouncefactor 0.5
set g_balance_grenadelauncher_bouncestop 0.075
// }}}
-// {{{ minelayer // TODO
+// {{{ minelayer
set g_balance_minelayer_damage 35
set g_balance_minelayer_edgedamage 30
set g_balance_minelayer_force 250
set g_balance_minelayer_proximityradius 150
set g_balance_minelayer_speed 750
set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_lifetime_countdown 0
set g_balance_minelayer_refire 1.5
set g_balance_minelayer_animtime 0.4
set g_balance_minelayer_ammo 5
set g_balance_minelayer_remote_force 300
// }}}
// {{{ electro
-set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 110
+set g_balance_electro_lightning 0
+set g_balance_electro_primary_damage 35
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_force 150
+set g_balance_electro_primary_force_up 0
+set g_balance_electro_primary_radius 155
+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 0
-set g_balance_electro_primary_refire 0.4
-set g_balance_electro_primary_animtime 0.03333333
-set g_balance_electro_primary_ammo 7
-set g_balance_electro_primary_range 800
+set g_balance_electro_primary_lifetime 30
+set g_balance_electro_primary_refire 0.65
+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 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 500
+set g_balance_electro_secondary_force 50
+set g_balance_electro_secondary_radius 25
+set g_balance_electro_secondary_speed 750
set g_balance_electro_secondary_speed_up 150
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_spread 0.025
+set g_balance_electro_secondary_lifetime 5
set g_balance_electro_secondary_refire 0.1
set g_balance_electro_secondary_refire2 2
-set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_animtime 0.15
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_damageforcescale 2
set g_balance_electro_secondary_count 3
-set g_balance_electro_combo_damage 60
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 80
+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 10
+set g_balance_electro_combo_force 150
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_speed 1000
// }}}
// {{{ crylink
set g_balance_crylink_primary_damage 5
-set g_balance_crylink_primary_edgedamage 2.5
-set g_balance_crylink_primary_force 25
-set g_balance_crylink_primary_radius 50
-set g_balance_crylink_primary_speed 2500
-set g_balance_crylink_primary_spread 0.04
-set g_balance_crylink_primary_shots 12
+set g_balance_crylink_primary_edgedamage 3
+set g_balance_crylink_primary_force 10
+set g_balance_crylink_primary_radius 15
+set g_balance_crylink_primary_speed 1500
+set g_balance_crylink_primary_spread 0.1
+set g_balance_crylink_primary_shots 8
set g_balance_crylink_primary_bounces 1
set g_balance_crylink_primary_refire 1
set g_balance_crylink_primary_animtime 0.4
set g_balance_crylink_primary_ammo 2
set g_balance_crylink_primary_bouncedamagefactor 0.2
-set g_balance_crylink_primary_joinspeed 0
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0.1
+set g_balance_crylink_primary_jointime 0
+set g_balance_crylink_primary_joinexplode 1 //if != 0 do a extra damage pass when projectiles join
+set g_balance_crylink_primary_joinexplode_damage 100 //Max demage (Determined by % of _primary_shots that joins)
+set g_balance_crylink_primary_joinexplode_edgedamage 20
+set g_balance_crylink_primary_joinexplode_radius 200
+set g_balance_crylink_primary_joinexplode_force 400
+set g_balance_crylink_primary_linkexplode 0
-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_middle_lifetime 5
+set g_balance_crylink_primary_middle_fadetime 0.25
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_animtime 0.15
set g_balance_crylink_secondary_ammo 1
set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joinspeed 0
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_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_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
// {{{ nex
set g_balance_nex_primary_damage 100
set g_balance_nex_primary_force 600
-set g_balance_nex_primary_refire 0.75
+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_secondary 1
set g_balance_nex_secondary_charge 1
-set g_balance_nex_secondary_charge_rate 0.7
+set g_balance_nex_secondary_charge_rate 0.55
+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_charge_mindmg 10
set g_balance_nex_charge_start 0
set g_balance_nex_charge_rate 0.35
+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_rate 0.1
+set g_balance_nex_charge_rot_pause 1 // 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_minstanex_ammo 10
// }}}
// {{{ hagar
-set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 50
-set g_balance_hagar_primary_radius 65
+set g_balance_hagar_primary_damage 25
+set g_balance_hagar_primary_edgedamage 5
+set g_balance_hagar_primary_force 70
+set g_balance_hagar_primary_radius 60
set g_balance_hagar_primary_spread 0.010
-set g_balance_hagar_primary_speed 3000
+set g_balance_hagar_primary_speed 2500
set g_balance_hagar_primary_lifetime 30
-set g_balance_hagar_primary_refire 0.15
+set g_balance_hagar_primary_refire 0.2
set g_balance_hagar_primary_ammo 1
set g_balance_hagar_secondary 1
set g_balance_hagar_secondary_damage 30
set g_balance_hagar_secondary_refire 0.15
set g_balance_hagar_secondary_ammo 1
// }}}
-// {{{ rocketlauncher // TODO
-set g_balance_rocketlauncher_damage 110
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 120
set g_balance_rocketlauncher_edgedamage 25
set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 125
-set g_balance_rocketlauncher_speed 1000
+set g_balance_rocketlauncher_radius 130
+set g_balance_rocketlauncher_speed 900
set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
-set g_balance_rocketlauncher_lifetime 5
-set g_balance_rocketlauncher_refire 1
+set g_balance_rocketlauncher_speedstart 900
+set g_balance_rocketlauncher_lifetime 9
+set g_balance_rocketlauncher_refire 1.2
set g_balance_rocketlauncher_animtime 0.4
set g_balance_rocketlauncher_ammo 3
set g_balance_rocketlauncher_health 10
set g_balance_rocketlauncher_damageforcescale 0
set g_balance_rocketlauncher_detonatedelay -1 // 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 45 // max degrees per second
+set g_balance_rocketlauncher_guiderate 25 // 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_hlac_primary_edgedamage 2
set g_balance_hlac_primary_force -100
set g_balance_hlac_primary_radius 100
-set g_balance_hlac_primary_speed 5000
+set g_balance_hlac_primary_speed 15000
set g_balance_hlac_primary_lifetime 3
set g_balance_hlac_primary_refire 0.1
set g_balance_hlac_secondary_edgedamage 3
set g_balance_hlac_secondary_force 100
set g_balance_hlac_secondary_radius 50
-set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_speed 15000
set g_balance_hlac_secondary_lifetime 3
+
set g_balance_hlac_secondary_refire 1
set g_balance_hlac_secondary_animtime 0.7
set g_balance_hlac_secondary_ammo 10
set g_balance_hlac_secondary_shots 6
// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 8 // make it pretty much useless in close combat
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0
-set g_balance_campingrifle_primary_tracer 1
-set g_balance_campingrifle_primary_damage 75
-set g_balance_campingrifle_primary_headshotaddeddamage 75
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 2
-set g_balance_campingrifle_primary_speed 40000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 1.5
-set g_balance_campingrifle_primary_animtime 0.6
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_campingrifle_primary_burstcost 0
-set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_campingrifle_secondary 1
-set g_balance_campingrifle_secondary_tracer 0
-set g_balance_campingrifle_secondary_damage 50
-set g_balance_campingrifle_secondary_headshotaddeddamage 50 // 50 damage only on head
-set g_balance_campingrifle_secondary_spread 0
-set g_balance_campingrifle_secondary_force 2
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 1.5
-set g_balance_campingrifle_secondary_animtime 0.6
-set g_balance_campingrifle_secondary_ammo 10
-set g_balance_campingrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_campingrifle_secondary_burstcost 0
-set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
+// {{{ sniperrifle
+set g_balance_sniperrifle_magazinecapacity 8 // make it pretty much useless in close combat
+set g_balance_sniperrifle_reloadtime 2 // matches reload anim
+set g_balance_sniperrifle_auto_reload_on_switch 0
+set g_balance_sniperrifle_bursttime 0
+set g_balance_sniperrifle_primary_tracer 1
+set g_balance_sniperrifle_primary_damage 40
+set g_balance_sniperrifle_primary_headshotaddeddamage 100
+set g_balance_sniperrifle_primary_spread 0
+set g_balance_sniperrifle_primary_force 2
+set g_balance_sniperrifle_primary_speed 40000
+set g_balance_sniperrifle_primary_lifetime 5
+set g_balance_sniperrifle_primary_refire 0.65
+set g_balance_sniperrifle_primary_animtime 0.6
+set g_balance_sniperrifle_primary_ammo 10
+set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_sniperrifle_primary_burstcost 0
+set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_sniperrifle_secondary 1
+set g_balance_sniperrifle_secondary_reload 0
+set g_balance_sniperrifle_secondary_tracer 0
+set g_balance_sniperrifle_secondary_damage 50
+set g_balance_sniperrifle_secondary_headshotaddeddamage 50 // 50 damage only on head
+set g_balance_sniperrifle_secondary_spread 0
+set g_balance_sniperrifle_secondary_force 2
+set g_balance_sniperrifle_secondary_speed 20000
+set g_balance_sniperrifle_secondary_lifetime 5
+set g_balance_sniperrifle_secondary_refire 1.5
+set g_balance_sniperrifle_secondary_animtime 0.6
+set g_balance_sniperrifle_secondary_ammo 10
+set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_sniperrifle_secondary_burstcost 0
+set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
// {{{ fireball
set g_balance_fireball_primary_ammo 40
set g_balance_fireball_primary_animtime 0.15
-set g_balance_fireball_primary_bfgdamage 100
+set g_balance_fireball_primary_bfgdamage 150
set g_balance_fireball_primary_bfgforce 0
set g_balance_fireball_primary_bfgradius 1000
set g_balance_fireball_primary_damage 200
set g_balance_seeker_flac_speed_up 500
set g_balance_seeker_flac_speed_z 0
set g_balance_seeker_flac_spread 0.25
-
-set g_balance_seeker_missile_accel 1.05
+set g_balance_seeker_missile_accel 1400
set g_balance_seeker_missile_ammo 2
set g_balance_seeker_missile_animtime 0.3
set g_balance_seeker_missile_count 4
-set g_balance_seeker_missile_damage 40
-set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_damage 50
+set g_balance_seeker_missile_damageforcescale 2
+set g_balance_seeker_missile_decel 1400
set g_balance_seeker_missile_delay 0.25
set g_balance_seeker_missile_edgedamage 10
set g_balance_seeker_missile_force 250
set g_balance_seeker_missile_smart_trace_max 2500
set g_balance_seeker_missile_smart_trace_min 1000
set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_accel 0
set g_balance_seeker_missile_speed_up 300
set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1250
+set g_balance_seeker_missile_speed_max 1400
set g_balance_seeker_missile_spread 0
set g_balance_seeker_missile_turnrate 0.65
-
set g_balance_seeker_tag_ammo 1
set g_balance_seeker_tag_animtime 0.3
set g_balance_seeker_tag_damageforcescale 4
set g_balance_seeker_tag_health 5
set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.7
+set g_balance_seeker_tag_refire 1
set g_balance_seeker_tag_speed 9000
set g_balance_seeker_tag_spread 0
// End new seeker
--- /dev/null
+#!/bin/sh
+
+for VM in menu csprogs; do
+ case "$VM" in
+ csprogs)
+ VMD=client
+ ;;
+ *)
+ VMD=$VM
+ ;;
+ esac
+ {
+ find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
+ find qcsrc/common -type f -not -name \*.po -not -name \*.txt
+ find qcsrc/server -type f -name w_\*.qc
+ } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
+ for X in "$VM".dat.*.po; do
+ [ -f "$X" ] || continue
+ msgmerge -F -U "$X" "$VM".dat.pot >&2
+ todo=$(
+ msgattrib --untranslated "$X" | grep -A 2147483647 "^#:"
+ msgattrib --fuzzy "$X" | grep -A 2147483647 "^#:"
+ )
+ if [ -n "$todo" ]; then
+ echo "TODO for translation $X:"
+ echo "$todo"
+ echo
+ fi
+ done
+done
--- /dev/null
+# Xonotic CSQC
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the Xonotic package.
+# Rudolf Polzer <divVerent@xonotic.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-20 20:17+0100\n"
+"PO-Revision-Date: 2011-01-20 20:16+0100\n"
+"Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/client/Main.qc:30
+msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
+msgstr "FEHLER - MENÜ IST SICHTBAR ABER KEIN MENÜ WURDE DEFINIERT!"
+
+#: qcsrc/client/Main.qc:56
+msgid ""
+"^3Your engine build is outdated\n"
+"^3This Server uses a newer QC VM. Please update!\n"
+msgstr ""
+"^3Diese Engine ist veraltet.\n"
+"^3Dieser Server verwendet eine neuere QC VM. Bitte updaten!\n"
+
+#: qcsrc/client/Main.qc:66
+#, c-format
+msgid "^4CSQC Build information: %s\n"
+msgstr "^4CSQC Build-Information: %s (deutsch)\n"
+
+#: qcsrc/client/Main.qc:227 qcsrc/client/Main.qc:243
+#, c-format
+msgid "trying to switch to unsupported team %d\n"
+msgstr "es wurde versucht, in das nicht unterstützte Team %d zu wechseln"
+
+#: qcsrc/client/Main.qc:359 qcsrc/client/scoreboard.qc:240
+msgid "Usage:\n"
+msgstr "Syntax:\n"
+
+#: qcsrc/client/Main.qc:360
+msgid "hud_save configname (saves to hud_skinname_configname.cfg)\n"
+msgstr "hud_save configname (speichert als hud_skinname_configname.cfg)\n"
+
+#: qcsrc/client/Main.qc:507
+msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
+msgstr "Syntax: cl_cmd BEFEHL..., wobei mögliche Befehle sind:\n"
+
+#: qcsrc/client/Main.qc:508
+msgid " settemp cvar value\n"
+msgstr " settemp Cvar Wert\n"
+
+#: qcsrc/client/Main.qc:509
+msgid " scoreboard_columns_set ...\n"
+msgstr " scoreboard_columns_set ...\n"
+
+#: qcsrc/client/Main.qc:510
+msgid " scoreboard_columns_help\n"
+msgstr " scoreboard_columns_help\n"
+
+#: qcsrc/client/Main.qc:715
+msgid "A CSQC entity changed its owner!\n"
+msgstr "Ein CSQC-Entity hat seinen Besitzer gewechselt!\n"
+
+#: qcsrc/client/Main.qc:929
+msgid "A CSQC entity changed its type!\n"
+msgstr "Ein CSQC-Entity hat seinen Typ gewechselt!\n"
+
+#: qcsrc/client/Main.qc:966
+#, c-format
+msgid "unknown entity type in CSQC_Ent_Update: %d\n"
+msgstr "unbekannter Entity-Typ in CSQC_Ent_Update: %d\n"
+
+#: qcsrc/client/Main.qc:1438
+#, c-format
+msgid "%s (not bound)"
+msgstr "%s (nicht zugewiesen)"
+
+#: qcsrc/client/Main.qc:1443 qcsrc/client/hud.qc:398
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: qcsrc/client/ctf.qc:35
+msgid "----- Order Menu -----"
+msgstr "----- Auftragsmenü -----"
+
+#: qcsrc/client/ctf.qc:36
+#, c-format
+msgid "Order: %s"
+msgstr "Auftrag: %s"
+
+#: qcsrc/client/ctf.qc:37
+msgid "1) ^3previous page"
+msgstr "1) ^3vorherige Seite"
+
+#: qcsrc/client/ctf.qc:38
+msgid "2) ^3next page"
+msgstr "2) ^3nächste Seite"
+
+#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
+msgid "ESC) Exit Menu"
+msgstr "ESC) Menü verlassen"
+
+#: qcsrc/client/ctf.qc:126
+#, c-format
+msgid "Couldn't find player %d\n"
+msgstr "Kann Spieler %d nicht finden\n"
+
+#: qcsrc/client/ctf.qc:154
+msgid "----- Command Menu -----"
+msgstr "---- Befehlsmenü -----"
+
+#: qcsrc/client/ctf.qc:155
+msgid "Issue orders:"
+msgstr "Auftrag geben:"
+
+#: qcsrc/client/ctf.qc:156
+#, fuzzy
+msgid " 1) Attack"
+msgstr " 1) Angreifen"
+
+#: qcsrc/client/ctf.qc:158
+msgid " 2) Defend"
+msgstr " 2) Verteidigen"
+
+#: qcsrc/client/ctf.qc:160
+msgid "3) Resign from command."
+msgstr "3) Befehlsgewalt abgeben."
+
+#: qcsrc/client/ctf.qc:212
+msgid "You're commander!"
+msgstr "Sie sind Befehlshaber!"
+
+#: qcsrc/client/ctf.qc:215
+msgid "Awaiting orders..."
+msgstr "Warten auf Auftrag..."
+
+#: qcsrc/client/hud.qc:328
+msgid "1st"
+msgstr "1."
+
+#: qcsrc/client/hud.qc:330
+msgid "2nd"
+msgstr "2."
+
+#: qcsrc/client/hud.qc:332
+msgid "3rd"
+msgstr "3."
+
+#: qcsrc/client/hud.qc:334
+#, c-format
+msgid "%dth"
+msgstr "%d."
+
+#: qcsrc/client/hud.qc:366
+#, c-format
+msgid " (-%dL)"
+msgstr " (-%dR)"
+
+#: qcsrc/client/hud.qc:371
+#, c-format
+msgid " (+%dL)"
+msgstr " (+%dR)"
+
+#: qcsrc/client/hud.qc:387
+msgid "Start line"
+msgstr "Start"
+
+#: qcsrc/client/hud.qc:389 qcsrc/client/hud.qc:393
+msgid "Finish line"
+msgstr "Ziel"
+
+#: qcsrc/client/hud.qc:391
+#, c-format
+msgid "Intermediate %d"
+msgstr "Zwischenzeit %d"
+
+#: qcsrc/client/hud.qc:400
+#, c-format
+msgid "%s (%s %s)"
+msgstr "%s (%s %s)"
+
+#: qcsrc/client/hud.qc:542
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr "^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ abgelegt)\n"
+
+#: qcsrc/client/hud.qc:546
+msgid "^1Couldn't write to %s\n"
+msgstr "^1Konnte nicht nach %s schreiben\n"
+
+#: qcsrc/client/hud.qc:1830
+msgid "Don't have"
+msgstr "nicht vorhanden"
+
+#: qcsrc/client/hud.qc:1834
+msgid "Unavailable"
+msgstr "nicht verfügbar"
+
+#: qcsrc/client/hud.qc:2685
+#, c-format
+msgid "^1%s^1 couldn't take it anymore\n"
+msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
+
+#: qcsrc/client/hud.qc:2689 qcsrc/client/hud.qc:2981
+#, c-format
+msgid "^1%s^1 died\n"
+msgstr "^1%s^1 ist gestorben\n"
+
+#: qcsrc/client/hud.qc:2693
+#, c-format
+msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
+msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
+
+#: qcsrc/client/hud.qc:2697
+#, c-format
+msgid "^1%s^1 thought they found a nice camping ground\n"
+msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
+
+#: qcsrc/client/hud.qc:2701
+#, c-format
+msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
+msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
+
+#: qcsrc/client/hud.qc:2705
+#, c-format
+msgid "^1%s^1 unfairly eliminated themself\n"
+msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
+
+#: qcsrc/client/hud.qc:2709
+#, c-format
+msgid "^1%s^1 burned to death\n"
+msgstr "^1%s^1 brannte zu Tode\n"
+
+#: qcsrc/client/hud.qc:2713
+#, c-format
+msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
+msgstr "^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
+
+#: qcsrc/client/hud.qc:2717
+#, c-format
+msgid "^1%s^1 ended it all after a %d kill spree\n"
+msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
+
+#: qcsrc/client/hud.qc:2734
+#, c-format
+msgid "^1%s^1 took action against a team mate\n"
+msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
+
+#: qcsrc/client/hud.qc:2736
+#, c-format
+msgid "^1%s^1 mows down a team mate\n"
+msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
+
+#: qcsrc/client/hud.qc:2741
+#, c-format
+msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
+msgstr "^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem Mitspieler aus\n"
+
+#: qcsrc/client/hud.qc:2743
+#, c-format
+msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
+msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
+
+#: qcsrc/client/hud.qc:2747
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
+msgstr "^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
+
+#: qcsrc/client/hud.qc:2749
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
+msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
+
+#: qcsrc/client/hud.qc:2757
+#, c-format
+msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
+msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
+
+#: qcsrc/client/hud.qc:2759
+#, c-format
+msgid "^1%s^1 was telefragged by %s\n"
+msgstr "^1%s^1 wurde von %s^1 telefragged\n"
+
+#: qcsrc/client/hud.qc:2764
+#, c-format
+msgid "^1%s^1 was drowned by %s\n"
+msgstr "^1%s^1 wurde von %s^1 etränkt\n"
+
+#: qcsrc/client/hud.qc:2769
+#, c-format
+msgid "^1%s^1 was slimed by %s\n"
+msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
+
+#: qcsrc/client/hud.qc:2774
+#, c-format
+msgid "^1%s^1 was cooked by %s\n"
+msgstr "^1%s^1 wurde von %s^1 gebraten\n"
+
+#: qcsrc/client/hud.qc:2779
+#, c-format
+msgid "^1%s^1 was grounded by %s\n"
+msgstr "^1%a^1 wurde von %s^1 geerdet\n"
+
+#: qcsrc/client/hud.qc:2784
+#, c-format
+msgid "^1%s^1 was shot into space by %s\n"
+msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
+
+#: qcsrc/client/hud.qc:2789
+#, c-format
+msgid "^1%s^1 was conserved by %s\n"
+msgstr "^1%s^1 wurde von %s^1 konserviert\n"
+
+#: qcsrc/client/hud.qc:2795
+#, c-format
+msgid "^1%s^1 was thrown into a world of hurt by %s\n"
+msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
+
+#: qcsrc/client/hud.qc:2799
+#, c-format
+msgid "^1%s^1 was crushed by ^1%s\n"
+msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
+
+#: qcsrc/client/hud.qc:2803
+#, c-format
+msgid "^1%s^1 got shredded by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2807
+#, c-format
+msgid "^1%s^1 was blased to bits by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2811
+#, c-format
+msgid "^1%s^1 got caught in the destruction of ^1%s's vehicle\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2815
+#, c-format
+msgid "^1%s^1 was bolted down by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2819
+#, c-format
+msgid "^1%s^1 could find no shelter from ^1%s's rockets\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2823
+#, c-format
+msgid "^1%s^1 dies when ^1%s's wakizashi dies.\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2827
+#, c-format
+msgid "^1%s^1 was pushed into the line of fire by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2831
+#, c-format
+msgid "^1%s^1 was pushed into an accident by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2835
+#, c-format
+msgid "^1%s^1 was unfairly eliminated by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2839
+#, c-format
+msgid "^1%s^1 was burnt to death by ^1%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2851
+#, c-format
+msgid "^1%s^1 was fragged by %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2856
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2858
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2861
+#, c-format
+msgid "^1%s^1 made %s scores in a row\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2863
+#, c-format
+msgid "^1%s^1 has %s frags in a row\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2866
+#, c-format
+msgid "%s^7 made a ^1TRIPLE SCORE\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2868
+#, c-format
+msgid "%s^7 made a ^1TRIPLE FRAG\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2871
+#, c-format
+msgid "%s^7 unleashes ^1SCORING RAGE\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2873
+#, c-format
+msgid "%s^7 unleashes ^1RAGE\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2876
+#, c-format
+msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2878
+#, c-format
+msgid "%s^7 starts the ^1MASSACRE!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2881
+#, c-format
+msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2883
+#, c-format
+msgid "%s^7 executes ^1MAYHEM!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2886
+#, c-format
+msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2888
+#, c-format
+msgid "%s^7 is a ^1BERSERKER!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2891
+#, c-format
+msgid "%s^7 made ^1TWENTY FIFE SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2893
+#, c-format
+msgid "%s^7 inflicts ^1CARNAGE!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2896
+#, c-format
+msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2898
+#, c-format
+msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2906
+#, c-format
+msgid "^1%s^1 was in the water for too long\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2908
+#, c-format
+msgid "^1%s^1 drowned\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2919
+#, c-format
+msgid "^1%s^1 found a hot place\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2921
+#, c-format
+msgid "^1%s^1 turned into hot slag\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2928
+#, c-format
+msgid "^1%s^1 tested gravity (and it worked)\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2930
+#, c-format
+msgid "^1%s^1 hit the ground with a crunch\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2935
+#, c-format
+msgid "^1%s^1 became a shooting star\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2941
+#, c-format
+msgid "^1%s^1 discovered a swamp\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2943
+#, c-format
+msgid "^1%s^1 is now conserved for centuries to come\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2948
+#, c-format
+msgid "^1%s^1 was mowed down by a turret \n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2960
+#, c-format
+msgid "^1%s^1 died in an accident\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2964
+#, c-format
+msgid "^1%s^1 was unfairly eliminated\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2970
+#, c-format
+msgid "^1%s^1 felt a little hot\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2972
+#, c-format
+msgid "^1%s^1 burnt to death\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2979
+#, c-format
+msgid "^1%s^1 needs a restart\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2986
+#, c-format
+msgid "^1%s^1 needs a restart after a %d scoring spree\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2988
+#, c-format
+msgid "^1%s^1 died with a %d kill spree\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2992
+#, c-format
+msgid "%s^7 got the %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2995
+#, c-format
+msgid "%s^7 lost the %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2998
+#, c-format
+msgid "%s^7 picked up the %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3001
+#, c-format
+msgid "%s^7 returned the %s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3004
+msgid "%1^7 captured the %s%s\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3023
+#, c-format
+msgid "%s^7 has picked up the ball!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3028
+#, c-format
+msgid "%s^7 has dropped the ball!\n"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3041
+#, c-format
+msgid "You are now on: %s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3043
+#, c-format
+msgid ""
+"You have been moved into a different team to improve team balance\n"
+"You are now on: %s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3046
+msgid "^1Reconsider your tactics, camper!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3048
+msgid "^1Die camper!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3051
+msgid "^1You are reinserted into the game for running out of ammo..."
+msgstr ""
+
+#: qcsrc/client/hud.qc:3053
+msgid "^1You were killed for running out of ammo..."
+msgstr ""
+
+#: qcsrc/client/hud.qc:3056
+msgid "^1You need to preserve your health"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3058
+msgid "^1You grew too old without taking your medicine"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3061
+msgid "^1Don't go against team mates!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3063
+msgid "^1Don't shoot your team mates!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3068
+msgid "^1You need to be more careful!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3070
+msgid "^1You killed your own dumb self!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3075
+#, c-format
+msgid "^1Moron! You went against %s, a team mate!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3077
+#, c-format
+msgid "^1Moron! You fragged %s, a team mate!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3081
+msgid "^1First score"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3083
+msgid "^1First blood"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3087
+msgid "^1First casualty"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3089
+msgid "^1First victim"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3093
+#, c-format
+msgid "^1You scored against ^7%s^1 who was typing!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3095
+#, c-format
+msgid "^1You typefragged ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3099
+#, c-format
+msgid "^1You were scored against by ^7%s^1 while you were typing!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3101
+#, c-format
+msgid "^1You were typefragged by ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3105
+#, c-format
+msgid "^4You scored against ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3107
+#, c-format
+msgid "^4You fragged ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3111
+#, c-format
+msgid "^1You were scored against by ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3113
+#, c-format
+msgid "^1You were fragged by ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3118
+msgid "^1Watch your step!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3182 qcsrc/client/hud.qc:3183
+#, c-format
+msgid "Player %d"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3779
+msgid "^1Intermediate 1 (+15.42)"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3781 qcsrc/client/hud.qc:3823 qcsrc/client/hud.qc:3864
+#, c-format
+msgid "^1PENALTY: %.1f (%s)"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3866
+#, c-format
+msgid "^2PENALTY: %.1f (%s)"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3891
+msgid "^2Name ^7instead of \"^1Unregistered player\" ^7in stats"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3973
+msgid "A vote has been called for:"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3975
+msgid "Allow servers to store and display your name?"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3979
+msgid "^1Configure the HUD"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3983
+#, c-format
+msgid "Yes (%s): %d"
+msgstr ""
+
+#: qcsrc/client/hud.qc:3985
+#, c-format
+msgid "No (%s): %d"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4498 qcsrc/client/hud.qc:4501 qcsrc/client/hud.qc:4503
+msgid "Personal best"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4516 qcsrc/client/hud.qc:4519 qcsrc/client/hud.qc:4521
+msgid "Server best"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4753
+msgid "^3Player^7: This is the chat area."
+msgstr ""
+
+#: qcsrc/client/hud.qc:4816
+#, c-format
+msgid "FPS: %.*f"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4881
+msgid "^1Observing"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4883
+#, c-format
+msgid "^1Spectating: ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4887
+#, c-format
+msgid "^1Press ^3%s^1 to spectate"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4889
+#, c-format
+msgid "^1Press ^3%s^1 for another player"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4893
+#, c-format
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4895
+#, c-format
+msgid "^1Press ^3%s^1 to observe"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4898
+#, c-format
+msgid "^1Press ^3%s^1 for gamemode info"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4902
+msgid "^1Wait for your turn to join"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4908
+msgid "^1Match has already begun"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4910
+msgid "^1You have no more lives left"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4912 qcsrc/client/hud.qc:4915
+#, c-format
+msgid "^1Press ^3%s^1 to join"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4923
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4930
+msgid "^2Currently in ^1warmup^2 stage!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4945
+#, c-format
+msgid "%sPress ^3%s%s to end warmup"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4947
+#, c-format
+msgid "%sPress ^3%s%s once you are ready"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4952
+msgid "^2Waiting for others to ready up to end warmup..."
+msgstr ""
+
+#: qcsrc/client/hud.qc:4954
+msgid "^2Waiting for others to ready up..."
+msgstr ""
+
+#: qcsrc/client/hud.qc:4981
+msgid "Teamnumbers are unbalanced!"
+msgstr ""
+
+#: qcsrc/client/hud.qc:4994
+msgid "^7Press ^3ESC ^7to show HUD options."
+msgstr ""
+
+#: qcsrc/client/hud.qc:4996
+msgid "^3Doubleclick ^7a panel for panel-specific options."
+msgstr ""
+
+#: qcsrc/client/hud.qc:4998
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+msgstr ""
+
+#: qcsrc/client/hud.qc:5000
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+msgstr ""
+
+#: qcsrc/client/hud.qc:5025
+msgid " qu/s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:5029
+msgid " m/s"
+msgstr ""
+
+#: qcsrc/client/hud.qc:5033
+msgid " km/h"
+msgstr ""
+
+#: qcsrc/client/hud.qc:5037
+msgid " mph"
+msgstr ""
+
+#: qcsrc/client/hud.qc:5041
+msgid " knots"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:28
+msgid " (1 vote)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:30
+#, c-format
+msgid " (%d votes)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:113
+msgid "Don't care"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:194
+msgid "Vote for a map"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:199
+#, c-format
+msgid "%d seconds left"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:263
+msgid ""
+"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:273
+msgid "^1Error:^7 Couldn't find pak index.\n"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:282
+msgid "Requesting preview...\n"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:23
+msgid "^1Begin!"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:34
+#, c-format
+msgid "^1Game starts in %d seconds"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:113
+msgid "^1RED^7 flag"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:118
+msgid "^4BLUE^7 flag"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:126
+#, c-format
+msgid "You picked up the %s!"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:130
+#, c-format
+msgid "You got the %s!"
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:283
+msgid "Trying to remove a team which is not in the teamlist!"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:19
+msgid "SCO^bckills"
+msgstr "BC getötet"
+
+#: qcsrc/client/scoreboard.qc:20
+msgid "SCO^caps"
+msgstr "Caps"
+
+#: qcsrc/client/scoreboard.qc:21
+msgid "SCO^deaths"
+msgstr "Deaths"
+
+#: qcsrc/client/scoreboard.qc:22
+msgid "SCO^destroyed"
+msgstr "zerstört"
+
+#: qcsrc/client/scoreboard.qc:23
+msgid "SCO^drops"
+msgstr "verloren"
+
+#: qcsrc/client/scoreboard.qc:24
+msgid "SCO^faults"
+msgstr "Fehler"
+
+#: qcsrc/client/scoreboard.qc:25
+msgid "SCO^fckills"
+msgstr "FC getötet"
+
+#: qcsrc/client/scoreboard.qc:26
+msgid "SCO^goals"
+msgstr "Tore"
+
+#: qcsrc/client/scoreboard.qc:27
+msgid "SCO^kckills"
+msgstr "KC getötet"
+
+#: qcsrc/client/scoreboard.qc:28
+msgid "SCO^kdratio"
+msgstr "kdratio"
+
+#: qcsrc/client/scoreboard.qc:29
+msgid "SCO^k/d"
+msgstr "k/d"
+
+#: qcsrc/client/scoreboard.qc:30
+msgid "SCO^kd"
+msgstr "kd"
+
+#: qcsrc/client/scoreboard.qc:31
+msgid "SCO^kdr"
+msgstr "kdr"
+
+#: qcsrc/client/scoreboard.qc:32
+msgid "SCO^kills"
+msgstr "Kills"
+
+#: qcsrc/client/scoreboard.qc:33
+msgid "SCO^laps"
+msgstr "Runden"
+
+#: qcsrc/client/scoreboard.qc:34
+msgid "SCO^lives"
+msgstr "Leben"
+
+#: qcsrc/client/scoreboard.qc:35
+msgid "SCO^losses"
+msgstr "verloren"
+
+#: qcsrc/client/scoreboard.qc:36
+msgid "SCO^name"
+msgstr "Name"
+
+#: qcsrc/client/scoreboard.qc:37
+msgid "SCO^nick"
+msgstr "Nick"
+
+#: qcsrc/client/scoreboard.qc:38
+msgid "SCO^objectives"
+msgstr "Objectives"
+
+#: qcsrc/client/scoreboard.qc:39
+msgid "SCO^pickups"
+msgstr "Flaggen"
+
+#: qcsrc/client/scoreboard.qc:40
+msgid "SCO^ping"
+msgstr "Ping"
+
+#: qcsrc/client/scoreboard.qc:41
+msgid "SCO^pl"
+msgstr "PL"
+
+#: qcsrc/client/scoreboard.qc:42
+msgid "SCO^pushes"
+msgstr "Pushes"
+
+#: qcsrc/client/scoreboard.qc:43
+msgid "SCO^rank"
+msgstr "Rang"
+
+#: qcsrc/client/scoreboard.qc:44
+msgid "SCO^returns"
+msgstr "Returns"
+
+#: qcsrc/client/scoreboard.qc:45
+msgid "SCO^revivals"
+msgstr "wiederbelebt"
+
+#: qcsrc/client/scoreboard.qc:46
+msgid "SCO^score"
+msgstr "Punkte"
+
+#: qcsrc/client/scoreboard.qc:47
+msgid "SCO^suicides"
+msgstr "Suiz."
+
+#: qcsrc/client/scoreboard.qc:48
+msgid "SCO^takes"
+msgstr "Übernahmen"
+
+#: qcsrc/client/scoreboard.qc:49
+msgid "SCO^ticks"
+msgstr "Ticks"
+
+#: qcsrc/client/scoreboard.qc:238
+msgid ""
+"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
+msgstr ""
+"Sie können die Tabelle mit dem ^2scoreboard_columns_set Befehl ändern.\n"
+
+#: qcsrc/client/scoreboard.qc:239
+msgid "^3|---------------------------------------------------------------|\n"
+msgstr "^3|---------------------------------------------------------------|\n"
+
+#: qcsrc/client/scoreboard.qc:241
+msgid "^2scoreboard_columns_set default\n"
+msgstr "^2scoreboard_columns_set default\n"
+
+#: qcsrc/client/scoreboard.qc:242
+msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgstr "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+
+#: qcsrc/client/scoreboard.qc:243
+msgid "The following field names are recognized (case insensitive):\n"
+msgstr "Die folgenden Feldnamen werden akzeptiert:\n"
+
+#: qcsrc/client/scoreboard.qc:244
+msgid ""
+"You can use a ^3|^7 to start the right-aligned fields.\n"
+"\n"
+msgstr "Mit ^3|^7 werden die rechtsbündigen Felder gestartet.\n"
+
+#: qcsrc/client/scoreboard.qc:246
+msgid "^3name^7 or ^3nick^7 Name of a player\n"
+msgstr "^3name^7 or ^3nick^7 Name des Spielers\n"
+
+#: qcsrc/client/scoreboard.qc:247
+msgid "^3ping^7 Ping time\n"
+msgstr "^3ping^7 Ping\n"
+
+#: qcsrc/client/scoreboard.qc:248
+msgid "^3pl^7 Packet loss\n"
+msgstr "^3pl^7 Paketverlust\n"
+
+#: qcsrc/client/scoreboard.qc:249
+msgid "^3kills^7 Number of kills\n"
+msgstr "^3kills^7 Anzahl Kills\n"
+
+#: qcsrc/client/scoreboard.qc:250
+msgid "^3deaths^7 Number of deaths\n"
+msgstr "^3deaths^7 Anzahl der Tode\n"
+
+#: qcsrc/client/scoreboard.qc:251
+msgid "^3suicides^7 Number of suicides\n"
+msgstr "^3suicides^7 Anzahl der Suizide\n"
+
+#: qcsrc/client/scoreboard.qc:252
+msgid "^3frags^7 kills - suicides\n"
+msgstr "^3frags^7 Kills minus Suizide\n"
+
+#: qcsrc/client/scoreboard.qc:253
+msgid "^3kd^7 The kill-death ratio\n"
+msgstr "^3kd^7 Das Kill/Death-Ratio\n"
+
+#: qcsrc/client/scoreboard.qc:254
+msgid ""
+"^3caps^7 How often a flag (CTF) or a key (KeyHunt) was "
+"captured\n"
+msgstr ""
+"^3caps^7 Wie oft mit der Flagge (CTF) oder den "
+"Schlüssels (KeyHunt) gepunktet wurde\n"
+
+#: qcsrc/client/scoreboard.qc:255
+msgid ""
+"^3pickups^7 How often a flag (CTF) or a key (KeyHunt) was "
+"picked up\n"
+msgstr ""
+"^3pickups^7 Wie oft die Flagge/Schlüssel aufgenommen "
+"wurden\n"
+
+#: qcsrc/client/scoreboard.qc:256
+msgid "^3fckills^7 Number of flag carrier kills\n"
+msgstr "^3fckills^7 Wieviele Flaggenträger getötet wurden\n"
+
+#: qcsrc/client/scoreboard.qc:257
+msgid "^3returns^7 Number of flag returns\n"
+msgstr "^3returns^7 Wie oft die Flagge zurückgebracht wurde\n"
+
+#: qcsrc/client/scoreboard.qc:258
+msgid "^3drops^7 Number of flag drops\n"
+msgstr "^3drops^7 Wie oft die Flagge verloren wurde\n"
+
+#: qcsrc/client/scoreboard.qc:259
+msgid "^3lives^7 Number of lives (LMS)\n"
+msgstr "^3lives^7 Anzahl Leben (LMS)\n"
+
+#: qcsrc/client/scoreboard.qc:260
+msgid "^3rank^7 Player rank\n"
+msgstr "^3rank^7 Rang des Spielers\n"
+
+#: qcsrc/client/scoreboard.qc:261
+msgid "^3pushes^7 Number of players pushed into void\n"
+msgstr "^3pushes^7 Anzahl in die Tiefe geworfener Gegner\n"
+
+#: qcsrc/client/scoreboard.qc:262
+msgid ""
+"^3destroyed^7 Number of keys destroyed by pushing them into "
+"void\n"
+msgstr ""
+"^3destroyed^7 Wie oft ein Gegner mit Schlüssel in die Tiefe "
+"geworfen wurde\n"
+
+#: qcsrc/client/scoreboard.qc:263
+msgid "^3kckills^7 Number of keys carrier kills\n"
+msgstr "^3kckills^7 Wie oft Key-Carrier getötet wurden\n"
+
+#: qcsrc/client/scoreboard.qc:264
+msgid "^3losses^7 Number of times a key was lost\n"
+msgstr "^3losses^7 Anzahl verlorener Schlüssel\n"
+
+#: qcsrc/client/scoreboard.qc:265
+msgid "^3laps^7 Number of laps finished (race/cts)\n"
+msgstr "^3laps^7 Anzahl vollendeter Runden (race/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:266
+msgid "^3time^7 Total time raced (race/cts)\n"
+msgstr "^3time^7 Gesamtzeit des Rennens (race/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:267
+msgid "^3fastest^7 Time of fastest lap (race/cts)\n"
+msgstr "^3fastest^7 Zeit der schnellsten Runde (race/cts)\n"
+
+#: qcsrc/client/scoreboard.qc:268
+msgid "^3ticks^7 Number of ticks (DOM)\n"
+msgstr "^3ticks^7 Anzahl der Ticks (DOM)\n"
+
+#: qcsrc/client/scoreboard.qc:269
+msgid "^3takes^7 Number of domination points taken (DOM)\n"
+msgstr "^3takes^7 Anzahl eingenommener Dom-Points (DOM)\n"
+
+#: qcsrc/client/scoreboard.qc:270
+msgid ""
+"^3score^7 Total score\n"
+"\n"
+msgstr ""
+"^3score^7 Gesamtpunktzahl\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:272
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"or in all but these game types. You can also specify 'all' as a\n"
+"field to show all fields available for the current game mode.\n"
+"\n"
+msgstr ""
+"Vor ein Feld können Sie ein Plus- oder Minuszeichen setzen, anschließend\n"
+"eine durch Kommata getrennte Liste von Spieltypen, dann einen Slash, so "
+"dass\n"
+"das Feld nur in diesen, oder in allen außer diesen Spieltypen erscheint.\n"
+"Außerdem kann \"all\" als Feldname verwendet werden; in diesem Fall "
+"erscheinen\n"
+"sämtliche möglichen Felder im aktuellen Spieltyp.\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:277
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes.\n"
+"\n"
+msgstr ""
+"Die speziellen Bezeichner 'teams' und 'noteams' können verwendet werden\n"
+"als Gruppierung aller Teamplay- oder Nicht-Teamplay-Spieltypen.\n"
+"\n"
+
+#: qcsrc/client/scoreboard.qc:280
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+msgstr "Beispiel: scoreboard_columns_set name ping pl < +ctf/feld3 dm/feld4\n"
+
+#: qcsrc/client/scoreboard.qc:281
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right.\n"
+msgstr ""
+"wird Name, Ping und Paketverlust linksbündig, und die Felder rechts\n"
+"von der Trennlinie (und rechtsbündig) anzeigen.\n"
+
+#: qcsrc/client/scoreboard.qc:283
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM.\n"
+msgstr ""
+"'feld3' wird nur in CTF sichtbar sein, und 'feld4' wird in allen Spieltypen\n"
+"außer DM erscheinen.\n"
+
+#: qcsrc/client/scoreboard.qc:429 qcsrc/client/scoreboard.qc:444
+#: qcsrc/client/scoreboard.qc:454 qcsrc/client/scoreboard.qc:463
+#: qcsrc/client/scoreboard.qc:472
+#, c-format
+msgid "fixed missing field '%s'\n"
+msgstr "Fehlendes Feld '%s' wurde ergänzt.\n"
+
+#: qcsrc/client/scoreboard.qc:512 qcsrc/client/scoreboard.qc:519
+msgid "N/A"
+msgstr "-"
+
+#: qcsrc/client/scoreboard.qc:948
+#, c-format
+msgid "Accuracy stats (average %d%%)"
+msgstr "Genauigkeit (Durchschn.: %d%%)"
+
+#: qcsrc/client/scoreboard.qc:1013
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: qcsrc/client/scoreboard.qc:1073
+msgid "Rankings"
+msgstr "Platzierungen"
+
+#: qcsrc/client/scoreboard.qc:1164 qcsrc/client/scoreboard.qc:1166
+msgid "Scoreboard"
+msgstr "Tabelle"
+
+#: qcsrc/client/scoreboard.qc:1207
+#, c-format
+msgid "Speed award: %d ^7(%s^7)"
+msgstr "Höchstgeschwindigkeit: %d ^7(%s^7)"
+
+#: qcsrc/client/scoreboard.qc:1211
+#, c-format
+msgid "All-time fastest: %d ^7(%s^7)"
+msgstr "Rekord: %d ^7(%s^7)"
+
+#: qcsrc/client/scoreboard.qc:1238 qcsrc/client/teamplay.qc:55
+msgid "Spectators"
+msgstr "Zuschauer"
+
+#: qcsrc/client/scoreboard.qc:1245
+#, c-format
+msgid "playing on ^2%s^7"
+msgstr "es wird auf ^2%s^7 gespielt"
+
+#: qcsrc/client/scoreboard.qc:1252 qcsrc/client/scoreboard.qc:1257
+#, c-format
+msgid " for up to ^1%.1g minutes^7"
+msgstr " für bis zu ^1%.1g Minuten^7"
+
+#: qcsrc/client/scoreboard.qc:1261 qcsrc/client/scoreboard.qc:1280
+msgid " or"
+msgstr " oder"
+
+#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1271
+#, c-format
+msgid " until ^3%s %s^7"
+msgstr " bis ^3%s %s^7"
+
+#: qcsrc/client/scoreboard.qc:1265 qcsrc/client/scoreboard.qc:1272
+#: qcsrc/client/scoreboard.qc:1284 qcsrc/client/scoreboard.qc:1291
+msgid "SCO^points"
+msgstr "Punkte"
+
+#: qcsrc/client/scoreboard.qc:1266 qcsrc/client/scoreboard.qc:1273
+#: qcsrc/client/scoreboard.qc:1285 qcsrc/client/scoreboard.qc:1292
+msgid "SCO^is beaten"
+msgstr "geschlagen wird"
+
+#: qcsrc/client/scoreboard.qc:1283 qcsrc/client/scoreboard.qc:1290
+#, c-format
+msgid " until a lead of ^3%s %s^7"
+msgstr " bis zu einem Vorsprung von ^3%s %s^7"
+
+#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
+#, c-format
+msgid "Cannot initialize sound %s\n"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:56
+msgid "Red Team"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:57
+msgid "Blue Team"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:58
+msgid "Yellow Team"
+msgstr ""
+
+#: qcsrc/client/teamplay.qc:59
+msgid "Pink Team"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
set g_weaponreplace_minstanex ""
set g_weaponreplace_hook ""
set g_weaponreplace_hlac 0 // Maybe will be enabled later after I figure out what I want to do with it
-set g_weaponreplace_campingrifle ""
+set g_weaponreplace_sniperrifle ""
set g_weaponreplace_tuba ""
set g_weaponreplace_fireball 0 // Same with this
set g_weaponreplace_seeker 0 // Same with this
+// Xonotic ProMode
exec defaultXonotic.cfg
-exec physicsXPM.cfg
-set g_start_weapon_laser 0
-set g_balance_weaponswitchdelay 0
+//==============
+// pure changes
+//==============
-set g_shootfromcenter 1
+// players
+sv_fbskin_green // visible playermodel forced on everyone
+set teamplay_mode 2 // friendly fire and self damage
-set g_forced_respawn 1
+//================
+// impure changes
+//================
-set g_mirrordamage 0
-set g_friendlyfire 1
+// players
+g_jump_grunt 1 // make enemies even easier to hear when they're jumping around
-set timelimit_overtimes 1
+// physics
+exec physicsXPM.cfg // XPM physics. Similar to vanilla Xonotic physics, with a different way to accelerate: through strafejumping
-set sv_fragmessage_information_stats 0
+// balance
+set g_balance_weaponswitchdelay 0 // no switch animation, this is standard in "pro modes" ;)
+set g_shootfromcenter 1 // hit where you point at with the crosshair (almost so, no shooteye because it's really ugly)
-// force a visible playermodel!
-set sv_defaultcharacter 1
-set sv_defaultplayermodel "models/player/nyx.iqm"
-set sv_defaultplayercolors 60
-set g_fullbrightplayers 1
+// match rules
+set timelimit_overtimes 1 // overtimes on, draw matches are less interesting! :)
+set g_forced_respawn 1 // no delaying/cheating a match by not spawning
+
+// info
+set sv_fragmessage_information_stats 0 // don't reveal how much health/armor the attacker had
//
// e.g. Xonotic 1.5.1 RC1 will be 15101
set g_xonoticversion git "Xonotic version (formatted for humans)"
+
gameversion 100 // 0.1.0
gameversion_min 0 // git builds see all versions
gameversion_max 65535 // git builds see all versions
// server about changes)
alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
+seta cl_firststart "" "how many times the client has been run"
+seta cl_startcount 0 "how many times the client has been run"
+
// detect dedicated server or client
alias "_detect_dedicated_$qport" "${* asis}"
alias "_detect_dedicated_0" ""
mod_q3bsp_lightmapmergepower 4
// player defaults
-_cl_color 102
+_cl_color 112
_cl_name Player
-_cl_playermodel models/player/umbra.iqm
+_cl_playermodel models/player/erebus.iqm
_cl_playerskin 0
-seta crosshair 3
-seta crosshair_color_red 0.6
-seta crosshair_color_green 0.8
-seta crosshair_color_blue 1
-seta crosshair_alpha 1
-seta crosshair_size 0.35
+seta crosshair 16
+seta crosshair_color "0.6 0.8 1"
+seta crosshair_alpha 0.300000
+seta crosshair_size 0.500000
seta crosshair_dot 1
seta crosshair_dot_alpha 1
-seta crosshair_dot_size 1
+seta crosshair_dot_size 0.600000
+seta crosshair_dot_color "1 0 0" "when != 0, use custom color for the crosshair dot"
seta crosshair_pickup 0.25
seta crosshair_pickup_speed 4
+seta crosshair_hitindication 0.5
+seta crosshair_hitindication_color "10 -10 -10"
+seta crosshair_hitindication_speed 5
seta crosshair_per_weapon 0 "when 1, each gun will display a different crosshair"
-seta crosshair_color_override 0 "when 1, crosshair_color_* overrides the per-weapon color"
+seta crosshair_color_per_weapon 1 "when 1, each gun will display the crosshair with a different color"
seta crosshair_effect_speed -1 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time"
seta crosshair_effect_scalefade 1 "use scaling and fading for crosshair effects"
seta crosshair_hittest 1 "do a crosshair hit evaluation; also, the crosshair is scaled by the given number when aiming at an enemy, and blurred when aiming at a team mate"
seta crosshair_hittest_blur 1 "blur the crosshair if the shot is obstructed"
seta crosshair_hittest_showimpact 0 "move the crosshair to the actual impact location if obstructed"
seta crosshair_laser "" "crosshair to display when wielding the laser"
-seta crosshair_laser_color_red 1 "crosshair color red component to display when wielding the laser"
-seta crosshair_laser_color_green 0.35 "crosshair color green component to display when wielding the laser"
-seta crosshair_laser_color_blue 0.2 "crosshair color blue component to display when wielding the laser"
+seta crosshair_laser_color "1 0.35 0.2" "crosshair color to display when wielding the laser"
seta crosshair_laser_alpha 0.75 "crosshair alpha value to display when wielding the laser"
seta crosshair_laser_size 0.4 "crosshair size when wielding the laser"
seta crosshair_shotgun "" "crosshair to display when wielding the shotgun"
-seta crosshair_shotgun_color_red 0.7 "crosshair color red component to display when wielding the shotgun"
-seta crosshair_shotgun_color_green 0.7 "crosshair color green component to display when wielding the shotgun"
-seta crosshair_shotgun_color_blue 0.7 "crosshair color blue component to display when wielding the shotgun"
+seta crosshair_shotgun_color "0.7 0.7 0.7" "crosshair color to display when wielding the shotgun"
seta crosshair_shotgun_alpha 1.1 "crosshair alpha value to display when wielding the shotgun"
seta crosshair_shotgun_size 0.65 "crosshair size when wielding the shotgun"
seta crosshair_uzi "" "crosshair to display when wielding the machinegun"
-seta crosshair_uzi_color_red 0.4 "crosshair color red component to display when wielding the machinegun"
-seta crosshair_uzi_color_green 0.9 "crosshair color green component to display when wielding the machinegun"
-seta crosshair_uzi_color_blue 0.35 "crosshair color blue component to display when wielding the machinegun"
+seta crosshair_uzi_color "0.4 0.9 0.35" "crosshair color to display when wielding the machinegun"
seta crosshair_uzi_alpha 0.9 "crosshair alpha value to display when wielding the machinegun"
seta crosshair_uzi_size 0.6 "crosshair size when wielding the machinegun"
seta crosshair_grenadelauncher "" "crosshair to display when wielding the mortar"
-seta crosshair_grenadelauncher_color_red 1 "crosshair color red component to display when wielding the mortar"
-seta crosshair_grenadelauncher_color_green 0.15 "crosshair color green component to display when wielding the mortar"
-seta crosshair_grenadelauncher_color_blue 0 "crosshair color blue component to display when wielding the mortar"
+seta crosshair_grenadelauncher_color "1 0.15 0" "crosshair color to display when wielding the mortar"
seta crosshair_grenadelauncher_alpha 1.15 "crosshair alpha value to display when wielding the mortar"
seta crosshair_grenadelauncher_size 0.7 "crosshair size when wielding the mortar"
seta crosshair_minelayer "" "crosshair to display when wielding the mortar"
-seta crosshair_minelayer_color_red 0.75 "crosshair color red component to display when wielding the mortar"
-seta crosshair_minelayer_color_green 0.75 "crosshair color green component to display when wielding the mortar"
-seta crosshair_minelayer_color_blue 0 "crosshair color blue component to display when wielding the mortar"
+seta crosshair_minelayer_color "0.75 0.75 0" "crosshair color to display when wielding the mortar"
seta crosshair_minelayer_alpha 1.15 "crosshair alpha value to display when wielding the mortar"
seta crosshair_minelayer_size 0.9 "crosshair size when wielding the mortar"
seta crosshair_electro "" "crosshair to display when wielding the electro"
-seta crosshair_electro_color_red 0.35 "crosshair color red component to display when wielding the electro"
-seta crosshair_electro_color_green 0.5 "crosshair color green component to display when wielding the electro"
-seta crosshair_electro_color_blue 1 "crosshair color blue component to display when wielding the electro"
+seta crosshair_electro_color "0.35 0.5 1" "crosshair color to display when wielding the electro"
seta crosshair_electro_alpha 1 "crosshair alpha value to display when wielding the electro"
seta crosshair_electro_size 0.5 "crosshair size when wielding the electro"
seta crosshair_crylink "" "crosshair to display when wielding the crylink"
-seta crosshair_crylink_color_red 0.85 "crosshair color red component to display when wielding the crylink"
-seta crosshair_crylink_color_green 0.25 "crosshair color green component to display when wielding the crylink"
-seta crosshair_crylink_color_blue 1 "crosshair color blue component to display when wielding the crylink"
+seta crosshair_crylink_color "0.85 0.25 1" "crosshair color to display when wielding the crylink"
seta crosshair_crylink_alpha 0.85 "crosshair alpha value to display when wielding the crylink"
seta crosshair_crylink_size 0.4 "crosshair size when wielding the crylink"
seta crosshair_nex "" "crosshair to display when wielding the nex gun"
-seta crosshair_nex_color_red 0 "crosshair color red component to display when wielding the nex gun"
-seta crosshair_nex_color_green 0.9 "crosshair color green component to display when wielding the nex gun"
-seta crosshair_nex_color_blue 1 "crosshair color blue component to display when wielding the nex gun"
+seta crosshair_nex_color "0 0.9 1" "crosshair color to display when wielding the nex gun"
seta crosshair_nex_alpha 0.85 "crosshair alpha value to display when wielding the nex gun"
seta crosshair_nex_size 0.65 "crosshair size when wielding the nex gun"
seta crosshair_hagar "" "crosshair to display when wielding the hagar"
-seta crosshair_hagar_color_red 0.85 "crosshair color red component to display when wielding the hagar"
-seta crosshair_hagar_color_green 0.5 "crosshair color green component to display when wielding the hagar"
-seta crosshair_hagar_color_blue 0.35 "crosshair color blue component to display when wielding the hagar"
+seta crosshair_hagar_color "0.85 0.5 0.35" "crosshair color to display when wielding the hagar"
seta crosshair_hagar_alpha 1 "crosshair alpha value to display when wielding the hagar"
seta crosshair_hagar_size 0.8 "crosshair size when wielding the hagar"
seta crosshair_rocketlauncher "" "crosshair to display when wielding the rocketlauncher"
-seta crosshair_rocketlauncher_color_red 1 "crosshair color red component to display when wielding the rocketlauncher"
-seta crosshair_rocketlauncher_color_green 0.75 "crosshair color green component to display when wielding the rocketlauncher"
-seta crosshair_rocketlauncher_color_blue 0.2 "crosshair color blue component to display when wielding the rocketlauncher"
+seta crosshair_rocketlauncher_color "1 0.75 0.2" "crosshair color to display when wielding the rocketlauncher"
seta crosshair_rocketlauncher_alpha 1 "crosshair alpha value to display when wielding the rocketlauncher"
seta crosshair_rocketlauncher_size 0.5875 "crosshair size when wielding the rocketlauncher"
seta crosshair_porto "" "crosshair to display when wielding the porto"
-seta crosshair_porto_color_red 0.5 "crosshair color red component to display when wielding the porto"
-seta crosshair_porto_color_green 1 "crosshair color green component to display when wielding the porto"
-seta crosshair_porto_color_blue 0.5 "crosshair color blue component to display when wielding the porto"
+seta crosshair_porto_color "0.5 1 0.5" "crosshair color to display when wielding the porto"
seta crosshair_porto_alpha 0.85 "crosshair alpha value to display when wielding the porto"
seta crosshair_porto_size 0.6 "crosshair size when wielding the porto"
seta crosshair_minstanex "" "crosshair to display when wielding the minstanex gun"
-seta crosshair_minstanex_color_red 0.65 "crosshair color red component to display when wielding the minstanex gun"
-seta crosshair_minstanex_color_green 0.65 "crosshair color green component to display when wielding the minstanex gun"
-seta crosshair_minstanex_color_blue 1 "crosshair color blue component to display when wielding the minstanex gun"
+seta crosshair_minstanex_color "0.65 0.65 1" "crosshair color to display when wielding the minstanex gun"
seta crosshair_minstanex_alpha 1 "crosshair alpha value to display when wielding the minstanex gun"
seta crosshair_minstanex_size 0.4 "crosshair size when wielding the minstanex gun"
seta crosshair_hook "" "crosshair to display when wielding the hook"
-seta crosshair_hook_color_red 0.65 "crosshair color red component to display when wielding the hook"
-seta crosshair_hook_color_green 1 "crosshair color green component to display when wielding the hook"
-seta crosshair_hook_color_blue 0.85 "crosshair color blue component to display when wielding the hook"
+seta crosshair_hook_color "0.65 1 0.85" "crosshair color to display when wielding the hook"
seta crosshair_hook_alpha 0.85 "crosshair alpha value to display when wielding the hook"
seta crosshair_hook_size 0.5 "crosshair size when wielding the hook"
seta crosshair_hlac "" "crosshair to display when wielding the H.L.A.C"
-seta crosshair_hlac_color_red 1 "crosshair color red component to display when wielding the H.L.A.C."
-seta crosshair_hlac_color_green 0.65 "crosshair color green component to display when wielding the H.L.A.C."
-seta crosshair_hlac_color_blue 0.2 "crosshair color blue component to display when wielding the H.L.A.C."
+seta crosshair_hlac_color "1 0.65 0.2" "crosshair color to display when wielding the H.L.A.C."
seta crosshair_hlac_alpha 1 "crosshair alpha value to display when wielding the H.L.A.C."
seta crosshair_hlac_size 0.6 "crosshair size when wielding the H.L.A.C."
seta crosshair_seeker "" "crosshair to display when wielding the TAG Seeker"
-seta crosshair_seeker_color_red 1 "crosshair color red component to display when wielding the TAG seeker"
-seta crosshair_seeker_color_green 0.35 "crosshair color green component to display when wielding the TAG seeker"
-seta crosshair_seeker_color_blue 0.35 "crosshair color blue component to display when wielding the TAG seeker"
+seta crosshair_seeker_color "1 0.35 0.35" "crosshair color to display when wielding the TAG seeker"
seta crosshair_seeker_alpha 0.9 "crosshair alpha value to display when wielding the TAG seeker"
seta crosshair_seeker_size 0.8 "crosshair size when wielding the TAG seeker"
-seta crosshair_campingrifle "" "crosshair to display when wielding the campingrifle"
-seta crosshair_campingrifle_color_red 0.85 "crosshair color red component to display when wielding the campingrifle"
-seta crosshair_campingrifle_color_green 0.5 "crosshair color green component to display when wielding the campingrifle"
-seta crosshair_campingrifle_color_blue 0.25 "crosshair color blue component to display when wielding the campingrifle"
-seta crosshair_campingrifle_alpha 1 "crosshair alpha value to display when wielding the campingrifle"
-seta crosshair_campingrifle_size 0.65 "crosshair size when wielding the campingrifle"
+seta crosshair_sniperrifle "" "crosshair to display when wielding the sniperrifle"
+seta crosshair_sniperrifle_color "0.85 0.5 0.25" "crosshair color to display when wielding the sniperrifle"
+seta crosshair_sniperrifle_alpha 1 "crosshair alpha value to display when wielding the sniperrifle"
+seta crosshair_sniperrifle_size 0.65 "crosshair size when wielding the sniperrifle"
seta crosshair_tuba "" "crosshair to display when wielding the tuba"
-seta crosshair_tuba_color_red 0.85 "crosshair color red component to display when wielding the tuba"
-seta crosshair_tuba_color_green 0.5 "crosshair color green component to display when wielding the tuba"
-seta crosshair_tuba_color_blue 0.25 "crosshair color blue component to display when wielding the tuba"
+seta crosshair_tuba_color "0.85 0.5 0.25" "crosshair color to display when wielding the tuba"
seta crosshair_tuba_alpha 1 "crosshair alpha value to display when wielding the tuba"
seta crosshair_tuba_size 1 "crosshair size when wielding the tuba"
seta crosshair_fireball "" "crosshair to display when wielding the fireball"
-seta crosshair_fireball_color_red 0.2 "crosshair color red component to display when wielding the fireball"
-seta crosshair_fireball_color_green 1.0 "crosshair color green component to display when wielding the fireball"
-seta crosshair_fireball_color_blue 0.2 "crosshair color blue component to display when wielding the fireball"
+seta crosshair_fireball_color "0.2 1.0 0.2" "crosshair color to display when wielding the fireball"
seta crosshair_fireball_alpha 1 "crosshair alpha value to display when wielding the fireball"
seta crosshair_fireball_size 1 "crosshair size when wielding the fireball"
+seta crosshair_color_by_health 0 "if enabled, crosshair color will depend on current health"
+
+// ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
seta crosshair_ring_size 2 "bullet counter ring size for Rifle, velocity ring for Nex"
-seta crosshair_campingrifle_bulletcounter_alpha 0.15
+seta crosshair_ring_alpha 0.2 "ring alpha"
-seta crosshair_nexvelocity_alpha 0.15
-seta crosshair_nexvelocity_currentcharge_scale 30
-seta crosshair_nexvelocity_currentcharge_alpha 0.15
-seta crosshair_nexvelocity_currentcharge_color_red 0.8
-seta crosshair_nexvelocity_currentcharge_color_green 0
-seta crosshair_nexvelocity_currentcharge_color_blue 0
-seta crosshair_nexvelocity_currentcharge_movingavg_rate 0.05
+seta crosshair_ring_sniperrifle_alpha 0.15
+
+seta crosshair_ring_nex_outer_alpha 0.15
+seta crosshair_ring_nex_inner_alpha 0.15
+seta crosshair_ring_nex_inner_color_red 0.8
+seta crosshair_ring_nex_inner_color_green 0
+seta crosshair_ring_nex_inner_color_blue 0
+seta crosshair_ring_nex_currentcharge_scale 30
+seta crosshair_ring_nex_currentcharge_movingavg_rate 0.05
seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)"
-seta cl_reticle_item_nex 1 "draw aiming recticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
-seta cl_reticle_item_normal 1 "draw recticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
+seta cl_reticle_item_nex 1 "draw aiming reticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
+seta cl_reticle_item_normal 1 "draw reticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
fov 90
seta cl_velocityzoom 0 "velocity based zooming of fov, negative values zoom out"
seta cl_velocityzoomtime 0.3 "time value for averaging speed values"
cl_rollangle 0 // amount of view tilt when strafing, default is 2.0
v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
-gl_polyblend 0.5 // whether to use screen tints, default is 1
+gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
r_motionblur 0 // motion blur value, default is 0
r_damageblur 0 // motion blur when damaged, default is 0
+r_bloom_blur 8
+r_bloom_brighten 3
+r_bloom_colorexponent 1
+r_bloom_colorscale 1
+r_bloom_colorsubtract 0.25
+r_bloom_resolution 320
+r_hdr_range 4
+
seta vid_x11_display "" "xonotic-linux-*.sh will use this to start xonotic on an other/new X display"
// This can have three possible settings:
// "" run as usual
seta sv_taunt 1 "allow taunts on the server"
seta sv_autotaunt 1 "allow autotaunts on the server"
seta cl_voice_directional 1 "0 = all voices are non-directional, 1 = all voices are directional, 2 = only taunts are directional"
-seta cl_voice_directional_taunt_attenuation 0.5 "this defines the distance from which taunts can be heared"
+seta cl_voice_directional_taunt_attenuation 0.5 "this defines the distance from which taunts can be heard"
// server settings
hostname "Xonotic $g_xonoticversion Server"
set sv_ready_restart_after_countdown 0 "if set to 1 the players and map items are reset after the countdown ended, otherwise they're reset already at the beginning of the countdown"
set sv_ready_restart_repeatable 0 "allows the players to restart the game as often as needed"
-set sv_hitsound_antispam_time 0.05 "don't play the hitsound more often than this for the electro lightning gun or the laser gauntlet"
+seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy"
+set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this"
//nifreks lockonrestart feature, used in team-based game modes, if set to 1 and all players readied up no other player can then join the game anymore, useful to block spectators from joining
set teamplay_lockonrestart 0 "it set to 1 in a team-based game, the teams are locked once all players readied up and the game restarted (no new players can join after restart unless using the server-command unlockteams)"
set sv_spectator_speed_multiplier 1.5
seta sv_spectate 1 "if set to 1, new clients are allowed to spectate or observe the game, if set to 0 joining clients spawn as players immediately (no spectating)"
seta sv_defaultcharacter 0 "master switch, if set to 1 the further configuration for replacing all player models, skins and colors is taken from the sv_defaultplayermodel, sv_defaultplayerskin and sv_defaultplayercolors variables"
-seta sv_defaultplayermodel "models/player/nexus.zym" "default model selection, only works if sv_defaultcharacter is set to 1"
+seta sv_defaultplayermodel "models/player/erebus.iqm" "default model selection, only works if sv_defaultcharacter is set to 1"
seta sv_defaultplayerskin 0 "each model has 1 or more skins (combination of model and skin = character), set which skin of the model you wish the default character to have, only works if sv_defaultcharacter is set to 1"
seta sv_defaultplayermodel_red "" "\"\" means see sv_defaultplayermodel"
seta sv_defaultplayerskin_red 0
set ekg 0 "Throw huge amounts of gibs"
cl_movement 1
+cl_movement_track_canjump 0
cl_stairsmoothspeed 200
-cl_forwardspeed $sv_maxspeed
-cl_backspeed $sv_maxspeed
-cl_sidespeed $sv_maxspeed
-cl_upspeed $sv_maxspeed
-cl_movement_accelerate $sv_accelerate
-cl_movement_airaccel_qw $sv_airaccel_qw
-cl_movement_airaccel_sideways_friction $sv_airaccel_sideways_friction
-cl_movement_airaccelerate $sv_airaccelerate
-cl_movement_edgefriction $edgefriction
-cl_movement_friction $sv_friction
-cl_movement_jumpvelocity $sv_jumpvelocity
-cl_movement_maxairspeed $sv_maxairspeed
-cl_movement_maxspeed $sv_maxspeed
-cl_movement_stepheight $sv_stepheight
-cl_movement_stopspeed $sv_stopspeed
-cl_movement_track_canjump 0 // till DP bug gets fixed
-cl_movement_wallfriction $sv_wallfriction
-cl_movement_wateraccelerate $sv_wateraccelerate
-cl_movement_waterfriction $sv_waterfriction
seta cl_autoswitch 1 "automatically switch to newly picked up weapons if they are better than what you are carrying"
alias autoswitch "set cl_autoswitch $1 ; cmd autoswitch $1"
seta skill_auto 0 "when 1, \"skill\" gets adjusted to match the best player on the map"
// general bot AI cvars
set bot_ai_thinkinterval 0.05
-set bot_ai_strategyinterval 3 "How often a new objective is chosen"
-set bot_ai_enemydetectioninterval 0.5 "How often bots pick a new target"
+set bot_ai_strategyinterval 5 "How often a new objective is chosen"
+set bot_ai_enemydetectioninterval 3 "How often bots pick a new target"
set bot_ai_enemydetectionradius 10000 "How far bots can see enemies"
-set bot_ai_dodgeupdateinterval 0.1 "How often scan for items to dodge. Currently not in use."
-set bot_ai_chooseweaponinterval 0.3 "How often the best weapon according to the situation will be chosen"
-set bot_ai_dangerdetectioninterval 0.1 "How often scan for waypoints with dangers near"
+set bot_ai_dodgeupdateinterval 0.2 "How often scan for items to dodge. Currently not in use."
+set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the situation will be chosen"
+set bot_ai_dangerdetectioninterval 0.25 "How often scan for waypoints with dangers near"
set bot_ai_dangerdetectionupdates 64 "How many waypoints will be considered for danger detection"
set bot_ai_aimskill_blendrate 2 "How much correction will be applied to the aiming angle"
set bot_ai_aimskill_fixedrate 15
-set bot_ai_aimskill_firetolerance_distdegrees 180
+set bot_ai_aimskill_firetolerance_distdegrees 100
set bot_ai_aimskill_firetolerance_mindegrees 2 "Minimum angle tolerance. Used on large distances"
set bot_ai_aimskill_firetolerance_maxdegrees 60 "Maximum firing angle. Used on close range"
set bot_ai_aimskill_mouse 1 "How much of the aiming filters are applied"
set bot_ai_keyboard_distance 250 "Keyboard emulation is disabled after this distance to the goal"
-set bot_ai_keyboard_treshold 0.57
+set bot_ai_keyboard_threshold 0.57
set bot_ai_aimskill_offset 0.3 "Amount of error induced to the bots aim"
set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming"
set bot_ai_custom_weapon_priority_distances "300 850" "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
-set bot_ai_custom_weapon_priority_far "minstanex nex campingrifle rocketlauncher minelayer grenadelauncher electro hagar hlac crylink laser uzi fireball seeker shotgun tuba" "Desired weapons for far distances ordered by priority"
-set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker minelayer grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba" "Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba seeker hagar crylink minelayer grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball" "Desired weapons for close distances ordered by priority"
+set bot_ai_custom_weapon_priority_far "minstanex nex sniperrifle electro rocketlauncher grenadelauncher hagar hlac crylink laser uzi fireball seeker shotgun tuba minelayer" "Desired weapons for far distances ordered by priority"
+set bot_ai_custom_weapon_priority_mid "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi sniperrifle crylink hlac hagar shotgun laser tuba minelayer" "Desired weapons for middle distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro sniperrifle rocketlauncher laser fireball minelayer" "Desired weapons for close distances ordered by priority"
set bot_ai_weapon_combo 1 "Enable bots to do weapon combos"
-set bot_ai_weapon_combo_threshold 0.3 "Try to make a combo N seconds after the last attack"
+set bot_ai_weapon_combo_threshold 0.4 "Try to make a combo N seconds after the last attack"
set bot_ai_friends_aware_pickup_radius "500" "Bots will not pickup items if a team mate is this distance near the item"
set bot_ai_ignoregoal_timeout 3 "Ignore goals making bots to get stuck in front of a wall for N seconds"
set bot_ai_bunnyhop_skilloffset 7 "Bots with skill equal or greater than this value will perform the \"bunnyhop\" technique"
-set bot_ai_bunnyhop_startdistance 250 "Run to goals located further than this distance"
-set bot_ai_bunnyhop_stopdistance 220 "Stop jumping after reaching this distance to the goal"
-set bot_ai_bunnyhop_firstjumpdelay 0.5 "Start running to the goal only if it was seen for more than N seconds"
+set bot_ai_bunnyhop_startdistance 100 "Run to goals located further than this distance"
+set bot_ai_bunnyhop_stopdistance 125 "Stop jumping after reaching this distance to the goal"
+set bot_ai_bunnyhop_firstjumpdelay 0.2 "Start running to the goal only if it was seen for more than N seconds"
set bot_god 0 "god mode for bots"
-set bot_ai_navigation_jetpack 0 "Enable bots to navigat maps using the jetpack"
+set bot_ai_navigation_jetpack 0 "Enable bots to navigate maps using the jetpack"
set bot_ai_navigation_jetpack_mindistance 3500 "Bots will try fly to objects located farther than this distance"
// Better don't touch these, there are hard to tweak!
set bot_ai_aimskill_order_mix_1st 0.01 "Amount of the 1st filter output to apply to the aiming angle"
locs_enable 0
pausable 0
-seta g_spawnshieldtime 0.300000 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
+seta g_spawnshieldtime 1.000000 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
seta g_antilag 2 "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
+set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
set g_antilag_nudge 0 "don't touch"
set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
set g_shootfromclient 1 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed, and defaulted to, too; see also cl_gunalign"
set g_minstagib_ammo_start 10 "starting ammo"
set g_minstagib_ammo_drop 5 "how much ammo you'll get for weapons or cells"
set g_minstagib_invis_alpha 0.15
-set g_minstagib_speed_jumpheight 1.8 "jump height multiplier that applies while you carry the invincibility powerup"
-set g_minstagib_speed_moverate 1.25 "speed-multiplier that applies while you carry the invincibility powerup"
+set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup"
set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health"
set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
set g_weaponarena_random "0" "if set to a number, only that weapon count is given on every spawn (randomly)"
+set g_weaponarena_random_with_laser "1" "additionally, always provide the laser in random weapon arena games"
set g_midair 0 "if set to 1 you can only apply damage to your opponent while he is airborne"
set g_midair_shieldtime 0.3 "number of seconds you are still invincible since you lost contact to the ground"
set g_spawnsound 1 "set to 0 if you don't want to hear the spawn sound when a player spawns"
seta g_ctf_win_mode 0 "0: captures only, 1: captures, then points, 2: points only"
seta g_ctf_ignore_frags 0 "1: regular frags give no points"
+set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze teammates by standing next to them"
+seta g_freezetag_warmup 5 "Time players get to run around before the round starts"
+seta g_freezetag_point_limit -1 "Freeze Tag point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_freezetag_point_leadlimit -1 "Freeze Tag point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_freezetag_revive_speed 0.4 "Speed for reviving a frozen teammate"
+seta g_freezetag_revive_clearspeed 1.6 "Speed at which reviving progress gets lost when out of range"
+seta g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him"
+seta g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with"
+
// 50% of the spawns shall be far away from any players
set g_spawn_furthest 0.5
// respawn delay
// to force disable delay or waves, set them to 0.125
set g_ctf_respawn_delay 0
set g_ctf_respawn_waves 0
+set g_ctf_weapon_stay 0
set g_dm_respawn_delay 0
set g_dm_respawn_waves 0
+set g_dm_weapon_stay 0
set g_dom_respawn_delay 0
set g_dom_respawn_waves 0
+set g_dom_weapon_stay 0
set g_lms_respawn_delay 0
set g_lms_respawn_waves 0
+set g_lms_weapon_stay 0
set g_rune_respawn_delay 0
set g_rune_respawn_waves 0
+set g_rune_weapon_stay 0
set g_tdm_respawn_delay 0
set g_tdm_respawn_waves 0
+set g_tdm_weapon_stay 0
set g_kh_respawn_delay 0
set g_kh_respawn_waves 0
+set g_kh_weapon_stay 0
set g_arena_respawn_delay 0
set g_arena_respawn_waves 0
+set g_arena_weapon_stay 0
set g_ca_respawn_delay 0
set g_ca_respawn_waves 0
+set g_ca_weapon_stay 0
set g_ca_damage2score_multiplier 0.01
set g_ca_round_timelimit 180
set g_nexball_respawn_delay 0
set g_nexball_respawn_waves 0
+set g_nexball_weapon_stay 0
set g_as_respawn_delay 0
set g_as_respawn_waves 0
+set g_as_weapon_stay 0
set g_ons_respawn_delay 0
set g_ons_respawn_waves 0
+set g_ons_weapon_stay 0
set g_rc_respawn_waves 0
set g_rc_respawn_delay 0
+set g_rc_weapon_stay 0
set g_cts_respawn_waves 0
-set g_cts_respawn_delay 0.25
+set g_cts_respawn_delay 0
set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
+set g_cts_weapon_stay 1
+set g_freezetag_respawn_waves 0
+set g_freezetag_respawn_delay 0
+set g_freezetag_weapon_stay 0
+set g_ka_respawn_delay 0
+set g_ka_respawn_waves 0
+set g_ka_weapon_stay 0
// overtime
seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
// common team values
set g_tdm 0 "Team Deathmatch: the team who kills their opponents most often wins"
-seta teamplay_default 4 "default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the following four cvars"
-seta g_mirrordamage 0.300000 "for teamplay 4: mirror damage factor"
-seta g_friendlyfire 0.100000 "for teamplay 4: fiendly fire factor"
-seta g_teamdamage_threshold 50 "for teamplay 4: threshold over which to apply mirror damage"
-seta g_teamdamage_resetspeed 30 "for teamplay 4: how fast player's teamdamage count decreases"
+seta teamplay_mode 4 "default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the following four cvars"
+seta g_mirrordamage 0.700000 "for teamplay 4: mirror damage factor"
+seta g_mirrordamage_virtual 1 "for teamplay 4: do not actually apply mirror damage, just show graphics effect for it"
+seta g_friendlyfire 0.500000 "for teamplay 4: fiendly fire factor"
+seta g_friendlyfire_virtual 1 "for teamplay 4: do not actually apply friendly fire, just show graphics effect for it"
+seta g_friendlyfire_virtual_force 1 "for teamplay 4: apply force even though damage was made virtual only"
+seta g_teamdamage_threshold 40 "for teamplay 4: threshold over which to apply mirror damage"
+seta g_teamdamage_resetspeed 20 "for teamplay 4: how fast player's teamdamage count decreases"
set deathmatch_force_teamplay 0 "Always play TDM instead of DM"
seta g_balance_teams 0 "automatically balance out players entering instead of asking them for their preferred team"
set g_balance_rune_speed_atkrate 0.66
set g_balance_curse_slow_atkrate 1.5
set g_balance_rune_speed_combo_atkrate 1.2
-set g_balance_rune_speed_moverate 1.25
-set g_balance_curse_slow_moverate 0.8
-set g_balance_rune_speed_combo_moverate 0.9
-set g_balance_rune_speed_jumpheight 1.4
-set g_balance_curse_slow_jumpheight 1.0
-set g_balance_rune_speed_combo_jumpheight 1.0
+set g_balance_rune_speed_highspeed 1.5
+set g_balance_curse_slow_highspeed 0.6
+set g_balance_rune_speed_combo_highspeed 0.9
// domination
set g_domination 0 "Domination: capture and hold control points to gain points"
// onslaught
set g_onslaught 0 "Onslaught: take control points towards the enemy generator and then destroy it"
-set g_onslaught_gen_health 5000
+set g_onslaught_gen_health 2500
set g_onslaught_cp_health 1000
set g_onslaught_cp_buildhealth 100
-set g_onslaught_cp_buildtime 10
+set g_onslaught_cp_buildtime 5
set g_onslaught_cp_regen 20
// assault
set g_nexball_basketball_delay_hold_forteam 60 "time before a ball reset when a team holds the ball for too long"
set g_nexball_basketball_teamsteal 1 "1 to allow players to steal from teammates, 0 to disallow"
-set g_nexball_basketball_carrier_speed 0.9 "speed multiplier for the ballcarrier"
+set g_nexball_basketball_carrier_highspeed 0.8 "speed multiplier for the ballcarrier"
set g_nexball_meter_period 1 "time to make a full cycle on the power meter"
set g_nexball_basketball_meter 1 "use the power meter for basketball"
r_picmipworld 1
gl_picmip_world 0
gl_picmip_sprites 0
-gl_picmip_other 2 // so, picmip -2 is best possible quality
+gl_picmip_other 1 // so, picmip -1 is best possible quality
r_mipsprites 1
r_mipskins 1
r_shadow_realtime_world_lightmaps 1
seta cl_sound_maptime_warning "1" "play announcer sound telling you the remaining maptime - 0: do not play at all, 1: play at one minute, 2: play at five minutes, 3: play both"
seta cl_notify_carried_items "3" "notify you of carried items when you obtain them (e.g. flags in CTF) - 0: disabled, 1: notify of taken items, 2: notify of picking up dropped items, 3: notify of both"
-seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy"
seta cl_announcer default "name of the announcer you wish to use from data/sound/announcer"
// startmap_dm is used when running with the -listen or -dedicated commandline options
alias -fire2 -button3
alias +attack2 +button3 // old alias from Nexuiz
alias -attack2 -button3 // old alias name from Nexuiz
-alias +zoom +button4
-alias -zoom -button4
alias +crouch +button5
alias -crouch -button5
alias weapnext "_weapnext_${cl_weaponpriority_useforcycling}"
alias _weapprev_2 "impulse 12"
alias weapbest "impulse 13"
+// experimental zoom toggle (can be in wrong state at start of a game, though)
+set _togglezoom +
+alias +zoom "set _togglezoom -; +button4"
+alias -zoom "set _togglezoom +; -button4"
+alias togglezoom "${_togglezoom}zoom"
+
alias reload "impulse 20"
// movement
alias vmaster "cmd vote master"
alias vlogin "cmd vote login $*"
alias vdo "cmd vote do $*"
-alias vyes "cmd vote yes"
-alias vno "cmd vote no"
+alias vyes "cl_cmd vyes"
+alias vno "cl_cmd vno"
alias vdontcare "cmd vote dontcare"
alias vabstain "cmd vote abstain"
// singleplayer campaign
set g_campaign 0
set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
-seta g_campaign_name "xonotic25"
+seta g_campaign_name "xonoticbeta"
set g_campaign_skill 0
set g_campaignxonotic20_index 0
set g_campaignxonotic25_index 1
alias singleplayer_levellist "set scmenu_campaign_dump 1; togglemenu; wait; togglemenu"
// Green's fullbright skins
-alias cl_fbskin_green "playermodel models/player/nexus.zym; playerskin 6; color 3 3"
-alias cl_fbskin_red "playermodel models/player/nexus.zym; playerskin 6; color 4 4"
-alias cl_fbskin_orange "playermodel models/player/nexus.zym; playerskin 6; color 14 14"
-alias cl_fbskin_off "playermodel models/player/nexus.zym; playerskin 0"
-alias sv_fbskin_green "g_fullbrightplayers 1; sv_defaultcharacter 1; sv_defaultplayermodel models/player/nexus.zym; sv_defaultplayerskin 6; sv_defaultplayercolors 51"
-alias sv_fbskin_red "g_fullbrightplayers 1; sv_defaultcharacter 1; sv_defaultplayermodel models/player/nexus.zym; sv_defaultplayerskin 6; sv_defaultplayercolors 68"
-alias sv_fbskin_orange "g_fullbrightplayers 1; sv_defaultcharacter 1; sv_defaultplayermodel models/player/nexus.zym; sv_defaultplayerskin 6; sv_defaultplayercolors 238"
-alias sv_fbskin_off "g_fullbrightplayers 0; sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultplayercolors \"\""
+alias cl_fbskin_green "playermodel models/player/erebus.iqm; playerskin 1; color 3 3"
+alias cl_fbskin_red "playermodel models/player/erebus.iqm; playerskin 1; color 4 4"
+alias cl_fbskin_orange "playermodel models/player/erebus.iqm; playerskin 1; color 14 14"
+alias cl_fbskin_off "playermodel models/player/erebus.iqm; playerskin 0"
+alias sv_fbskin_green "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 51"
+alias sv_fbskin_red "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 68"
+alias sv_fbskin_orange "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 238"
+alias sv_fbskin_off "sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultplayercolors \"\""
seta sv_servermodelsonly 1
seta g_keyhunt_teams_override 0
set g_keyhunt_teams 0
+// keepaway
+set g_keepaway 0 "game mode which focuses around a ball, look at g_keepaway_win_mode for further details"
+set g_keepaway_score_bckill 1 "enable scoring points (y/n) for ball carrier kills (value is how many points to award)"
+set g_keepaway_score_killac 1 "amount of points to give when you kill someone while you have the ball"
+set g_keepaway_score_timeinterval 1 "amount of time it takes between intervals for timepoints to be added to the score"
+set g_keepaway_score_timepoints 0 "points to add to score per timeinterval, 0 for no points"
+set g_keepaway_ballcarrier_effects 8 "Add together the numbers you want: EF_ADDITIVE (32) / EF_NODEPTHTEST (8192) / EF_DIMLIGHT (8)"
+set g_keepaway_ballcarrier_highspeed 1 "speed multiplier done to the person holding the ball (recommended when used with some mutators)"
+set g_keepaway_ballcarrier_damage 1 "damage multiplier while holding the ball"
+set g_keepaway_ballcarrier_force 1 "force multiplier while holding the ball"
+set g_keepaway_ballcarrier_selfdamage 1 "self damage multiplier while holding the ball"
+set g_keepaway_ballcarrier_selfforce 1 "self force multiplier while holding the ball"
+set g_keepaway_noncarrier_warn 1 "warn players when they kill without holding the ball"
+set g_keepaway_noncarrier_damage 1 "damage done to other players if both you and they don't have the ball"
+set g_keepaway_noncarrier_force 1 "force done to other players if both you and they don't have the ball"
+set g_keepaway_noncarrier_selfdamage 1 "self damage if you don't have the ball"
+set g_keepaway_noncarrier_selfforce 1 "self force if you don't have the ball"
+set g_keepawayball_effects 0 "Add together the numbers you want: EF_ADDITIVE (32) / EF_NODEPTHTEST (8192) / EF_DIMLIGHT (8)"
+set g_keepawayball_trail_color 254 "particle trail color from player/ball"
+set g_keepawayball_damageforcescale 3 "Scale of force which is applied to the ball by weapons/explosions/etc"
+set g_keepawayball_respawntime 10 "if no one picks up the ball, how long to wait until the ball respawns"
+seta g_keepaway_teams_override 0
+set g_keepaway_teams 0
+
// so it can be stuffcmd-ed still
set cl_gravity 800 "but ignored anyway"
seta hud_panel_weapons_label 1 "1 = show number of weapon, 2 = show bound key of weapon"
seta hud_panel_weapons_complainbubble_time 1 "time that a new entry stays until it fades out"
seta hud_panel_weapons_complainbubble_fadetime 0.25 "fade out time"
-seta hud_panel_weapons_accuracy 1 "show accuracy color as the weapon icon background"
-seta hud_panel_weapons_accuracy_color0 "1 0 0"
-seta hud_panel_weapons_accuracy_color1 "1 1 0"
-seta hud_panel_weapons_accuracy_color2 "0 1 0"
-seta hud_panel_weapons_accuracy_color_levels "0 20 100" "accuracy values at which a specified color (hud_panel_weapons_accuracy_color<X>) will be used. If your accuracy is between 2 of these values then a mix of the Xth and X+1th colors will be used. You can specify up to 10 values, in increasing order"
+seta hud_panel_weapons_accuracy 1 "show accuracy color as the weapon icon background; colors can be configured with accuracy_color* cvars"
seta hud_panel_weapons_ammo 1 "show ammo as a status bar"
seta hud_panel_weapons_ammo_full_shells 50 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_nails 200 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_cells 80 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_rockets 80 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this ammo count"
-seta hud_panel_weapons_timeout "3" "panel disappears if you don't switch weapon for this amount of seconds"
-seta hud_panel_weapons_timeout_effect "1" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
+
+seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
+
+seta hud_panel_healtharmor_maxhealth "250" "when you have this much health, the health status bar is full"
+seta hud_panel_healtharmor_maxarmor "150" "when you have this much armor, the armor status bar is full"
seta hud_panel_notify_time 10 "time that a new entry stays until it fades out"
seta hud_panel_notify_fadetime 3 "fade out time"
seta hud_showbinds 1 "the way to show the keys to press in HUD messages: 0 displays commands, 1 bound keys, 2 both"
seta hud_showbinds_limit 2 "maximum number of bound keys to show for a command. 0 for unlimited"
+seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
+
+seta hud_damage 0.55 "an improved version of gl_polyblend for damage, draw an image instead when hurt"
+seta hud_damage_gentle_alpha_multiplier 0.10 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
+seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
+seta hud_damage_color "1 0 0" "color of flash"
+seta hud_damage_factor 0.025 "(damage * factor) = how much to add to the alpha value"
+seta hud_damage_fade_rate 0.75 "how much to subtract from the alpha value each second"
+seta hud_damage_maxalpha 1.5 "how much to limit the alpha value to"
+seta hud_damage_pain_threshold 0.1 "how much alpha to ignore (must be bigger than the hud_damage_factor so that e.g. rot is ignored)"
+seta hud_damage_pain_threshold_lower 1.25 "how much we lower pain_threshold with when nearing 0 health (if pain_threshold gets negative then we always draw a flash at alpha = fabs(pain_threshold)"
+seta hud_damage_pain_threshold_lower_health 50 "at which health we start lowering pain_threshold"
+seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
+seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
+
+seta hud_contents 1 "an improved version of gl_polyblend for liquids such as water/lava/slime, draw a filler when inside the liquid"
+seta hud_contents_factor 1 "factor at which to multiply the current faded value."
+seta hud_contents_fadeintime 0.02 "factor of time it takes for the alpha level to reach normal value when entering the liquid"
+seta hud_contents_fadeouttime 0.1 "factor of time it takes for the alpha level to reach normal value when leaving the liquid"
+seta hud_contents_lava_alpha 0.7 "alpha of the lava color blend when inside it"
+seta hud_contents_lava_color "0.8 0.1 0"
+seta hud_contents_slime_alpha 0.7 "alpha of the slime color blend when inside it"
+seta hud_contents_slime_color "0 0.4 0.1"
+seta hud_contents_water_alpha 0.5 "alpha of the water color blend when inside it"
+seta hud_contents_water_color "0.4 0.3 0.3"
+
// scoreboard
seta scoreboard_columns default
seta scoreboard_border_thickness 1 "scoreboard border thickness"
seta scoreboard_accuracy_border_thickness 1 "accuracy stats border thickness"
seta scoreboard_accuracy_doublerows 0 "use two rows instead of one"
-seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard"
+seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars"
seta scoreboard_color_bg_r 0 "red color component of the scoreboard background"
seta scoreboard_color_bg_g 0.4 "green color component of the scoreboard background"
seta scoreboard_color_bg_b 0.6 "blue color component of the scoreboard background"
seta scoreboard_offset_right 0.148 "how many pixels the scoreboard is offset from the right screen edge"
seta scoreboard_bg_scale 0.25 "scale for the tiled scoreboard background"
+seta accuracy_color_levels "0 20 100" "accuracy values at which a specified color (accuracy_color<X>) will be used. If your accuracy is between 2 of these values then a mix of the Xth and X+1th colors will be used. You can specify up to 10 values, in increasing order"
+seta accuracy_color0 "1 0 0"
+seta accuracy_color1 "1 1 0"
+seta accuracy_color2 "0 1 0"
+
// for menu server list (eventually make them have engine support?)
seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join"
seta menu_slist_showempty 1 "show servers even if they are no empty and have no opponents to play against"
// for menu weapon arena
set menu_weaponarena_with_laser 0 "also enable the Laser in this weapon arena"
-seta menu_maxplayers 8 "maxplayers value when the menu starts a game"
+seta menu_maxplayers 16 "maxplayers value when the menu starts a game"
// command executed before loading a map by the menu
// makes sure maxplayers is at least minplayers or bot_number + 1
set timelimit_decrement 5
set timelimit_min 5
set timelimit_max 60
-alias extendmatchtime "sv_cmd rpn /timelimit timelimit timelimit_max timelimit timelimit_increment add bound def"
-alias reducematchtime "sv_cmd rpn /timelimit timelimit timelimit_decrement sub timelimit_min timelimit bound def"
+alias extendmatchtime "sv_cmd extendmatchtime"
+alias reducematchtime "sv_cmd reducematchtime"
alias endmatch "timelimit -1"
// useful keybind to maximize the chat area temporarily
sv_gameplayfix_stepmultipletimes 1
// delay for "kill" to prevent abuse
-set g_balance_kill_delay 5
+set g_balance_kill_delay 2
+set g_balance_kill_antispam 5
// this feature is currently buggy in the engine (it appears to PREVENT any dropping in lots of maps, leading to weirdly aligned entities, and in some cases even CAUSES them to drop through solid, like in facing worlds nex)
sv_gameplayfix_droptofloorstartsolid 0
seta hud_fontsize 11
seta scr_centersize 12
seta hud_width 560
-// alias hud_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; scoreboard_columns_set"
-alias sbar_font "set _requested_sbar_font \"${*}\""
-sbar_font gfx/vera-sans 8 12 16 24 32
// these entities are not referenced by anything directly, they just represent
// teams and are found by find() when needed
alias allready "sv_cmd allready"
-seta cl_weaponpriority "minstanex rocketlauncher nex minelayer grenadelauncher fireball hlac hagar seeker crylink campingrifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
+seta cl_weaponpriority "minstanex rocketlauncher nex minelayer grenadelauncher fireball hlac hagar seeker crylink sniperrifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
seta cl_weaponpriority_useforcycling 0 "when set, weapon cycling by the mouse wheel makes use of the weapon priority list (the special value 2 uses the weapon ID list for cycling)"
seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun. Default value: explosives"
seta cl_weaponpriority1 "minstanex nex crylink hlac electro laser" "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun. Default value: energy"
-seta cl_weaponpriority2 "minstanex nex campingrifle" "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun. Default value: hitscan exact"
-seta cl_weaponpriority3 "minstanex nex campingrifle uzi shotgun" "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun. Default value: hitscan all"
+seta cl_weaponpriority2 "minstanex nex sniperrifle" "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun. Default value: hitscan exact"
+seta cl_weaponpriority3 "minstanex nex sniperrifle uzi shotgun" "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun. Default value: hitscan all"
seta cl_weaponpriority4 "minelayer grenadelauncher hlac hagar crylink seeker shotgun" "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun. Default value: spam weapons"
seta cl_weaponpriority5 "laser hook porto" "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun. Default value: weapons for moving"
seta cl_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun"
alias ons_map "cl_cmd radar" // legacy alias
alias radar "cl_cmd radar"
-alias scoreboard_columns_set "cl_cmd scoreboard_columns_set $*"
+alias scoreboard_columns_set "" // aliased later
alias scoreboard_columns_help "cl_cmd scoreboard_columns_help $*"
alias _gl_flashblend_update_00 "gl_flashblend 1"
alias menu_showteamselect "menu_cmd directmenu TeamSelect"
alias menu_showhudexit "menu_cmd directmenu HUDExit"
alias menu_showhudoptions "menu_cmd directpanelhudmenu $*"
-alias menu_sync "menu_cmd sync"
bind f5 menu_showteamselect
set g_bugrigs 0
set camera_speed_chase 4 "Camera movement speed on the x/y/z axis while chasing the player"
set camera_speed_free 8 "Camera movement speed on the x/y/z axis in free mode"
set camera_speed_attenuation 10 "Camera movements attenuation factor. Bigger is smoother. Applies to mouse movements"
-set camera_mouse_treshold 0.5 "Use to ignore small mouse movements. This allows for smoother camera control"
+set camera_mouse_threshold 0.5 "Use to ignore small mouse movements. This allows for smoother camera control"
set camera_chase_smoothly 0 "Attenuate player movements (only in chase mode)"
set camera_look_player 0 "Always look to the player. Mouse input is ignored in this mode"
set camera_look_attenuation 8 "Attenuation of \"looking\" movements, only if camera_look_player is set. Bigger is smoother"
seta cl_gentle 0 "client side gentle mode, master switch for removing both gibs and messages"
seta cl_gentle_gibs 0 "client side gentle mode (only replaces gibs); when set to 1, white smoke replaces gibs, when set to 2, colorful clouds replace gibs"
seta cl_gentle_messages 0 "client side gentle mode (only replaces frag messages/centerprints)"
+seta cl_gentle_damage 0 "client side gentle mode (only replaces damage flash); when set to 1, a white flash replaces the blood image, when set to 2, a randomily colored flash is used instead"
seta cl_racetimer_position 0.25 "Y-axis positioning of the race timer (from 0 to 1)"
seta cl_showpressedkeys 0 "Show which movement keys someone is pressing: 1 for spectating, 2 for always"
seta cl_showacceleration 0 "show the XY acceleration of the player"
seta cl_showacceleration_z 0 "include the speed on the Z-axis"
seta cl_showacceleration_size 40 "height of the bar"
-seta cl_showacceleration_scale 5 "X-axis scale of the bar"
+seta cl_showacceleration_scale 1 "X-axis scale of the bar"
seta cl_showacceleration_alpha 0.5 "alpha of the bar"
seta cl_showacceleration_color_custom 0 "0 = dynamic color depending on acceleration, 1 = use custom color"
seta cl_showacceleration_color "1 0 0" "color of the bar, needs cl_showacceleration_color_custom to be 1"
alias cl_hook_gamestart_rc
alias cl_hook_gamestart_nexball
alias cl_hook_gamestart_cts
+alias cl_hook_gamestart_ka
+alias cl_hook_gamestart_freezetag
alias cl_hook_gameend
alias cl_hook_activeweapon
alias sv_hook_gamestart_rc
alias sv_hook_gamestart_nexball
alias sv_hook_gamestart_cts
+alias sv_hook_gamestart_ka
+alias sv_hook_gamestart_freezetag
alias sv_hook_gamerestart
alias sv_hook_gameend
seta g_ghost_items 1 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
seta g_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
-set sv_weaponstats_damagefile "" "when set to a file name, per-weapon damage stats get written to that file"
-set sv_weaponstats_killfile "" "when set to a file name, per-weapon kill stats get written to that file"
+set sv_weaponstats_file "" "when set to a file name, per-weapon stats get written to that file"
seta cl_noantilag 0 "turn this on if you believe antilag is bad"
set cl_lerpanim_maxdelta_framegroups 0.05 // must be faster than fastest weapon refire
set cl_lerpanim_maxdelta_server 0.1 // must be slower than slowest server controlled anim (e.g. animinfo stuff)
-// player ID
-seta _cl_userid "" "player ID (e.g. for tournaments)"
-
// FIXME workaround for engine bug
sv_gameplayfix_nudgeoutofsolid 0
// to div0: remove this once 5b7ac1706712977bbc0297d2d53294e73574c7cd (svn r9537) is in the stable branch of the engine again
set g_weaponreplace_minstanex ""
set g_weaponreplace_hook ""
set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
+set g_weaponreplace_sniperrifle ""
set g_weaponreplace_tuba ""
set g_weaponreplace_fireball ""
set g_weaponreplace_seeker ""
scr_loadingscreen_background 0
scr_loadingscreen_barcolor "0 0.5 1"
-scr_loadingscreen_barheight 20
+scr_loadingscreen_barheight 12
scr_loadingscreen_count 1
+scr_conforcewhiledisconnected 0
+scr_infobar_height 12
// DP cannot properly detect this, so rather turn off the detection
r_texture_dds_load_dxt1_noalpha 1
+r_texture_dds_load_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
+r_texture_dds_load_logfailure 0 // this engine feature SUCKS
// particles optimization
r_drawparticles_nearclip_min 8
// safe font defaults
r_font_hinting 1
r_font_disable_freetype 0
-r_font_size_snapping 2
+r_font_size_snapping 4
// database management
set sv_db_saveasdump 0 "write server.db in dump format (loads slower, easier to read/parse)"
// uid2name
seta cl_allow_uid2name -1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid2name (allows showing your name in race rankings for instance)"
+seta cl_allow_uidtracking 1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid tracking (allows associating your data with your player ID)"
+// FIXME set to -1 before release, once we have a dialog for this!
// polygonoffset for submodel SUCKS SUCKS SUCKS (only a hack for quake1, we don't need that)
r_polygonoffset_submodel_offset 0
// allow fullbright
set sv_allow_fullbright 0 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay"
+// auto-teams (team selection by player ID)
+// any player not listed is forced to spectate
+set g_forced_team_red "" "list of player IDs for red team"
+set g_forced_team_blue "" "list of player IDs for blue team"
+set g_forced_team_yellow "" "list of player IDs for yellow team"
+set g_forced_team_pink "" "list of player IDs for pink team"
+set g_forced_team_otherwise "default" "action if a non listed player joins (can be default for default action, spectate for forcing to spectate, or red, blue, yellow, pink)"
+
+// random charge stuff :P
+set g_weapon_charge_colormod_hdrmultiplier 4 "how much to multiply the colors by in the colormod vector"
+set g_weapon_charge_colormod_red_half 0
+set g_weapon_charge_colormod_green_half 0.5
+set g_weapon_charge_colormod_blue_half 1
+set g_weapon_charge_colormod_red_full 1
+set g_weapon_charge_colormod_green_full -0.5
+set g_weapon_charge_colormod_blue_full -1
+
+// player statistics server URI
+set g_playerstats_uri ""
+set g_playerstats_debug 0 "when 1, player stats are dumped to the console too"
+
+// create this cvar in case the engine did not
+set snd_soundradius 1200
+
+// loading screen
+scr_loadingscreen_scale 1
+scr_loadingscreen_scale_base 1
+scr_loadingscreen_scale_limit 1
+
// other config files
exec balanceXonotic.cfg
exec ctfscoring-ai.cfg
exec effects-normal.cfg
-exec physicsNoQWBunny-xpmbased.cfg
+exec physicsX0.cfg
exec turrets.cfg
// hud cvar descriptions
// exec the default skin config
// please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
exec hud_luminos.cfg
+
+// enable menu syncing
+alias menu_sync "menu_cmd sync"
+alias scoreboard_columns_set "cl_cmd scoreboard_columns_set $*"
originjitter 6 6 6
// dust/smoke drifting away from the impact
effect TE_GUNSHOT
-count 2
+count 0.8
type smoke
tex 0 8
color 0x101010 0x101010
velocityjitter 8 8 8
// dust/smoke staying at the impact
effect TE_GUNSHOT
-count 0.5
+count 0.2
type smoke
tex 0 8
color 0x505050 0x505050
velocityjitter 0 0 0
// bouncing sparks
effect TE_GUNSHOT
-count 5
+count 2.5
type spark
color 0x8f4333 0xfff31b
size 0.4 0.4
type alphastatic
notunderwater
tex 0 8
-count 3
+count 1
size 10 20
sizeincrease 25
alpha 300 550 756
type alphastatic
notunderwater
tex 36 36
-count 0.5
+count 0.2
size 10 11
sizeincrease 74
alpha 200 350 500
// sparks
effect shotgun_impact
notunderwater
-count 1.5
+count 0.5
type spark
tex 40 40
color 0xFDFFD9 0xFDFFD9
type alphastatic
notunderwater
tex 0 8
-count 3
+count 1.5
size 10 20
sizeincrease 15
alpha 300 550 456
bounce 6
velocitymultiplier 0.03
rotate 0 360 -50 50
-//derbis
+//debris
effect machinegun_impact
type alphastatic
notunderwater
// fire effect which make bright dot inside
effect hagar_explode
notunderwater
-count 5
+count 3.5
type smoke
tex 48 55
color 0xffe955 0xff5a00
type alphastatic
notunderwater
tex 0 8
-count 10
+count 7
size 20 40
sizeincrease 20
alpha 200 500 600
liquidfriction 4
velocityjitter 16 16 16
-
-
// rocket guiding start
// underwater bubbles
effect rocket_guide
stretchfactor 0.1
-
-// crylink linkjoin effect
+// crylink joinexplode effect
// decal
-// used in qcsrc/client/damage.qc: pointparticles(particleeffectnum("crylink_linkjoin"), org2, '0 0 0', 1)
-effect crylink_linkjoin
+// used in qcsrc/client/damage.qc: pointparticles(particleeffectnum("crylink_joinexplode"), org2, '0 0 0', 1)
+effect crylink_joinexplode
countabsolute 1
type decal
tex 47 47
-size 8 8
+size 24 24
alpha 256 256 0
originjitter 12 12 12
-//lightradius 60
-//lightradiusfade 300
+//lightradius 200
+//lightradiusfade 800
//lightcolor 3.2 0.4 4
// purple flare effect
-effect crylink_linkjoin
+effect crylink_joinexplode
countabsolute 1
type static
tex 39 39
color 0x504060 0x504060
-size 8 8
+size 24 24
alpha 256 256 512
// purple sparks
-effect crylink_linkjoin
-count 10
+effect crylink_joinexplode
+count 40
type spark
tex 41 41
color 0xA040C0 0xA040C0
bounce 2
-size 1 2
+size 6 6
alpha 256 256 1024
-velocityjitter 256 256 256
+velocityjitter 512 512 512
// purple splash
-effect crylink_linkjoin
+effect crylink_joinexplode
count 1.5
type static
color 0xE070FF 0xE070FF
-size 8 8
+size 16 16
alpha 256 256 512
-velocityjitter 8 8 8
+velocityjitter 32 32 32
// purple splash
-effect crylink_linkjoin
-count 1.5
+effect crylink_joinexplode
+count 3
type static
color 0xE070FF 0xE070FF
-size 8 8
+size 16 16
alpha 256 256 1024
-velocityjitter 32 32 32
+velocityjitter 256 256 256
+//sparks for keepaway ball touch
+// used nowhere in code
+effect kaball_sparks
+count 35
+type spark
+tex 40 40
+color 0xa9cacf 0x0054ff
+size 1 3
+alpha 0 256 556
+gravity 1
+bounce 1.5
+originjitter 1 1 1
+velocityjitter 300 300 300
+velocitymultiplier 0.5
+airfriction 3
+// weak rifle bullet trail (somewhat like a tracer)
+// used in qcsrc/server/w_common.qc: zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
+// used in qcsrc/client/projectile.qc: trailparticles(self, particleeffectnum("tr_bullet"), from, to)
+effect tr_rifle_weak
+trailspacing 128
+type spark
+color 0x800000 0xFF8020
+alpha 256 256 2560
+size 1.5 1.5
+stretchfactor 1
+velocitymultiplier 0.7
+effect tr_rifle_weak
+notunderwater
+tex 0 8
+trailspacing 48
+type static
+color 0x202020 0x404040
+size 4 4
+sizeincrease 0.4
+alpha 256 256 256
+airfriction -4
+velocityjitter 4 4 4
+type smoke
+effect tr_rifle_weak
+underwater
+trailspacing 192
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 2 2
+alpha 256 256 128
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
+// red smoke emiter
+// used nowhere in code
+effect red_smoke
+count 2
+type smoke
+tex 0 8
+color 0xff8866 0x331100
+size 60 120
+sizeincrease 0
+alpha 32 64 32
+gravity -0.007
+originjitter 0 0 0
+velocityjitter 0 0 0
+velocitymultiplier 5
+airfriction -1
+rotate 0 360 -30 30
+
+// pipe smoke emiter
+// used nowhere in code
+effect pipe_smoke
+count 2
+type smoke
+tex 0 8
+color 0x999999 0x555555
+size 5 10
+sizeincrease 35
+alpha 32 64 48
+gravity -0.015
+originjitter 0 0 0
+velocityjitter 0 0 5
+velocitymultiplier 15
+airfriction -1
+rotate 0 360 -180 180
mod_q3bsp_nolightmaps 0
r_bloom 1
r_coronas 1
+r_coronas_occlusionquery 1
r_damageblur 0.4
r_depthfirst 2
r_drawdecals_drawdistance 500
mod_q3bsp_nolightmaps 1
r_bloom 0
r_coronas 1
+r_coronas_occlusionquery 0
r_damageblur 0
r_depthfirst 0
r_drawdecals_drawdistance 200
mod_q3bsp_nolightmaps 0
r_bloom 0
r_coronas 1
+r_coronas_occlusionquery 0
r_damageblur 0
r_depthfirst 0
r_drawdecals_drawdistance 300
mod_q3bsp_nolightmaps 0
r_bloom 0
r_coronas 1
+r_coronas_occlusionquery 0
r_damageblur 0
r_depthfirst 1
r_drawdecals_drawdistance 300
mod_q3bsp_nolightmaps 1
r_bloom 0
r_coronas 1
+r_coronas_occlusionquery 0
r_damageblur 0
r_depthfirst 0
r_drawdecals_drawdistance 100
cl_decals_time 10
cl_particles_quality 1
gl_flashblend 0
-gl_picmip -2
+gl_picmip -1
gl_texture_anisotropy 16
mod_q3bsp_nolightmaps 0
r_bloom 1
r_coronas 1
+r_coronas_occlusionquery 1
r_damageblur 0.4
r_depthfirst 2
r_drawdecals_drawdistance 500
cl_decals_time 10
cl_particles_quality 1
gl_flashblend 0
-gl_picmip -2
+gl_picmip -1
gl_texture_anisotropy 16
mod_q3bsp_nolightmaps 0
r_bloom 1
r_coronas 1
+r_coronas_occlusionquery 1
r_damageblur 0.4
r_depthfirst 2
r_drawdecals_drawdistance 500
--- /dev/null
+#!/bin/sh
+
+main=balanceXonotic.cfg
+for X in balance*.cfg; do
+ case "$X" in
+ "$main")
+ ;;
+ *)
+ perl ../../misc/tools/cfgapply.pl "$main" "$X" > "$X.new" && mv "$X.new" "$X"
+ ;;
+ esac
+done
+git diff
COLOR_DIALOG_SINGLEPLAYER '1 1 1'
COLOR_DIALOG_CREDITS '1 1 1'
COLOR_DIALOG_WEAPONS '1 1 1'
-COLOR_DIALOG_RADAR '1 1 1'
+COLOR_DIALOG_WAYPOINTS '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
COLOR_DIALOG_SINGLEPLAYER '1 1 1'
COLOR_DIALOG_CREDITS '1 1 1'
COLOR_DIALOG_WEAPONS '1 1 1'
-COLOR_DIALOG_RADAR '1 1 1'
+COLOR_DIALOG_WAYPOINTS '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
COLOR_DIALOG_SINGLEPLAYER '1 1 1'
COLOR_DIALOG_CREDITS '1 1 1'
COLOR_DIALOG_WEAPONS '1 1 1'
-COLOR_DIALOG_RADAR '1 1 1'
+COLOR_DIALOG_WAYPOINTS '1 1 1'
COLOR_DIALOG_SERVERINFO '1 1 1'
COLOR_DIALOG_CVARS '1 0 0'
seta cl_swapattacks_laser 0
seta cl_swapattacks_shotgun 0
seta cl_swapattacks_uzi 0
-seta cl_swapattacks_campingrifle 0
+seta cl_swapattacks_sniperrifle 0
seta cl_swapattacks_grenadelauncher 0
seta cl_swapattacks_electro 0
seta cl_swapattacks_hlac 0
seta hud_panel_weapons_ammo_color "0 1 0"
seta hud_panel_weapons_ammo_alpha "1"
seta hud_panel_weapons_aspect "2"
+seta hud_panel_weapons_timeout "3"
+seta hud_panel_weapons_timeout_effect "1"
seta hud_panel_ammo 1
seta hud_panel_ammo_pos "0.190000 0.920000"
seta hud_panel_ammo_bg_padding ""
seta hud_panel_ammo_onlycurrent "0"
seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
seta hud_panel_powerups 1
seta hud_panel_powerups_pos "0.660000 0.940000"
seta hud_panel_powerups_iconalign "4"
seta hud_panel_powerups_baralign "4"
seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
seta hud_panel_healtharmor 1
seta hud_panel_healtharmor_pos "0.330000 0.920000"
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
-seta hud_panel_healtharmor_flip "0
+seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "4"
seta hud_panel_healtharmor_baralign "4"
seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
seta hud_panel_notify 1
seta hud_panel_notify_pos "0.660000 0.730000"
seta hud_panel_notify_bg_border ""
seta hud_panel_notify_bg_padding ""
seta hud_panel_notify_flip "0"
+seta hud_panel_notify_fontsize "0.8"
seta hud_panel_notify_print "1"
seta hud_panel_timer 1
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar 1
+seta hud_panel_radar 2 // enabled for keepaway and to make the HUD consistent throughout game modes
seta hud_panel_radar_pos "0.030000 0.020000"
seta hud_panel_radar_size "0.170000 0.220000"
seta hud_panel_radar_bg ""
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo 1
+seta hud_panel_engineinfo 0
seta hud_panel_engineinfo_pos "0.910000 0.970000"
seta hud_panel_engineinfo_size "0.090000 0.030000"
seta hud_panel_engineinfo_bg "0"
--- /dev/null
+seta hud_skin "luminos"
+seta hud_panel_bg "0"
+seta hud_panel_bg_color "1 0.4375 0"
+seta hud_panel_bg_color_team "0"
+seta hud_panel_bg_alpha "1"
+seta hud_panel_bg_border "8"
+seta hud_panel_bg_padding "2"
+seta hud_panel_fg_alpha "1"
+
+seta hud_dock "0"
+seta hud_dock_color "0 0.449576 0.860796"
+seta hud_dock_color_team "0.700000"
+seta hud_dock_alpha "1"
+
+seta hud_progressbar_alpha "0.500000"
+seta hud_progressbar_strength_color "0 0 0.6"
+seta hud_progressbar_shield_color "0.6 0 0.6"
+seta hud_progressbar_health_color "0.6 0 0"
+seta hud_progressbar_armor_color "0 0.6 0"
+seta hud_progressbar_fuel_color "0.6 0.6 0"
+seta hud_progressbar_nexball_color "0.7 0.1 0"
+
+seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 "
+
+seta hud_configure_grid "1"
+seta hud_configure_grid_xsize "0.010000"
+seta hud_configure_grid_ysize "0.010000"
+
+seta scr_centerpos "0.25"
+
+seta hud_panel_weapons 1
+seta hud_panel_weapons_pos "0.350000 0.940000"
+seta hud_panel_weapons_size "0.300000 0.060000"
+seta hud_panel_weapons_bg ""
+seta hud_panel_weapons_bg_color ""
+seta hud_panel_weapons_bg_color_team ""
+seta hud_panel_weapons_bg_alpha ""
+seta hud_panel_weapons_bg_border ""
+seta hud_panel_weapons_bg_padding ""
+seta hud_panel_weapons_complainbubble "1"
+seta hud_panel_weapons_complainbubble_padding "-10"
+seta hud_panel_weapons_complainbubble_color_outofammo "0.8 0 0"
+seta hud_panel_weapons_complainbubble_color_donthave "0.8 0.5 0"
+seta hud_panel_weapons_complainbubble_color_unavailable "0 0.3 0.8"
+seta hud_panel_weapons_ammo_color "0 1 0"
+seta hud_panel_weapons_ammo_alpha "1"
+seta hud_panel_weapons_aspect "2"
+seta hud_panel_weapons_timeout "0"
+seta hud_panel_weapons_timeout_effect "0"
+
+seta hud_panel_ammo 1
+seta hud_panel_ammo_pos "0.650000 0.890000"
+seta hud_panel_ammo_size "0.055000 0.110000"
+seta hud_panel_ammo_bg ""
+seta hud_panel_ammo_bg_color ""
+seta hud_panel_ammo_bg_color_team ""
+seta hud_panel_ammo_bg_alpha ""
+seta hud_panel_ammo_bg_border ""
+seta hud_panel_ammo_bg_padding ""
+seta hud_panel_ammo_onlycurrent "0"
+seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
+
+seta hud_panel_powerups 1
+seta hud_panel_powerups_pos "0.290000 0.890000"
+seta hud_panel_powerups_size "0.055000 0.110000"
+seta hud_panel_powerups_bg "0"
+seta hud_panel_powerups_bg_color ""
+seta hud_panel_powerups_bg_color_team ""
+seta hud_panel_powerups_bg_alpha ""
+seta hud_panel_powerups_bg_border ""
+seta hud_panel_powerups_bg_padding "-3"
+seta hud_panel_powerups_flip "1"
+seta hud_panel_powerups_iconalign "1"
+seta hud_panel_powerups_baralign "1"
+seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
+
+seta hud_panel_healtharmor 1
+seta hud_panel_healtharmor_pos "0.350000 0.890000"
+seta hud_panel_healtharmor_size "0.300000 0.050000"
+seta hud_panel_healtharmor_bg ""
+seta hud_panel_healtharmor_bg_color ""
+seta hud_panel_healtharmor_bg_color_team ""
+seta hud_panel_healtharmor_bg_alpha ""
+seta hud_panel_healtharmor_bg_border ""
+seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_flip "0"
+seta hud_panel_healtharmor_iconalign "3"
+seta hud_panel_healtharmor_baralign "3"
+seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
+
+seta hud_panel_notify 1
+seta hud_panel_notify_pos "0 0"
+seta hud_panel_notify_size "0.210000 0.260000"
+seta hud_panel_notify_bg "0"
+seta hud_panel_notify_bg_color ""
+seta hud_panel_notify_bg_color_team ""
+seta hud_panel_notify_bg_alpha ""
+seta hud_panel_notify_bg_border ""
+seta hud_panel_notify_bg_padding ""
+seta hud_panel_notify_flip "1"
+seta hud_panel_notify_fontsize "0.8"
+seta hud_panel_notify_print "0"
+
+seta hud_panel_timer 1
+seta hud_panel_timer_pos "0.435000 0"
+seta hud_panel_timer_size "0.135000 0.060000"
+seta hud_panel_timer_bg "0"
+seta hud_panel_timer_bg_color ""
+seta hud_panel_timer_bg_color_team ""
+seta hud_panel_timer_bg_alpha ""
+seta hud_panel_timer_bg_border ""
+seta hud_panel_timer_bg_padding "0"
+
+seta hud_panel_radar 2
+seta hud_panel_radar_pos "0.810000 0"
+seta hud_panel_radar_size "0.190000 0.250000"
+seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg_color ""
+seta hud_panel_radar_bg_color_team ""
+seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_border "0"
+seta hud_panel_radar_bg_padding "0"
+seta hud_panel_radar_foreground_alpha "0.500000"
+
+seta hud_panel_score 1
+seta hud_panel_score_pos "0.465000 0.045000"
+seta hud_panel_score_size "0.090000 0.060000"
+seta hud_panel_score_bg ""
+seta hud_panel_score_bg_color ""
+seta hud_panel_score_bg_color_team ""
+seta hud_panel_score_bg_alpha ""
+seta hud_panel_score_bg_border ""
+seta hud_panel_score_bg_padding ""
+
+seta hud_panel_racetimer 1
+seta hud_panel_racetimer_pos "0.360000 0.090000"
+seta hud_panel_racetimer_size "0.280000 0.090000"
+seta hud_panel_racetimer_bg "0"
+seta hud_panel_racetimer_bg_color ""
+seta hud_panel_racetimer_bg_color_team ""
+seta hud_panel_racetimer_bg_alpha ""
+seta hud_panel_racetimer_bg_border ""
+seta hud_panel_racetimer_bg_padding ""
+
+seta hud_panel_vote 1
+seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_size "0.170000 0.110000"
+seta hud_panel_vote_bg ""
+seta hud_panel_vote_bg_color ""
+seta hud_panel_vote_bg_color_team ""
+seta hud_panel_vote_bg_alpha ""
+seta hud_panel_vote_bg_border ""
+seta hud_panel_vote_bg_padding ""
+seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+
+seta hud_panel_modicons 1
+seta hud_panel_modicons_pos "0.560000 0"
+seta hud_panel_modicons_size "0.050000 0.100000"
+seta hud_panel_modicons_bg ""
+seta hud_panel_modicons_bg_color ""
+seta hud_panel_modicons_bg_color_team ""
+seta hud_panel_modicons_bg_alpha ""
+seta hud_panel_modicons_bg_border ""
+seta hud_panel_modicons_bg_padding ""
+
+seta hud_panel_pressedkeys 1
+seta hud_panel_pressedkeys_pos "0.450000 0.650000"
+seta hud_panel_pressedkeys_size "0.100000 0.110000"
+seta hud_panel_pressedkeys_bg "0"
+seta hud_panel_pressedkeys_bg_color ""
+seta hud_panel_pressedkeys_bg_color_team ""
+seta hud_panel_pressedkeys_bg_alpha ""
+seta hud_panel_pressedkeys_bg_border ""
+seta hud_panel_pressedkeys_bg_padding ""
+seta hud_panel_pressedkeys_aspect "1.600000"
+
+seta hud_panel_chat 1
+seta hud_panel_chat_pos "0 0.775000"
+seta hud_panel_chat_size "0.460000 0.110000"
+seta hud_panel_chat_bg "0"
+seta hud_panel_chat_bg_color ""
+seta hud_panel_chat_bg_color_team ""
+seta hud_panel_chat_bg_alpha ""
+seta hud_panel_chat_bg_border ""
+seta hud_panel_chat_bg_padding ""
+
+seta hud_panel_engineinfo 0
+seta hud_panel_engineinfo_pos "0.910000 0.970000"
+seta hud_panel_engineinfo_size "0.090000 0.030000"
+seta hud_panel_engineinfo_bg "0"
+seta hud_panel_engineinfo_bg_color ""
+seta hud_panel_engineinfo_bg_color_team ""
+seta hud_panel_engineinfo_bg_alpha ""
+seta hud_panel_engineinfo_bg_border ""
+seta hud_panel_engineinfo_bg_padding ""
+
+seta hud_panel_infomessages 1
+seta hud_panel_infomessages_pos "0.710000 0"
+seta hud_panel_infomessages_size "0.290000 0.100000"
+seta hud_panel_infomessages_bg "0"
+seta hud_panel_infomessages_bg_color ""
+seta hud_panel_infomessages_bg_color_team ""
+seta hud_panel_infomessages_bg_alpha ""
+seta hud_panel_infomessages_bg_border ""
+seta hud_panel_infomessages_bg_padding "0"
+seta hud_panel_infomessages_flip "1"
+
+menu_sync
--- /dev/null
+seta hud_skin "luminos_xhair"
+seta hud_panel_bg "0"
+seta hud_panel_bg_color "1 0.4375 0"
+seta hud_panel_bg_color_team "0"
+seta hud_panel_bg_alpha "1"
+seta hud_panel_bg_border "8"
+seta hud_panel_bg_padding "2"
+seta hud_panel_fg_alpha "1"
+
+seta hud_dock "0"
+seta hud_dock_color "0 0.449576 0.860796"
+seta hud_dock_color_team "0.700000"
+seta hud_dock_alpha "1"
+
+seta hud_progressbar_alpha "0.3"
+seta hud_progressbar_strength_color "0 0 0.6"
+seta hud_progressbar_shield_color "0.6 0 0.6"
+seta hud_progressbar_health_color "0.6 0 0"
+seta hud_progressbar_armor_color "0 0.6 0"
+seta hud_progressbar_fuel_color "0.6 0.6 0"
+seta hud_progressbar_nexball_color "0.7 0.1 0"
+
+seta _hud_panelorder "3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 "
+
+seta hud_configure_grid "1"
+seta hud_configure_grid_xsize "0.010000"
+seta hud_configure_grid_ysize "0.010000"
+
+seta scr_centerpos "0.25"
+
+seta hud_panel_weapons 1
+seta hud_panel_weapons_pos "0.350000 0.940000"
+seta hud_panel_weapons_size "0.300000 0.060000"
+seta hud_panel_weapons_bg ""
+seta hud_panel_weapons_bg_color ""
+seta hud_panel_weapons_bg_color_team ""
+seta hud_panel_weapons_bg_alpha ""
+seta hud_panel_weapons_bg_border ""
+seta hud_panel_weapons_bg_padding ""
+seta hud_panel_weapons_complainbubble "1"
+seta hud_panel_weapons_complainbubble_padding "-10"
+seta hud_panel_weapons_complainbubble_color_outofammo "0.8 0 0"
+seta hud_panel_weapons_complainbubble_color_donthave "0.8 0.5 0"
+seta hud_panel_weapons_complainbubble_color_unavailable "0 0.3 0.8"
+seta hud_panel_weapons_ammo_color "0 1 0"
+seta hud_panel_weapons_ammo_alpha "1"
+seta hud_panel_weapons_aspect "2"
+seta hud_panel_weapons_timeout "0"
+seta hud_panel_weapons_timeout_effect "0"
+
+seta hud_panel_ammo 1
+seta hud_panel_ammo_pos "0.450000 0.630000"
+seta hud_panel_ammo_size "0.080000 0.040000"
+seta hud_panel_ammo_bg ""
+seta hud_panel_ammo_bg_color ""
+seta hud_panel_ammo_bg_color_team ""
+seta hud_panel_ammo_bg_alpha ""
+seta hud_panel_ammo_bg_border ""
+seta hud_panel_ammo_bg_padding ""
+seta hud_panel_ammo_onlycurrent "1"
+seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "1"
+seta hud_panel_ammo_progressbar_name "progressbar_ammo"
+seta hud_panel_ammo_progressbar_xoffset "0.32"
+seta hud_panel_ammo_text "1"
+
+seta hud_panel_powerups 1
+seta hud_panel_powerups_pos "0.270000 0.940000"
+seta hud_panel_powerups_size "0.080000 0.060000"
+seta hud_panel_powerups_bg "0"
+seta hud_panel_powerups_bg_color ""
+seta hud_panel_powerups_bg_color_team ""
+seta hud_panel_powerups_bg_alpha ""
+seta hud_panel_powerups_bg_border ""
+seta hud_panel_powerups_bg_padding "-3"
+seta hud_panel_powerups_flip "1"
+seta hud_panel_powerups_iconalign "1"
+seta hud_panel_powerups_baralign "1"
+seta hud_panel_powerups_progressbar "1"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+
+seta hud_panel_healtharmor 1
+seta hud_panel_healtharmor_pos "0.350000 0.380000"
+seta hud_panel_healtharmor_size "0.070000 0.240000"
+seta hud_panel_healtharmor_bg "border_healtharmor"
+seta hud_panel_healtharmor_bg_color "0.464391 0.464391 0.464391"
+seta hud_panel_healtharmor_bg_color_team ""
+seta hud_panel_healtharmor_bg_alpha "0.600000"
+seta hud_panel_healtharmor_bg_border "-1"
+seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_flip "0"
+seta hud_panel_healtharmor_iconalign "1"
+seta hud_panel_healtharmor_baralign "1"
+seta hud_panel_healtharmor_progressbar "1"
+seta hud_panel_healtharmor_progressbar_health "progressbar_health"
+seta hud_panel_healtharmor_progressbar_armor "progressbar_armor"
+seta hud_panel_healtharmor_text "0"
+
+seta hud_panel_notify 1
+seta hud_panel_notify_pos "0 0"
+seta hud_panel_notify_size "0.210000 0.260000"
+seta hud_panel_notify_bg "0"
+seta hud_panel_notify_bg_color ""
+seta hud_panel_notify_bg_color_team ""
+seta hud_panel_notify_bg_alpha ""
+seta hud_panel_notify_bg_border ""
+seta hud_panel_notify_bg_padding ""
+seta hud_panel_notify_flip "1"
+seta hud_panel_notify_fontsize "0.8"
+seta hud_panel_notify_print "0"
+
+seta hud_panel_timer 1
+seta hud_panel_timer_pos "0.435000 0"
+seta hud_panel_timer_size "0.135000 0.060000"
+seta hud_panel_timer_bg "0"
+seta hud_panel_timer_bg_color ""
+seta hud_panel_timer_bg_color_team ""
+seta hud_panel_timer_bg_alpha ""
+seta hud_panel_timer_bg_border ""
+seta hud_panel_timer_bg_padding "0"
+
+seta hud_panel_radar 2
+seta hud_panel_radar_pos "0.810000 0"
+seta hud_panel_radar_size "0.190000 0.250000"
+seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg_color ""
+seta hud_panel_radar_bg_color_team ""
+seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_border "0"
+seta hud_panel_radar_bg_padding "0"
+seta hud_panel_radar_foreground_alpha "0.500000"
+
+seta hud_panel_score 1
+seta hud_panel_score_pos "0.465000 0.045000"
+seta hud_panel_score_size "0.090000 0.060000"
+seta hud_panel_score_bg ""
+seta hud_panel_score_bg_color ""
+seta hud_panel_score_bg_color_team ""
+seta hud_panel_score_bg_alpha ""
+seta hud_panel_score_bg_border ""
+seta hud_panel_score_bg_padding ""
+
+seta hud_panel_racetimer 1
+seta hud_panel_racetimer_pos "0.360000 0.090000"
+seta hud_panel_racetimer_size "0.280000 0.090000"
+seta hud_panel_racetimer_bg "0"
+seta hud_panel_racetimer_bg_color ""
+seta hud_panel_racetimer_bg_color_team ""
+seta hud_panel_racetimer_bg_alpha ""
+seta hud_panel_racetimer_bg_border ""
+seta hud_panel_racetimer_bg_padding ""
+
+seta hud_panel_vote 1
+seta hud_panel_vote_pos "0 0.890000"
+seta hud_panel_vote_size "0.170000 0.110000"
+seta hud_panel_vote_bg ""
+seta hud_panel_vote_bg_color ""
+seta hud_panel_vote_bg_color_team ""
+seta hud_panel_vote_bg_alpha ""
+seta hud_panel_vote_bg_border ""
+seta hud_panel_vote_bg_padding ""
+seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+
+seta hud_panel_modicons 1
+seta hud_panel_modicons_pos "0.560000 0"
+seta hud_panel_modicons_size "0.050000 0.100000"
+seta hud_panel_modicons_bg ""
+seta hud_panel_modicons_bg_color ""
+seta hud_panel_modicons_bg_color_team ""
+seta hud_panel_modicons_bg_alpha ""
+seta hud_panel_modicons_bg_border ""
+seta hud_panel_modicons_bg_padding ""
+
+seta hud_panel_pressedkeys 1
+seta hud_panel_pressedkeys_pos "0.450000 0.690000"
+seta hud_panel_pressedkeys_size "0.100000 0.110000"
+seta hud_panel_pressedkeys_bg "0"
+seta hud_panel_pressedkeys_bg_color ""
+seta hud_panel_pressedkeys_bg_color_team ""
+seta hud_panel_pressedkeys_bg_alpha ""
+seta hud_panel_pressedkeys_bg_border ""
+seta hud_panel_pressedkeys_bg_padding ""
+seta hud_panel_pressedkeys_aspect "1.600000"
+
+seta hud_panel_chat 1
+seta hud_panel_chat_pos "0 0.775000"
+seta hud_panel_chat_size "0.460000 0.110000"
+seta hud_panel_chat_bg "0"
+seta hud_panel_chat_bg_color ""
+seta hud_panel_chat_bg_color_team ""
+seta hud_panel_chat_bg_alpha ""
+seta hud_panel_chat_bg_border ""
+seta hud_panel_chat_bg_padding ""
+
+seta hud_panel_engineinfo 0
+seta hud_panel_engineinfo_pos "0.910000 0.970000"
+seta hud_panel_engineinfo_size "0.090000 0.030000"
+seta hud_panel_engineinfo_bg "0"
+seta hud_panel_engineinfo_bg_color ""
+seta hud_panel_engineinfo_bg_color_team ""
+seta hud_panel_engineinfo_bg_alpha ""
+seta hud_panel_engineinfo_bg_border ""
+seta hud_panel_engineinfo_bg_padding ""
+
+seta hud_panel_infomessages 1
+seta hud_panel_infomessages_pos "0.710000 0"
+seta hud_panel_infomessages_size "0.290000 0.100000"
+seta hud_panel_infomessages_bg "0"
+seta hud_panel_infomessages_bg_color ""
+seta hud_panel_infomessages_bg_color_team ""
+seta hud_panel_infomessages_bg_alpha ""
+seta hud_panel_infomessages_bg_border ""
+seta hud_panel_infomessages_bg_padding "0"
+seta hud_panel_infomessages_flip "1"
+
+menu_sync
seta hud_panel_weapons_ammo_color "0 1 0"
seta hud_panel_weapons_ammo_alpha "1"
seta hud_panel_weapons_aspect "2"
+seta hud_panel_weapons_timeout "0"
+seta hud_panel_weapons_timeout_effect "0"
seta hud_panel_ammo 1
seta hud_panel_ammo_pos "0.160000 0.910000"
seta hud_panel_ammo_bg_padding ""
seta hud_panel_ammo_onlycurrent "0"
seta hud_panel_ammo_iconalign "0"
+seta hud_panel_ammo_progressbar "0"
+seta hud_panel_ammo_progressbar_xoffset "0"
+seta hud_panel_ammo_progressbar_name "progressbar"
+seta hud_panel_ammo_text "1"
seta hud_panel_powerups 1
seta hud_panel_powerups_pos "0.660000 0.910000"
seta hud_panel_powerups_iconalign "0"
seta hud_panel_powerups_baralign "0"
seta hud_panel_powerups_progressbar "0"
+seta hud_panel_powerups_progressbar_strength "progressbar"
+seta hud_panel_powerups_progressbar_shield "progressbar"
+seta hud_panel_powerups_text "1"
seta hud_panel_healtharmor 1
seta hud_panel_healtharmor_pos "0.370000 0.930000"
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
-seta hud_panel_healtharmor_flip "0
+seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "0"
seta hud_panel_healtharmor_baralign "0"
seta hud_panel_healtharmor_progressbar "0"
+seta hud_panel_healtharmor_progressbar_health "progressbar"
+seta hud_panel_healtharmor_progressbar_armor "progressbar"
+seta hud_panel_healtharmor_text "1"
seta hud_panel_notify 0
seta hud_panel_notify_pos "0 0.650000"
seta hud_panel_notify_bg_border ""
seta hud_panel_notify_bg_padding ""
seta hud_panel_notify_flip "0"
+seta hud_panel_notify_fontsize "1"
seta hud_panel_notify_print "1"
seta hud_panel_timer 1
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo 1
+seta hud_panel_engineinfo 0
seta hud_panel_engineinfo_pos "0.887500 0.870000"
seta hud_panel_engineinfo_size "0.112500 0.030000"
seta hud_panel_engineinfo_bg "0"
"weaplast" "previously used"
"weapbest" "best"
"reload" "reload"
-"impulse 1" "laser"
-"impulse 2" "shotgun"
-"impulse 3" "machine gun / rifle"
-"impulse 4" "mortar"
-"impulse 5" "electro"
-"impulse 6" "crylink / hlac"
-"impulse 7" "nex / minstanex"
-"impulse 8" "hagar"
-"impulse 9" "rocket launcher / fireball"
-"impulse 14" "porto / hook"
+"impulse 1" "Laser"
+"impulse 2" "Shotgun"
+"impulse 3" "Machine Gun"
+"impulse 4" "Mortar / Mine Layer"
+"impulse 5" "Electro"
+"impulse 6" "Crylink / HLAC"
+"impulse 7" "Nex / MinstaNex / Rifle"
+"impulse 8" "Hagar / Seeker"
+"impulse 9" "Rocket Launcher / Fireball"
+"impulse 14" "Port-O-Launch / Hook"
"" ""
"" "View"
-"+zoom" "zoom"
+"+zoom" "hold zoom"
+"togglezoom" "toggle zoom"
"+showscores" "show scores"
-"+showaccuracy" "show accuracy"
"screenshot" "screen shot"
"" ""
"" "Communicate"
--- /dev/null
+"" "Bewegung"
+"+forward" "vorwärts"
+"+back" "rückwärts"
+"+moveleft" "links"
+"+moveright" "rechts"
+"+jump" "springen / schwimmen"
+"+crouch" "ducken / sinken"
+"+hook" "Enterhaken / Jetpack"
+"" ""
+"" "Angriff"
+"+fire" "1. Feuermodus"
+"+fire2" "2. Feuermodus"
+"" ""
+"" "Waffe wechseln"
+"weapprev" "vorherige"
+"weapnext" "nächste"
+"weaplast" "zuletzt benutzte"
+"weapbest" "beste"
+"reload" "nachladen"
+"impulse 1" "Laser"
+"impulse 2" "Shotgun"
+"impulse 3" "Machine Gun"
+"impulse 4" "Mortar / Mine Layer"
+"impulse 5" "Electro"
+"impulse 6" "Crylink / HLAC"
+"impulse 7" "Nex / MinstaNex / Rifle"
+"impulse 8" "Hagar / Seeker"
+"impulse 9" "Rocket Launcher / Fireball"
+"impulse 14" "Port-O-Launch / Hook"
+"" ""
+"" "Anzeige"
+"+zoom" "Vergrößern (festhalten)"
+"togglezoom" "Vergrößern (umschalten)"
+"+showscores" "Tabelle anzeigen"
+"screenshot" "Bildschirmfoto"
+"" ""
+"" "Kommunikation"
+"messagemode" "Nachricht an alle"
+"messagemode2" "Nachricht ans Team"
+"+con_chat_maximize" "Chat-Historie zeigen"
+"vyes" "Abstimmung: JA"
+"vno" "Abstimmung: Nein"
+"ready" "Bereitschaft signalisieren"
+"" ""
+"" "Client"
+"+show_info" "Serverinfo anzeigen"
+"toggleconsole" "Konsole öffnen"
+"disconnect" "Verbindung trennen"
+"quit" "Beenden"
+"" ""
+"" "Teamplay"
+"messagemode2" "Nachricht ans Team"
+"team_auto" "Team automatisch wählen"
+"menu_showteamselect" "Team auswählen"
+"spec" "Zuschauen"
+"dropweapon" "Waffe wegwerfen"
+"+use" "Schlüssel oder Flagge wegwerfen"
+"" ""
+"" "Benutzerdefiniert"
+"+userbind 1" "$userbind1"
+"+userbind 2" "$userbind2"
+"+userbind 3" "$userbind3"
+"+userbind 4" "$userbind4"
+"+userbind 5" "$userbind5"
+"+userbind 6" "$userbind6"
+"+userbind 7" "$userbind7"
+"+userbind 8" "$userbind8"
+"+userbind 9" "$userbind9"
+"+userbind 10" "$userbind10"
+"+userbind 11" "$userbind11"
+"+userbind 12" "$userbind12"
+"+userbind 13" "$userbind13"
+"+userbind 14" "$userbind14"
+"+userbind 15" "$userbind15"
+"+userbind 16" "$userbind16"
+"+userbind 17" "$userbind17"
+"+userbind 18" "$userbind18"
+"+userbind 19" "$userbind19"
+"+userbind 20" "$userbind20"
+"+userbind 21" "$userbind21"
+"+userbind 22" "$userbind22"
+"+userbind 23" "$userbind23"
+"+userbind 24" "$userbind24"
+"+userbind 25" "$userbind25"
+"+userbind 26" "$userbind26"
+"+userbind 27" "$userbind27"
+"+userbind 28" "$userbind28"
+"+userbind 29" "$userbind29"
+"+userbind 30" "$userbind30"
+"+userbind 31" "$userbind31"
+"+userbind 32" "$userbind32"
--- /dev/null
+"" "Mouvement"
+"+forward" "avancer"
+"+back" "reculer"
+"+moveleft" "gauche"
+"+moveright" "droite"
+"+jump" "sauter / nager"
+"+crouch" "s'accroupir / couler"
+"+hook" "grappin / jet pack"
+"" ""
+"" "Attaque"
+"+fire" "tir primaire"
+"+fire2" "tir secondaire"
+"" ""
+"" "Changement d'armes"
+"weapprev" "arme précédente"
+"weapnext" "arme suivante"
+"weaplast" "dernière utilisée"
+"weapbest" "meilleure arme"
+"reload" "recharger"
+"impulse 1" "laser"
+"impulse 2" "shotgun"
+"impulse 3" "machine gun / rifle"
+"impulse 4" "mortar"
+"impulse 5" "electro"
+"impulse 6" "crylink / hlac"
+"impulse 7" "nex / minstanex"
+"impulse 8" "hagar"
+"impulse 9" "rocket launcher / fireball"
+"impulse 14" "porto / hook"
+"" ""
+"" "Vue"
+"+zoom" "zoom clic enfoncé"
+"togglezoom" "zoom 2 clics"
+"+showscores" "montrer les scores (enfoncé)"
+"screenshot" "capture d'écran"
+"" ""
+"" "Communiquer"
+"messagemode" "chat public"
+"messagemode2" "chat d'équipe"
+"+con_chat_maximize" "historique du chat (enfoncé)"
+"vyes" "voter OUI"
+"vno" "voter NON"
+"ready" "prêt (en mode échauffement)"
+"" ""
+"" "Joueur"
+"+show_info" "information serveur"
+"toggleconsole" "ouvrir la console"
+"disconnect" "se déconnecter"
+"quit" "quitter"
+"" ""
+"" "Équipe"
+"messagemode2" "chat d'équipe"
+"team_auto" "auto-joindre une équipe"
+"menu_showteamselect" "séléction d'équipe"
+"spec" "mode spectateur"
+"dropweapon" "lâcher l'arme"
+"+use" "lâcher la clé / lâcher le drapeau"
+"" ""
+"" "Utilisateur"
+"+userbind 1" "$userbind1"
+"+userbind 2" "$userbind2"
+"+userbind 3" "$userbind3"
+"+userbind 4" "$userbind4"
+"+userbind 5" "$userbind5"
+"+userbind 6" "$userbind6"
+"+userbind 7" "$userbind7"
+"+userbind 8" "$userbind8"
+"+userbind 9" "$userbind9"
+"+userbind 10" "$userbind10"
+"+userbind 11" "$userbind11"
+"+userbind 12" "$userbind12"
+"+userbind 13" "$userbind13"
+"+userbind 14" "$userbind14"
+"+userbind 15" "$userbind15"
+"+userbind 16" "$userbind16"
+"+userbind 17" "$userbind17"
+"+userbind 18" "$userbind18"
+"+userbind 19" "$userbind19"
+"+userbind 20" "$userbind20"
+"+userbind 21" "$userbind21"
+"+userbind 22" "$userbind22"
+"+userbind 23" "$userbind23"
+"+userbind 24" "$userbind24"
+"+userbind 25" "$userbind25"
+"+userbind 26" "$userbind26"
+"+userbind 27" "$userbind27"
+"+userbind 28" "$userbind28"
+"+userbind 29" "$userbind29"
+"+userbind 30" "$userbind30"
+"+userbind 31" "$userbind31"
+"+userbind 32" "$userbind32"
--- /dev/null
+"" "Движение"
+"+forward" "вперёд"
+"+back" "назад"
+"+moveleft" "влево"
+"+moveright" "вправо"
+"+jump" "прыжок / плыть"
+"+crouch" "пригнуться / погрузиться"
+"+hook" "крюк / реактивный ранец"
+"" ""
+"" "Нападение"
+"+fire" "основной огонь"
+"+fire2" "дополнительный огонь"
+"" ""
+"" "Переключение оружия"
+"weapprev" "предыдущее"
+"weapnext" "следующее"
+"weaplast" "ранее использованное"
+"weapbest" "лучшее"
+"reload" "перезарядить"
+"impulse 1" "Laser"
+"impulse 2" "Shotgun"
+"impulse 3" "Machine Gun"
+"impulse 4" "Mortar / Mine Layer"
+"impulse 5" "Electro"
+"impulse 6" "Crylink / HLAC"
+"impulse 7" "Nex / MinstaNex / Rifle"
+"impulse 8" "Hagar / Seeker"
+"impulse 9" "Rocket Launcher / Fireball"
+"impulse 14" "Port-O-Launch / Hook"
+"" ""
+"" "Вид"
+"+zoom" "увеличение"
+"togglezoom" "переключить увеличение"
+"+showscores" "показать очки"
+"screenshot" "снимок экрана"
+"" ""
+"" "Общение"
+"messagemode" "общий чат"
+"messagemode2" "чат команды"
+"+con_chat_maximize" "показать историю чата"
+"vyes" "голосовать ДА"
+"vno" "голосовать НЕТ"
+"ready" "готовность"
+"" ""
+"" "Клиент"
+"+show_info" "сведения о сервере"
+"toggleconsole" "открыть консоль"
+"disconnect" "отключиться"
+"quit" "выйти"
+"" ""
+"" "Командная игра"
+"messagemode2" "чат команды"
+"team_auto" "авто-выбор команды"
+"menu_showteamselect" "меню команды"
+"spec" "стать наблюдателем"
+"dropweapon" "бросить оружие"
+"+use" "бросить ключ или флаг"
+"" ""
+"" "Определенно пользователем"
+"+userbind 1" "$userbind1"
+"+userbind 2" "$userbind2"
+"+userbind 3" "$userbind3"
+"+userbind 4" "$userbind4"
+"+userbind 5" "$userbind5"
+"+userbind 6" "$userbind6"
+"+userbind 7" "$userbind7"
+"+userbind 8" "$userbind8"
+"+userbind 9" "$userbind9"
+"+userbind 10" "$userbind10"
+"+userbind 11" "$userbind11"
+"+userbind 12" "$userbind12"
+"+userbind 13" "$userbind13"
+"+userbind 14" "$userbind14"
+"+userbind 15" "$userbind15"
+"+userbind 16" "$userbind16"
+"+userbind 17" "$userbind17"
+"+userbind 18" "$userbind18"
+"+userbind 19" "$userbind19"
+"+userbind 20" "$userbind20"
+"+userbind 21" "$userbind21"
+"+userbind 22" "$userbind22"
+"+userbind 23" "$userbind23"
+"+userbind 24" "$userbind24"
+"+userbind 25" "$userbind25"
+"+userbind 26" "$userbind26"
+"+userbind 27" "$userbind27"
+"+userbind 28" "$userbind28"
+"+userbind 29" "$userbind29"
+"+userbind 30" "$userbind30"
+"+userbind 31" "$userbind31"
+"+userbind 32" "$userbind32"
--- /dev/null
+de German "Deutsch"
+en English "English"
+fi Finnish "Suomi"
+fr French "Français"
+hu Hungarian "Magyar"
+nl Dutch "Nederlands"
+pt Portuguese "Português"
+ro Romanian "Romana"
+ru Russian "Русский"
+se Swedish "Svenska"
--- /dev/null
+# Xonotic Menu
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the Xonotic package.
+# Rudolf Polzer <divVerent@xonotic.org>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: 2011-02-07 07:50+0100\n"
+"Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "Fehler: Status ist %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Syntax: menu_cmd Befehl..., wobei mögliche Befehle sind:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - lädt alle Variablen auf der aktuellen Menüseite neu\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ELEMENT - springt zu einem Menüelement"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "Fehler beim Erstellen eines curl-Handles\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Ungültiger Befehl. Eine Liste der unterstützten Befehle wird von menu_cmd "
+"help ausgegeben.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Browser nicht initialisiert!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr ""
+"HINWEIS: Text %s ist zu weit für das Textfeld, Text wurde um Faktor %f "
+"gestaucht\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Eintrag %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "benutzerdefiniert"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Build-Information: %s (deutsch)\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Level %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "wird in config.cfg gespeichert"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "wird nicht gespeichert"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "privat"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "Engine-Einstellung"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "nur lesen"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Entwickler"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Willkommen"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+"Willkommen in Xonotic! Nach Auswahl der Sprache und Eingabe des "
+"Spielernamens kann es losgehen. Diese Optionen können natürlich später im "
+"Menüsystem geändert werden."
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Sprache:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Name:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Einstellungen speichern"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Munitons-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Munitionsanzeige:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Nur aktuellen Munitionstyp anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Chat-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Chat-Zeilen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Chat-Größe:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Chat-Sichtbarkeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Chat-Piepton:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Engine-Info-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Engine-Info:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Zeige einen Durchschnittswert für fps"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Health/Armor-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Statusleiste anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Statusleistenausrichtung"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Innen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Außen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Iconausrichtung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Health und Armor tauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Informations-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Informationen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Ausrichtung tauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Mod-Symbole-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Anzeige-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Anzeige:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "auch auf der Konsole ausgeben"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Scrollrichtung vertauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Eintrags-Sichtbarkeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Eintrags-Ausblendung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Bonus-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Strength und Shield vertauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Gedrückte-Tasten-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel nicht anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Panel beim Zuschauen anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Panel immer anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Aspektverhältnis:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Rundenzeit-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Radar-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Panel in Team-Spieltypen aktivieren"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Radar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Drehung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Vorwärts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "West"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Süd"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Ost"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Nord"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Skalierung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Zoom-Modus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "vergrößert"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "verkleinert"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "immer vergrößert"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "nie vergrößert"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Punkte-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Zeit-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Zeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Vergangene Zeit anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Abstimmungs-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Alpha nach Abstimmung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Waffen-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Ausblenden nach:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Nie"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Ausblendeeffekt:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "keiner"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Schieben"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alpha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Waffensymbole:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Waffen-ID zeigen als:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "nichts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Zahl"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Taste"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Trefferquote zeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Munition zeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Muntionsleistenfarbe:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Munitionsleistenalpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "HUD-Konfiguration"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Panel-Standardhintergrund:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Farbe:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Rahmengröße:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Teamfarbe:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Teamfarbe bei Konfiguration testen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Abstand:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "HUD-Dock:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "Klein"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "Mittel"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "Groß"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Gitter:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Panels am Gitter ausrichten"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Gitterweite:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Verlassen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Mehrspieler"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Server"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Starten"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Spieler-Einstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Spieltyp"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Spieleinstellungen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Zeitlimit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Standardwert der Map verwenden"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Punktelimit"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Spielerplätze:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Anzahl Bots:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Spielstärke:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Bots halt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Anfänger"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Gewinnst schon"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Kannst gewinnen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Könntest gewinnen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Fortgeschritten"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Experte"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Profi"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Mörder"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Übermenschlich"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Gottgleich"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Mutators..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Erweiterte Einstellungen..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Mapliste:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Alle auswählen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Keine auswählen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Starten!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Capture-Limit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Leben:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Runden:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Tore:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Punktelimit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Erweiterte Servereinstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Spieleinstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Zuschauer erlauben"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Startschutz:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Spieltempo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Teamplay-Einstellungen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Eigenbeschuss-Faktor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Virtueller Eigenbeschuss (nur Effekt)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Strafe für Eigenbeschuss:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Virtuelle Strafe (nur Effekt)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Teams:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Map-Abstimmung:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Keine Abstimmung"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 Optionen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Einfache Mehrheit gewinnt vcall"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Map-Information"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "mit Waffen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "nur MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Titel:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Autor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Features:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Spieltyp:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Schließen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Start"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Mutators"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Alle-Waffen-Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Viele-Waffen-Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s-Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Ausweichen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Raketen-Fliegen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Ohne Waffen starten"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Wenig Schwerkraft"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Tarnung"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Enterhaken"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "in der Luft"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampir"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Waffen bleiben"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Blutverlust"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Jetpack"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "keiner"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Spielmechanik-Mutators:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Waffen/Gegenstände-Mutators:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Enterhaken"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Waffen-Arenen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Normal (keine Arena)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "mit Laser"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Spezielle Arenen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Viele Waffen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Demo beim Spielen aufnehmen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Filter:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Löschen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Timedemo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Verbinden"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "leer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "voll"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Pause"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Adresse:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Info..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Verbinden!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Server-Information"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "-"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr "%d/%d, %d freie Slots"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d veränderte Einstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Offizielle Einstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "- (nicht kompatibel)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "nicht unterstützt (nicht kompatibel)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "nicht untersützt (nicht aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "unterstützt (aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "unterstützt (nicht aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "erwünscht (aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "erwünscht (nicht aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "notwendig (nicht kompatibel)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "notwendig (aktiv)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Spieler:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Typ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Map:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Spielregeln:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Bots:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Mod:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Version:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Ping:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Schlüssel:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Krypto:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Modell:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Sichtfeld:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Sicht-Wackeln:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Vergrößerungsfaktor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Vergrößerungsgeschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Waffeneinstellungen..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Fadenkreuz:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "pro Waffe"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Größe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Farbe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Punkt in der Mitte aktivieren"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Größe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Treffer-Test:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Gegner"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Wegpunkt-Einstellungen..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "HUD-Editor starten"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Modell erzwingen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "keine"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "inoffizielle"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "alle"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Gewalteffekte deaktivieren"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Fleischteile:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "Wenige"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "Einige"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "Viele"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Schadenseffekt:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Sofort anwenden"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Wegpunkte"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Basis-Wegpunkte anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Wegpunkt-Skalierung:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Wegpunkt-Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Namen anzeigen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Mitspieler"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Alle Spieler"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Waffeneinstellungen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Waffenreihenfolge"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Hoch"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Runter"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Waffenreihenfolge für Mausrad verwenden"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Automatisch auf beste Waffe wechseln"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Waffe in 3D anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "3D-Ansicht spiegeln"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Nachrichten"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Beenden"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Wollen Sie wirklich das Spiel beenden?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Ja"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Nein"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Eingabe"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Grafik"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Effekte"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Ton"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Netzwerk"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Sonstiges"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Master:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Musik:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+msgid "VOL^Ambient:"
+msgstr "Umgebung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Info:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Gegenstände:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Schmerz:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Spieler:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Schüsse:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Stimme:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Waffen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frequenz:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11,025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22,05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44,1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Kanäle"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Stereokanäle tauschen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Kopfhörer-Modus"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Räumliche Sprachnachrichten:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "keine"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "nur Spott"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "alle"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Spott-Radius:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "Sehr klein"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "Klein"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "Groß"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "Sehr groß"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Automatischer Spott"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Zeitwarnung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "keine"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 Minute"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 Minuten"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "beide"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Treffer-Indikator"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Menü-Sounds"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Qualitäts-Vorgabe:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "OMG!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "Niedrig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "Mittel"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "Hoch"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "Ultra"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "Ultimativ"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Geometrie-Detail:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "Sehr niedrig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "Niedrig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "Gut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "Sehr gut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "Wahnsinnig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Kantenglättung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Texturauflösung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "Leet"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "Sehr niedrig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "Niedrig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "Gut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "Sehr gut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Texturkompression vermeiden"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Anisotropie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Partikelqualität:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Partikeldistanz:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Einschusslöcher"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Distanz:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Zeit:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Lightmaps verwenden"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Deluxemapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Glanz"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Offsetmapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Reliefmapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Reflexionen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Schwammig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "Gut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Scharf"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Oberflächen anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Kein dynamisches Licht"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Flash-Blend-Näherung"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Dynamisches Licht in Echtzeit"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Schatten"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Map-Licht in Echtzeit"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Normalmaps verwenden"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Weiche Schatten"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Koronas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Occlusion Queries verwenden"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Überstrahlung"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "Lichtdynamik (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Bewegungsunschärfe:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Schadensunschärfe:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Tastenbelegung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Taste ändern..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Bearbeiten..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Empfindlichkeit:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Mausgeschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Mausfilterung"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Höhe invertieren"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Joystick verwenden"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Mausbeschleunigung deaktivieren"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"Konsole öffnen\" schließt auch"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Benutzerdefinierte Tastenbelegung"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Befehl beim Drücken:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Befehl beim Loslassen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Speichern"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Menü-Skins:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Uhrzeit anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Datum anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Frames pro Sekunde anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Tachometer"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (ohne Einheit)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "Knoten"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Akzelerometer anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Akzelerometer-Skalierung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Eingabelatenz minimieren"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Erweiterte Einstellungen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Cvar-Filter:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Einstellung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Wert:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Client-seitige Bewegungssimulation"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Netgraph anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Netzwerkgeschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "Modem"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "ADSL (langsam)"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "ADSL (schnell)"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Breitband"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Eingabe-Pakete/s:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP-Downloads:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Downloads:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Geschwindigkeit (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Client-UDP-Port:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Auflösung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Schriftgröße:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "Unleserlich"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "Winzig"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "Klein"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "Klein"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "Mittel"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "Groß"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "Riesig"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "Gigantisch"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "Kolossal"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Farbtiefe:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Vollbild"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Vertikale Synchronisation"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "OpenGL 2.0 Shaders verwenden (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "GLSL für Farbregelung verwenden"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Objects (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Ecken, einige Dreiecke (kompatibel)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Ecken"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Ecken und Dreiecke"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Tiefe zuerst rendern:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "nur Map"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "Immer"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "OpenGL-Multithreading deaktivieren"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Bei jedem Frame auf die Grafikkarte warten"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Helligkeit:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Kontrast:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Kontrasterhöhung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Sättigung:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+msgid "LIT^Ambient:"
+msgstr "Umgebungslicht:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Lichtstärke:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Einzelspieler"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Sofortstart! (zufällige Map mit Bots)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Spiel starten!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Gewinner"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Teamauswahl"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "'bestem' Team beitreten"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "rot"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "blau"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "gelb"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "pink"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "zuschauen"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Bitte nicht nochmal diesen Knopf drücken!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Hä? Kann diese Map nicht starten (m ist NULL). Mapliste wird neu gefiltert.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "%ss Xonotic-Server"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Hä? Kann diese Map nicht starten (ungültiger Spieltyp). Mapliste wird neu "
+"gefiltert.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<Spielermodell nicht gefunden>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Vergessen"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Speichern"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Ping"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Servername"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Map"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Typ"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Spieler"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TITEL>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTOR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "AUS"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "MAX"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "HTTP-Antwort für ungültige ID %d erhalten.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "Fehler beim Empfang von Update-Information (Status: %d)\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "Fehler: HTML statt Update-Information erhalten\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "Fehler: Carriage-Returns in Update-Information enthalten\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Das Update kann bei:\n"
+"%s\n"
+"heruntergeladen werden.\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Automatische Generierung von mapinfo-Dateien..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Jetzt auf %s updaten!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
+"^1Darstellungsprobleme sind zu erwarten.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Assault"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Capture The Flag"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Clan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Domination"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Key Hunt"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Last Man Standing"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Onslaught"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Race"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Race CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Runematch"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Team Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Tuba-Werfen"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Hintergrund:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Standard"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Standard verwenden"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Teamfarbe:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Panel aktivieren"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr "%s hat sich erfolgreich mit der Crylink selbst zerstört"
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr "%s konnte sich nicht vor %ss Crylink verstecken"
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr "%s ist %ss Crylink zu nahe getreten"
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr "%s hat %ss Crylink genau unter die Lupe genommen"
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr "%s konnte sich nicht erinnern, wo das Plasma lag"
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr "%s hat mit Plasma gespielt"
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr "%s hat gerade %ss blauen Ball bemerkt"
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr "%s kam in Kontakt mit %ss blauen Ball"
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr "%s kam zu nah an %ss blauen Strahl"
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr "%s wurde von %ss blauen Strahl erwischt"
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr "%s hat den Platz einer Feuermine vergessen"
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr "%s hätte eine kleinere Waffe nehmen sollen"
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr "%s hat versucht %ss Feuermine zu fangen"
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr "%s hat tragischerweise %ss Feuermine ignoriert"
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr "%s konnte sich nicht vor %ss Feuerball verstecken"
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr "%s hat die hübschen Lichter von %ss Feuerball gesehen"
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr "%s ist %ss Feuerball zu nahe getreten"
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr "%s hat von %ss Feuerball probiert"
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr "%s wollte wissen, ob seine Granate funktioniert"
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr "%s verfing sich in der eigenen Detonation"
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr "%s hat %ss Granate nicht gesehen"
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr "%s ist fast %ss Granate ausgewichen"
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr "%s nahm %ss Granate in den Mund"
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr "%s hat mit kleinen Raketen gespielt"
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr "%s hat sich von %s zerlegen lassen"
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr "%s ist von %s niedergeschossen worden"
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr "%s hat das Unmögliche geschafft"
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr "%s hat sich in die Hölle gelasert"
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr "%s ist von %ss Gauntlet halbiert worden"
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr "%s ist von %s zu Tode gelasert worden"
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr "%s ist explodiert"
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr "%s ist %ss Mine zu nahe getreten"
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr "%s ist fast %ss Mine ausgewichen"
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr "%s ist auf %ss Mine gelatscht"
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr "%s hat sich, dank %ss Nex, in Luft aufgelöst"
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr "%s ist %ss Rakete zu nahe getreten"
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr "%s ist fast %ss Rakete ausgewichen"
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr "%s hat %ss Rakete in den Mund genommen"
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr "%s ist in %ss Flac reingerannt"
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr "%s wurde von %s getaggt"
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr "%2$1 ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr "%s ist von %s abgeballert worden"
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s ist von Scharfschütze %s getroffen worden"
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+"%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+"%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
+"%%'n Tuba stammten, gestorben"
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Wegpunkt-Einstellungen:"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# Xonotic Menu
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the PACKAGE package.
+# Henry 'Exitium' Sanmark <henry.sanmark@gmail.com>, 2011.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Henry 'Exitium' Sanmark <henry.sanmark@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "virhe: %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Käyttö: menu_cmd_command..., missä mahdollisia komentoja ovat:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - uudelleenlataa kaikki cvar-muuttujat nykyiseen valikkoon"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITMEM - valitse valikon kohta pääkohdaksi\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "virhe luodessa curl handlea\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Komentoa ei löydy. Saadaksesi listan kaikista tuetuista komennoista, kokeile "
+"menu_cmd help.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Selainta ei ole alustettu!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr "HUOM: tekstikentän teksti %s on liian pitkä, joten se lyhennetään %f\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Esine %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "omavalintainen"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Version tiedot: %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Taso %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "tallennetaan config.cfg-tiedostoon"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "ei tallenneta"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "yksityinen"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "pelimoottorin asetus"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "vain luku"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Tekijät"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Tervetuloa"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Tekstin kieli:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Nimi:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Tallenna asetukset"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Ammuspaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Ammuksien näyttö:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Näytä vain nykyinen ammustyyppi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Vasen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Oikea"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Keskustelupaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Keskustelun sisältö:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Keskustelun koko"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Keskustelun kesto:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Keskustelun piippausääni"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Pelimoottorin tietopaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Pelimoottorin tiedot:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Käytä tasoittavaa algoritmia ruudunpäivitykselle (fps)"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Elämä/panssaripaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Ota tilapalkki käyttöön"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Tilapalkin kohdistus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Sisäänpäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Ulospäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Kuvakkeen kohdistus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Vaihda elämän ja panssarin paikkaa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Tiedotuspaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Tiedoitukset"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Tasoita"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Modi-ikonit paneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Ilmoituspaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Ilmoitukset:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Laita ilmoitukset myös komentoriville"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Käännä ilmoitusjärjestys"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Sisääntulon kesto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Sisääntulon häivennyksen kesto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Tehonlisäyspaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Käännä voimakkuuden ja suojauksen sijainnit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Painettujen näppäinten paneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneeli pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Paneeli päällä kun katsojana"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Paneeli aina päällä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Pakotettu näkymä:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Kilpajuoksun ajanoton paneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Tutkapaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Paneeli käytössä joukkuepeleissä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Tutka:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Pyöriminen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Eteenpäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Länsi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Etelä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Itä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Pohjoinen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Skaala:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Tarkennus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Tarkennettu kohteeseen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Tarkennuksen poisto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Aina tarkennettuna"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Tarkennus ei ikinä päällä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Tulospaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Ajastinpaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Ajastin:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Näytä kulutettu aika"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Äänestyspaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Alpha äänestyksen jälkeen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Asepaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Himmennä jälkikäteen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Ei ikinä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%dt"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Himmennyseffekti:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "EF^Ei mikään"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Liukuminen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alpha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Aseiden kuvakkeet:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Näytä aseen tunniste:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "SHOWAS^Ei mitään."
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Numero"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Näppäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Näytä tarkkuus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Näytä panokset"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Ammuskotelon väri"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Ammuskotelon alpha"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Paneelin näkymän asetukset"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Paneelin taustan perusasetukset:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Väri:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Reunan koko:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Joukkueen väri:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Kokeile joukkueen väirä muokaustilassa"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Pehmustus:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Näkymän liitäntä:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "DOCK^Pois"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "DOCK^Pieni"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "DOCK^Keskikokoinen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "DOCK^Suuri"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Ruudukon asetukset:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Katkaise paneelit ruudukkoon"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Ruudukon koko:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Poistu asetuksista"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Moninpeli"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Palvelimet"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Luo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demot"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Pelaajan asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Pelityyppi"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Ottelun asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Aikaraja"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Käytä kartan omaa oletusarvoa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Pisteraja"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Pelaajamäärä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Bottien lukumäärä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Bottien taitotaso"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Typerä kone"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Aloittelija"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Helppoa kauraa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Helppo voitto"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Voittoon on mahdollisuus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Kehittynyt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Ekspertti"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Mestari"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Murhaaja"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Epäinhimillinen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Jumalainen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Muokkaukset..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Edistyneet asetukset..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Karttalista"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Valitse kaikki"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Poista kaikki valinnat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Aloita moninpeli!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Lipunryöstöraja"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Elämät:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Kierrokset:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Maalit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Tapporaja:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Kehittyneet palvelinasetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Peliasetukset:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Salli sivustakatsominen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Uudelleensyntymissuoja:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Pelinopeus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Joukkuepeliasetukset:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Joukkuevahingon skaala:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Virtuaalinen joukkuevahinko (vain effekti)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Joukkuevahinkorangaistus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Virtuaalinen rangaistus (vain effekti)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Joukkueet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Kartan äänestys:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Ei äänestystä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 valintaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Suurempi äänimäärä voittaa vcall"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Kartan tiedot"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Esineiden täysi sijoittaminen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Vain MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Otsikko:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Tekijä:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Ominaisuudet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Pelityypit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Sulje"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Pelaa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Muokatut pelitilat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Kaikkien aseiden taistelukenttä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Suurimman osan aseiden taistelukenttä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s taistelukenttä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Väistely"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Rakettilentely"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Ei aloitusasetta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Vajaa painovoima"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Näkymätön"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Köysi"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Jalat irti maasta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampyyri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Aseet jäävät"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Verenvuodatus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Rakettireppu"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "MUT^Ei mitään"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Pelityylin muokkaukset:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Aseiden ja esineiden muokkaukset:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Köysi"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Tietyn aseen taistelukenttä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Perinteinen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "laserilla"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Erikoistaistelukentät"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Suurin osa aseista"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Tallenna demoja pelin aikana"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Suodatin:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Tyhjennä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Aikademo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Liity"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "SRVS^Tyhjä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "SRVS^Täynnä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Keskeytä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Osoite:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Tietoa..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Liity!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Palvelimen tiedot"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d muokatut asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Viralliset asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (ei voida yhdistää)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "ei tuettu (ei voida yhdistää)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "ei tuettu (salauksen purku ei onnistu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "tuettu (salauksen purku onnistuu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "tuettu (salauksen purku ei onnistu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "pyydetty (salauksen purku onnistuu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "pyydetty (salauksen purku ei onnistu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "vaadittu (ei voida yhdistää)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "vaadittu (salauksen purku onnistuu)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Pelaajat:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Tyyppi:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Kartta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Pelitila:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Botit:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Modi:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Versio:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Viive:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "Lipunryöstö (CTF)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Avain (Key)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Salaus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Malli:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Näkökenttä:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Näytä huojunta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Tarkennuskerroin:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Tarkennuksen nopeus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Aseiden asetukset..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Tähtäin:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Asekohtainen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Tähtäimen suuruus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Tähtäimen alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Tähtäimen väri:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Ota keskipiste käyttöön"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Koko:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Osumatesti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "HTST^Ei mitään."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Viholliset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Välimatkojen asetukset..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Mene näkymän muokkaimeen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Pakota hahmojen ulkomuoto samanlaiseksi:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "MDL^Ei mitään."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "MDL^Omavalintainen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "MDL^Kaikki"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Ota ylimitoitettu raakuus pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Raajat:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "GIBS^Ei mitään"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "GIBS^Vähän"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "GIBS^Paljon"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "GIBS^Runsaasti"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Vahinkoroiskeet"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Ota saman tien käyttöön"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Välimatkat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Näytä tukikohtien välimatkat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Välimatkan skaala:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Välimatkojen alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Näytä nimet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Oma joukkue"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Kaikki pelaajat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Aseiden asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Aseiden prioriteetti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Ylös"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Alas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Käytä prioriteettiä aseiden vaihdossa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Vaihda ase automaattisesti poimimisen jälkeen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Piirrä ensimmäisen persoonan asemalli"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Vasen tasaus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Oikea tasaus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Käännä näkymä horisontaalisesti"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Uutiset"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Lopeta"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Haluatko aivan varmasti lopettaa pelin?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Kyllä"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Ei"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Asetukset"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Syöte"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Video"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Effektit"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Ääni"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Verkko"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Sekalainen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Pääkanava:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Musiikki:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+msgid "VOL^Ambient:"
+msgstr "VOL^Ympäröivä:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Tietoja:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Esineet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Kipu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Pelaaja:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Laukaukset:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Ääni:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Aseet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Tiheys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 Khz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Kanavat:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Vaihda stereoäänilähteiden paikkaa"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Kuulokeystävällinen tila"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Tilanneäänet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "VOCS^Ei mitään"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "VOCS^Huudahdukset"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "VOCS^Kaikki"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Huudahduksen kantama"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "RNG^Hyvin lyhyt"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "RNG^Lyhyt"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "RNG^Normaali"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "RNG^Pitkä"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "RNG^Täysi"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Automaattiset huudahdukset"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Aikavaroitus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "WRN^Ei mitään"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minuutti"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minuuttia"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "WRN^Molemmat"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Osumailmaisin"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Valikon äänet"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Laadun esiasetus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "PRE^JUMALAUTA!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "PRE^Matala"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "PRE^Keskitaso"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "PRE^Normaali"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "PRE^Korkea"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "PRE^Hyvin korkea"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "PRE^Äärimmäinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Geometriset yksityiskohdat:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "DET^Matalin"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "DET^Matala"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "DET^Normaali"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "DET^Hyvä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "DET^Paras"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "DET^Sekopäinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Reunojenpehmennys (Antialiasing):"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "AA^Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Tekstuurien tarkkuus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "RES^Leet"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "RES^Matalin"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "RES^Matala"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "RES^Normaali"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "RES^Hyvä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "RES^Paras"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Vältä häviöllistä tekstuurien pakkaamista"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Anisotropia:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "ANISO^Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Pienosien laatu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Pienosien etäisyys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Siirtokuvat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Etäisyys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Aika:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Käytä valaistuksia"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Loistokartoitus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Kiilto"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Vastapainoinen kartoitus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Keveä kartoitus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Heijastukset:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Sumea"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "REFL^Hyvä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Terävä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Näytä pinnat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Ei dynaamista valaistusta"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Väläytä blend approximation"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Reaaliaikainen dynaaminen valaitus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Varjot"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Reaaliaikainen ympäristön valaistus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Käytä normaaleja karttoja"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Pehmeät varjot"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Valokehät"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Säätele grafiikkapiirron osia (Occlusion Query)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Hehku"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "High Dynamic Range (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Liikkeestä johtuva sumeus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Vahingosta johtuva sumaus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Näppäimet"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Vaihda näppäin..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Muokkaa..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Herkkyys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Käyttöliittymän hiiren nopeus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Hiiren suodatin"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Käännä hiiren suunta"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Käytä peliohjainta"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Laita käyttöjärjestelmän hiiren kiihtyvyys pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"avaa komentorivi\" myös sulkee"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Käyttäjän määrittelemä näppäinasetus"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Komento painaessa:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Komento painamisen jälkeen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Tallenna"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Peruuta"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Päävalikon ulkoasu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Näytä nykyinen kellonaika"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Näytä nykyinen päivämäärä"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Näytä ruudunpäivitysnopeus (FPS)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Nopeusmittari"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (kätketty)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "knots"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Näytä kiihtyvyysmittari"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Kiihtyvyysmittarin skaala:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Minimoi syötteen viive"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Edistyneet asetukset"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Cvar suodatin"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Asetus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Arvo:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Kuvaus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Asiakasohjelman liikkeen ennustus"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Näytä verkkograafi"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Verkon nopeus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Hidas ASL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Nopea ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Laajakaista"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Vastaanottopaketit /s:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP lataukset:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Lataukset:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Nopeus (kb/s)"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Asiakkaan UDP portti"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Näytön tarkkuus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Kirjainkoko/käyttöliittymän koko:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "SZ^Miltein näkymätön"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "SZ^Pikkuruinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "SZ^Hyvin pieni"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "SZ^Pieni"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "SZ^Keskikokoinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "SZ^Suuri"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "SZ^Valtava"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "SZ^Jättiläismäinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "SZ^Massiivinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Värisävy:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Kokoruutu"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "VSYNC"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Käytä OpenGL 2.0 shaders-varjostuksia (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Käytä GLSL:ää värien hallinnassa"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Object (VBO)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "VBO^Pois"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Vertices, jonkun verran Tris (yhteensopivin)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Vertices"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Vertices ja Triangles"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Syvyys ensin (Depth First):"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "DF^Pois"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "DF^Maailma"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "DF^Kaikki"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Ota monisäkeinen OpenGL pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Anna näytönohjaimen viimeistellä jokainen ruutu"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Kirkkaus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Kontrasti:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Kontrastin lisäys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Kylläisyys:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+msgid "LIT^Ambient:"
+msgstr "LIT^Ympäröivä"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Intensiivisyys:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Yksinpeli"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr ""
+"Suoraan taisteluun! (satunnainen kartta tietokoneohjattujen vastustajien "
+"kera)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Aloita yksinpeli!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Voittaja"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Joukkueen valinta"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "liity 'parhaimpaan' joukkueeseen (automaattisesti)'"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "punainen"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "sininen"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "keltainen"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "pinkki"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "katso sivusta"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Älä paina enää näppäintä, prkl!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Höh? Tätä ei voida pelata (m on NULL). Uudelleensuodatetaan jottei vastaava "
+"enää toistuisi, anteeksi häiriö.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "%s Xonotic-palvelin"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Höh? Tätä ei voida pelata (epäkelpo pelityyppi). Uudelleensuodatetaan jottei "
+"vastaava enää toistuisi.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<mallia ei löytynyt>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Poista"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Kirjanmerkki"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Viive"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Palvelimen nimi"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Kartta"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Tyyppi"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Pelaajat"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TITLE>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTHOR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "VOL^OFF"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "VOL^MAX"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Vastaanotettiin epäkelpo HTTP datapyyntö: %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "virhe vastaanottaessa päivitystiedotetta: tilanne %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "virhe: vastaanotettiin HTML päivitystiedotteen asemesta\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "virhe: vastaanotettiin tyhjää dataa päivitystiedotepalvelimelta\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Päivitys on ladattavissa:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr ""
+"Luodaan automaattisesti karttatietoja vastikään lisätyille kartoille..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Päivitä versioon %s nyt!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1VIRHE: Tekstuurien pakkaus vaaditaan mutta ei ole tuettuna.\n"
+"^1Grafiikkavirheitä odotettavissa.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Areena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Rynnäkkö (Assault)"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Lipunryöstö (CTF)"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Klaaniareena (Clan Arena)"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Mättö (Deathmatch)"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Hallinta (Domination)"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Pakkashippa (Freeze Tag)"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Pakomatka (Keepaway)"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Avaimenmetsästys (Key Hunt)"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Viimeiseen mieheen (Last Man Standing)"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexpallo (Nexball)"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Suurtaistelu (Onslaught)"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Kilpailu (RACE)"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Kilpailu CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Riimu-ottelu (Runematch)"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Joukkuemättö (Team Deatchmatch)"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "Perkeleen tuubanheitto!"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Tausta:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Perusasetus"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Käytä perusasetusta"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Joukkueen väri"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Ota paneeli käyttöön"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+#, fuzzy
+msgid "Fireball"
+msgstr "Nexpallo (Nexball)"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+#, fuzzy
+msgid "Grappling Hook"
+msgstr "Köysi"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+#, fuzzy
+msgid "Mine Layer"
+msgstr "Yksinpeli"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+#, fuzzy
+msgid "MinstaNex"
+msgstr "MinstaGib"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+#, fuzzy
+msgid "Nex"
+msgstr "Nexpallo (Nexball)"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Laukaukset:"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, fuzzy, c-format
+msgid "@!#%'n Tuba"
+msgstr "Perkeleen tuubanheitto!"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
+
+#~ msgid ""
+#~ "Please answer a few initial questions to enhance the game experience."
+#~ msgstr ""
+#~ "Ole hyvä ja vastaa muutamaan alustavaan kysymykseen parantaaksesi "
+#~ "pelikokemustasi."
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Välimatkojen asetukset:"
--- /dev/null
+# Xonotic French Translation.
+# Copyright (C) 2011
+# This file is distributed under the same license as the PACKAGE package.
+# Calinou <hugohachel@gmail.com>, 2011.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Xonotic 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: 2011-01-18 11:53+0100\t\n"
+"Last-Translator: Calinou <hugohachel@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "erreur: le status est %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Utilisation: menu_cmd commande..., les commandes possibles sont:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - recharge toutes les variables sur la page actuelle\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr ""
+" directmenu OBJET - séléctionner un objet de menu comme objet principal\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "erreur de création du curl handle"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Commande invalide. Pour une liste des commandes supportées, tapez menu_cmd "
+"help (dans la console).\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Navigateur non initialisé !"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr ""
+"REMARQUE: le texte label %s est trop large pour un label, condensé par le "
+"facteur %f\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Objet %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "personalisé"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Build information : %s (français)\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Niveau %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "sera sauvegardé vers config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "ne sera pas sauvegardé vers config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "privé"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "paramètre moteur"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "lecture seule"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Crédits"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Bienvenue"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+"Bienvenue sur Xonotic, veuillez séléctionner votre langue et entrer votre "
+"pseudonyme pour commencer. Vous pouvez changer ces options plus tard dans "
+"les menus."
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Langue écran:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Pseudonyme:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Sauvegarder"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Panneau de munitions"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Affichage munitions:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Ne montrer que le type de munition actuel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Gauche"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Droite"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Panneau de Chat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Entrées Chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Taille du Chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Durée du Chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Sons Chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Panneau Info Moteur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Info Moteur:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Utiliser un algorithme pour calculer les FPS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Panneau Santé/Armure"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Activer jauges"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Alignement jauges:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Intérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Extérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Alignement icônes:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Échanger positions Santé/Armure"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Panneau d'Information"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Messages d'Info:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Échanger alignement"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Panneau d'Icônes de Mode"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Panneau de Notifications"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Notifications:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Montrer notifications sur la console"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Inverser l'ordre de notification"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Durée d'une entrée:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Temps d'effacement d'une entrée:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Panneau des Pouvoirs"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Échanger les positions Force/Bouclier"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Panneau Touches Pressées"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panneau désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Paneau activé en spectateur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Paneau toujours activé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Aspect forcé:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Chronomètre Course"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Panneau Mini-carte"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Panneau activé en Équipe"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Mini-carte:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Opacité:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Rotation:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Direction marche"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Ouest"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Sud"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Est"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Nord"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Échelle:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Mode de Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Zoomé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Dézoomé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Toujours Zoomé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Toujours Dézoomé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Tableau des scores"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Chronomètre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Chronomètre:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Montrer temps passé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Panneau de Vote"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Opacité après vote:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Panneau d'armes"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Effacer après:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Jamais"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%dsec."
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Effet d'effacement:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Glisse"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Opacité"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Icônes d'armes:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Montrer le numéro d'arme:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Numéro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Touche"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Monter la précision"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Montrer barre de monitions"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Couleur barre de munitions:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Opacité barre de munitions:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Configuration Interface"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Fond du Panneau par défaut:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Désactiver"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Couleur:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Taille des bords:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Couleur d'équipe:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Affichier la couleur d'équipe en mode configuration"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Ajustement:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Contour interface:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+#, fuzzy
+msgid "DOCK^Disabled"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+#, fuzzy
+msgid "DOCK^Small"
+msgstr "Petit"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+#, fuzzy
+msgid "DOCK^Medium"
+msgstr "Moyen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+#, fuzzy
+msgid "DOCK^Large"
+msgstr "Grand"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Paramètres grille:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Coller paneaux sur la grille"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Taille de grille:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "Hori.:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Vert.:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Sauvegarder et quitter"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Multijoueur"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Serveurs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Créer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Vidéos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Paramètres Joueur"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Mode de jeu:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Paramètres match:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Limite de temps:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Utiliser le paramètre de carte"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Limite de points:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Nombre de joueurs max.:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Nombre de robots:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Difficulté robot:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Nul"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Jeu d'enfant"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Très Facile"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Facile"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Assez Facile"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Avancé"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Expert"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Professionel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Assassin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Inhumain"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Dieu"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Spéciales..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Paramètres avancés..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Liste de cartes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Tout séléctionner"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Ne rien séléctionner"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Démarrer!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Limite de captures:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Vies:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Tours:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Buts:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Limite de tués:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Paramètres serveur avancés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Paramètres jeu"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Autoriser les spectateurs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Bouclier de départ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Vitesse de jeu:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Paramètres Jeu d'équipe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Facteur Dégâts équipiers:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Dégâts équipiers virtuels (seulement effets)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Pénalité Dégâts équipiers:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Pénalité Dégâts équipiers virtuelle (seulement effets)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Équipes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Vote carte suivante:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Pas de vote"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 choix"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Majorité 51% pour gagner le vote"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Information carte:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Objets présents"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "MinstaGib seulement"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Titre:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Auteur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Fonctions:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Modes de jeux:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Fermer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Jouer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Spéciales"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Toutes les armes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Beaucoup d'armes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "Arène de %s"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Esquives"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Roquettes volantes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Pas d'armes au début"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Gravité basse"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Joueurs transparents"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Grappin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Midair"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampire"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Armes infinies"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Perte de sang"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Jet pack"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Spéciales Mode de jeu:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Spéciales Armes et Objets:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Grappin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Arènes d'armes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Régulier (pas d'Arène)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "avec le laser"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Arènes Spéciales:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Beaucoup d'armes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Vidéo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Auto-enregistrement des Vidéos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Recherche:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Effacer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Test Performance"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Joindre"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "Vide"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "Tout"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Pause"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Adresse:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Info..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Joindre !"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Information Serveur"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "paramètres modifiés: %d"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Paramètres Officiels"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (ne peut pas se connecter)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "non supporté (ne peut pas se connecter)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "non supporté (pas de cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "supporté (cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "supporté (pas de cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "démandé (cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "démandé (pas de cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "nécessaire (ne peut pas se connecter)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "nécessaire (cryptage)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Joueurs:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Type:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Carte:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Mode:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Robots:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Modification:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Version:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Latence:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Clé:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Cryptage:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Personnage:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Champ de vision:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Caméra marche:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Facteur de Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Vitesse de Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Paramètres armes..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Viseur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Par arme"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Taille viseur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Opacité viseur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Couleur viseur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Activer point central"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Taille:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Détection toucher:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Enemis"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Paramètres Waypoints..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Éditer l'interface"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Forcer personnages:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "Personnalisé"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "Tout"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Désactiver effets gore"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Gibs:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "Quelques"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "Plusieurs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "Beaucoup"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Effet santé faible:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Appliquer maintenant"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Waypoints"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Montrer les Waypoints de drapeau"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Taille des Waypoints:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Opacité Waypoints:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Montrer les noms:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Équipiers"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Tous les joueurs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Paramètres d'armes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Liste de priorité armes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Haut"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Bas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Utiliser la liste de priorité pour changer les armes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Changer d'arme en prenant une arme meilleure"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Afficher l'arme à la première personne"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "À gauche"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "À droite"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Vue Mirroir"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "News"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Quitter"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Voulez-vous vraiment quitter ?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Oui"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Non"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Préférences"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Contrôles"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Vidéo"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Graphiques"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Audio"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Réseau"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Autres"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Général:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Musique:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#, fuzzy
+msgid "VOL^Ambient:"
+msgstr "Ambience:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Information:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Objets:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Douleur:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Joueur:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Tirs:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Voix:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Armes:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Fréquence:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Canaux:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stéréo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Échanger les canaux Stéréo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Mode casque audio"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Voix personnages:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "Voix"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "Tout"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Distance voix:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "Très court"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "Court"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "Long"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "Tout"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Voix automatiques"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Avertissement temps:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "Aucun"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minute"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minutes"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "Les deux"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Son tir réussi"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Sons du menu"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Qualité effets:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "OMG!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "Bas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "Moyen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "Élevé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "Très Élevé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "Ultime"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Détail géométrie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "Très Bas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "Bas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "Bon"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "Élevé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "Extrême"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Anticrénelage:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Qualité textures:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "Leet"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "Très Bas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "Bas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "Bon"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "Élevé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Éviter la compression rapide"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Filtrage Anistrope:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Qualité particules:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Distance max. particules:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Marques impacts"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Distance max.:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Temps:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Utiliser les lightmaps"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Textures Deluxe"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Brillance textures"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Textures relief"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Textures relief avancé"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Réflections:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Flou"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "Bon"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Net"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Textures unies"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Pas de lumières dynamiques"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Lumières dynamiques rapides"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Lumières dynamiques en temps réel"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Ombres"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Lumières carte en temps réel"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Lumières Deluxe"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Ombres avancées"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Brillance Lumière"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Utiliser l'Occlusion du rendu"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Effets d'éblouissement"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "High Dynamic Range (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Flou de vitesse:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Flou de dégâts:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Contrôles:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Changer touche..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Éditer..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Senstitivité:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Vitesse souris menus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Filtre Souris"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Inverser souris (axe Y)"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Utiliser une manette"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Désactiver l'accélération souris de l'OS"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"ouvrir la console\" ferme aussi la console"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Touche d'éxécution:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Commande quand appuyée:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Commande quand relachée:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Annuler"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Apparences menu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Montrer l'heure"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Montrer la date"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Montrer les Images Par Seconde"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Speedomètre"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (caché)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "noeuds"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Montrer l'accéléromètre"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Taille accéléromètre:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Minimiser la latence des contrôles"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Paramètres avancés"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Recherche de commandes:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Paramètre:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Valeur:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Description:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Prédiction des mouvements joueur"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Montrer le netgraphe"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Vitesse réseau:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "ADSL lent"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "ADSL rapide"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Câble/Fibre optique"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Paquets entrants/seconde:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "Téléchargements:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Téléchargements simultanés:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Vitesse (Ko/seconde):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Port UDP client:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Résolution:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Taille typo:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "Illisible"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "Minuscule"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "Très Petit"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "Petit"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "Moyen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "Grand"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "Très Grand"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "Géant"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "Gigantesque"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Profondeur de couleurs:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Plein écran"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Syncronisation verticale"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Utiliser OpenGL 2.0 (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Utiliser GLSL pour gérer les couleurs"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"ourd
+msgstr "Objets en tampon mémoire (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+#, fuzzy
+msgid "VBO^Off"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Points, quelques Triangles (compatible)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Points"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Points et Triangles"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Fixeur profondeur:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#, fuzzy
+msgid "DF^Disabled"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#, fuzzy
+msgid "DF^World"
+msgstr "Carte"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#, fuzzy
+msgid "DF^All"
+msgstr "Tout"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Désactiver OpenGL multi-coeurs"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Attendre le GPU pour finir chaque trame"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Luminosité:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Contraste:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Amélioration contraste:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Saturation:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#, fuzzy
+msgid "LIT^Ambient:"
+msgstr "Ambience:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Intensité:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Monojoueur"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Instant action! (map aléatoire avec bots)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Démarrer !"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Gagné"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Séléction d'équipe"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "auto-séléction équipe (recommandé)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "rouge"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "bleu"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "jaune"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "rose"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "mode spectateur"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "N'appuyez plus sur ce bouton !"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Euh? Ne peut pas être joué. Re-filtrage pour éviter des nouveaux problèmes.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "%s's Xonotic Server"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Euh? Ne peut pas être joué. Mode de jeu invalide. Re-filtrage pour éviter "
+"des nouveaux problèmes.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<modèle non trouvé>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Supprimer"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Marque-page"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Latence"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Nom d'Hôte"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Carte"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Mode"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Joueurs"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TITRE>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTEUR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "OFF"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "MAX"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "A reçu la demande HTTP d'ID invalide %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "error pour recevoir la notification de mise à jour: le statut est %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr ""
+"erreur: a reçu un fichier HTML et non une notification de mise à jour\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr ""
+"erreur: a reçu un message erroné depuis le serveur de notifications de M.A."
+"J.\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"La mise à jour peut être téléchargée ici:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Génération des mapinfo pour les nouvelles cartes ajoutées..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Mettez à jour vers %s maintenant !"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1ERROR: La texture de compression est nécessaire mais non supportée.\n"
+"^1Attendez vous à voir des problèmes de rendu.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arène Duel"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Assaut"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Capture Du Drapeau"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Arène Équipes"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Match à Mort"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Domination"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Cache-Cache Du Drapeau"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Chasse aux Clés"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Dernier Survivant"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Onslaught"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Course"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Course CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Runematch"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Match à Mort Équipe"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "Lancer de @!#%'n Tuba"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Arrière-plan:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Par défaut"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Par défaut"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Couleur d'équipe:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Activer ce panneau"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr "%s a réussi à se suicider avec le Crylink"
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr "%s n'a pas pu se cacher du Crylink de %s"
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr "%s a été trop près du Crylink de %s"
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr "%s a voulu voir se qui se trouvait dans le Crylink de %s"
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr "%s ne se souvenait pas où il a tiré du plasma"
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr "%s a joué avec du plasma"
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr "%s vient de remarquer la boule plasma de %s"
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr "%s s'est fait toucher par la boule plasma de %s"
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr "%s se sent éléctrisé par le combo de %s"
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr "%s a été trop près du rayon plasma de %s"
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr "%s a été désintégré à cause du rayon plasma de %s"
+
+#: qcsrc/server/w_fireball.qc:2
+#, fuzzy
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr "%s n'a pas étudié la combustion des boules de feu"
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr "%s aurait dû utiliser une arme plus petite"
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr "%s a pensé que la boule de feu de %s était un ballon de football"
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr "%s a ignoré la boule de feu de %s"
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr "%s n'a pas réussi à se cacher de la boule de feu de %s"
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr "%s a vu les belles lumières de la boule de feu de %s"
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr "%s s'est trop approché de la boule de feu de %s"
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr "%s a goûté la boule de feu de %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortier"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr "%s a mangé sa propre grenade"
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr "%s a fait boum"
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr "%s n'a pas vu la grenade de %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr "%s a presque réussi à esquiver la grenade de %s"
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr "%s a mangé la grenade de %s"
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr "%s a joué avec des petits missiles"
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr "%s a pensé que les petits missiles de %s ne rebondissaient pas"
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr "%s a trop mangé de mini-missiles de la part de %s"
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Canon Laser Lourd d'Assaut "
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr "%s s'est fait couper par %s"
+
+#: qcsrc/server/w_hook.qc:2
+#, fuzzy
+msgid "Grappling Hook"
+msgstr "Grappin"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr "%s a fait l'impossible"
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr "%s a été emprisonné par la bombe à gravité de %s"
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr "%s s'est suicidé au laser"
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr "%s s'est fait couper en deux par le laser de %s"
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr "%s a été désintégré par le laser de %s"
+
+#: qcsrc/server/w_minelayer.qc:2
+#, fuzzy
+msgid "Mine Layer"
+msgstr "Lance-Mines"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr "%s a explosé"
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr "%s s'est trop approché de la mine de %s"
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr "%s a presque esquivé la mine de %s"
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr "%s a marché sur la mine de %s"
+
+#: qcsrc/server/w_minstanex.qc:2
+#, fuzzy
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr "%s s'est fait vaporiser par %s"
+
+#: qcsrc/server/w_nex.qc:2
+#, fuzzy
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Lance-O-Port"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr "%s a eu tort de prendre le portail de %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Lance-Roquettes"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr "%s s'est trop approché de la roquette de %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr "%s a presque esquivé la roquette de %s"
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr "%s a mangé la roquette de %s"
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Chercheur"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr "%s n'a pas eu peur des missiles de %s"
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr "%s s'est fait tagguer par %s"
+
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Fusil"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr "%2$s ^7a baffé %1$s ^7avec un ^2fusil"
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr "%s s'est fait fusiller par %s"
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Fusil Sniper"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s s'est suicidé au sniper"
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s a oublié le cran de sûreté en chargeant"
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s n'a pas pu se cacher de la nuée de balles de %s"
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s est mort de la nuée de balles de %s"
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s n'a pas réussi à se cacher du sniper de %s"
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s s'est fait décapiter au sniper par %s"
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s s'est fait descendre au sniper par %s"
+
+#: qcsrc/server/w_tuba.qc:2
+#, fuzzy, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr "%s s'est fait casser les tympans par son propre tuba"
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr "%s n'a pas aimé la musique de %s et en est mort"
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Mitraillette"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr "%s s'est fait trouer par %s"
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Paramètres Waypoint (flèches 3D sur la carte):"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR: xaN1C4n3 <robalm@freemail.hu>, 2011.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "Hiba: állapot %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Használat: menu_cmd parancs..., ahol a lehetséges parancs:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr "sync - újratölti az összes cvar-t az aktuális menü oldalon\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu TÁRGY - kiválaszt egy menü pontot, fő tárgynak\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "Curl kezelő hibát okozott\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+" Érvénytelen parancs. A támogatott parancsok listájáért, próbáld a menu_cmd "
+"segitséget.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "A böngésző nem indult el!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr "MEGJEGYZÉS: a %s szöveg túl széles címkének, csökkentsd %f-el\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Tárgy %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "egyéni"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Épitési információ: %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Szint %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "A config.cfg-ba lesz mentve"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "Nem lesz elmentve"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "magán"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "motor beállítás"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "csak olvasható"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Köszönetek"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "Rendben"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Üdvözlet"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Szöveg nyelv:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Név:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "A beállítások mentése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Lőszer Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Lőszer kijelző:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Csak az aktuális lőszer típus megjelenítése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Bal"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Jobb"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Csevely Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Csevely bejegyzések:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Csevely méret:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Csevely élettartam:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Csevely sípszó"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Motor Információs panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Motor Információ:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Átlagoló algoritmus használata az fps-hez"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Életerő/Páncél Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Állapotsor engedélyezése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Állapotsor igazítás:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Befelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Kifelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Ikon igazítás:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Életerő és páncél poziciójának cseréje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Info üzenetek lapja"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Info üzenetek:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Flip összehangolása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Mod ikonok panelje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Értesítő Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Értesítések:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Az értesítéseket a konzolra is kiirja"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Értesítés rend megfordítás"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Bejegyzés élettartam:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Bejegyzés halványulási idő:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Powerups Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Erő és pajzs pozíciók felcserélése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Lenyomott gombok lapja"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel kikapcsolva"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Panel engedélyezett, ha csak néző vagy"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Panel mindig látható"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Időmérő Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Radar Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Panel engedélyezve a csapatjátékokban"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Radar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Forgatás:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Előre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Nyugat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Dél"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Kelet"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Észak"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Arány:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Nagyítási mód:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Nagyítás"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Kicsinyítés"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Mindig nagyított"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Sohasem nagyított"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Ponttáblázat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Időtáblázat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Időzítő:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Eltelt idő mutatása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Szavazati tábla"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Alpha a szavazás után:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Fegyverek lapja"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Elhalványulás késleltetés:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Soha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Halványulás hatás:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "EF^Nincs"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Csúszás"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alpha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Fegyver ikonok:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "A Fegyver azonosító megjelenítés eszerint:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "Nincs"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Szám"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Hozzárendelés"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Pontosság mutatása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Lőszer mutatása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Lőszer jelző színe:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Lőszer jelző alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "HUD panel beállítás"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Panel háttér alapértelmezett:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Letiltás"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Szín:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Keret méret:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Csapat szín:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Csapat szín ellenörzés konfigurációs módban"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Padding:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "HUD rögzités:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "Letiltott"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "Kicsi"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "Közepes"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "Nagy"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Rács beállítások:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Panelek rácshoz igazítása"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Rács méret:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Kilépés a beállitásokból"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Többjátékos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Kiszolgálók"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Létrehozás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demók"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Játékos beállítás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Játék típus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Meccs beállítások:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Idő határ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Térképhez tartozó alapérték használata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Pont határ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Összes játékos:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Botok száma:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Botok szintje"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Béna"
+
+# :)))
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Kezdő"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Biztosan te nyersz"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Nyerhetsz"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Még legyőzheted"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Rutinos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Tapasztalt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Hivatásos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Orgyilkos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Embertelen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Isteni"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Mutatorok..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Különleges beállítások ..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Térkép lista:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Az összes kiválasztása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Egyik sem"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Többjátékos indítása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Rablás határérték:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Életek:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Körök:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Célok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Frag határérték:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Speciális kiszolgáló beállítások"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Játék beállításai:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Nézők engedélyezése"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Páncél megjelenés:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Játék sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Csapatjáték beállítások:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Baráti tűz mértéke:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Látszólagos baráti tűz (csak hatás)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Baráti tűz büntetés:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Látszólagos büntetés (csak hatás)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Csapatok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Térkép szavazás:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Nincs szavazás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 lehetőség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Egyszerű többség nyer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Térkép Információ"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Minden tárgy elhelyezése"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Csak MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Cím:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Szerző:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Jellemzők:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Játék típusok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Zárt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Játék"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Mutatorok"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Minden Fegyver Aréna"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Legtöbb Fegyver Aréna"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s Aréna"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Kitérés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Rakéta repülés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Nincs kezdő fegyver"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Alacsony gravitáció"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Álcázott"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Horog"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Levegőben"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vámpír"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Fegyverek maradnak"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Vérveszteség"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Jet pack"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "Nincs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Játékmenet mutatorok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Fegyver és tárgy mutatorok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Ragadós horog"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Fegyver Arénák:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Hagyományos (nincs aréna)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "lézerrel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Különleges Arénák:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "A legtöbb fegyver"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demó"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Játék közben rögzitse a demókat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Szűrés:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Törlés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Demó időmérés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Csatlakozás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "SRVS^Üres"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "SRVS^Teli"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Szünet"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Cím:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Info..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Csatlakozz!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Szerver információ"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d módosított beállításai"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Hivatalos beállítások"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (nem tud csatlakozni)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "nem támogatott (nem tud csatlakozni)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "nem támogatott (nem ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "támogatott (ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "támogatott (nem ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "kért (ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "kért (nem ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "szükséges (nem tud csatlakozni)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "szükséges (ellenörzött)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Játékosok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Típus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Pálya:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Játék:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Botok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Mod:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Verzió:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Ping:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Kulcs:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Titkosítás:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Modell:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Látómező:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Nézet döntés:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Nagyítás szorzó:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Nagyítás sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Fegyver beállítások..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Célkereszt:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Fegyverenként"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Célkereszt mérete:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Célkereszt alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Célkereszt színe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Középpont engedélyezése"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Méret:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Találat ellenőrzés:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "HTST^Nincs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "Valós célzás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Ellenségek"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Útpontok beállítása..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Belépés a HUD szerkesztőbe"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Modellek kényszerítése:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "MDL^Nincs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "MDL^Egyéni"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "MDL^Mind"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Sérülés hatások letiltása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Húscafatok:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "GIBS^Nincs"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "GIBS^Kevés"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "GIBS^Sok"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "GIBS^Rengeteg"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Sérülés szórás:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Azonnali alkalmazás"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Útpontok"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Alap útpontok mutatása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Útpont részletesség:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Útpont alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Nevek mutatása:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Csapattársak"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Minden játékos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Fegyver beállítások"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Fegyver elsőbbségi lista:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Fel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Le"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Az elsőbbségi listát használja a fegyverváltáshoz"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Automatikus váltás a felvett fegyverre"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "1.személyű fegyver modell kirajzolása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Balra igazítása"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Jobbra igazított"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "A nézet horizontális döntése"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Hírek"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Kilépés"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Biztos vagy benne, hogy kilépsz?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Igen"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Nem"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Beállítások"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Bemenet"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Videó"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Hatások"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Hang"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Hálózat"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Egyéb"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Mester:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Zene:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+msgid "VOL^Ambient:"
+msgstr "VOL^Környezet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Információ:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Tárgyak:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Fájdalom:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Játékos:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Lövések:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Hang:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Fegyverek:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frekvencia:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11,025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22,05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44,1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Csatornák:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Monó"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Sztereó"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Sztereó megcserélése"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Fejhallgató barát mód"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Térbeli hangok:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "VOCS^Nincs"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "VOCS^Bekiabálások"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "VOCS^Minden"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Bekiabálás terület:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "RNG^Nagyon rövid"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "RNG^Rövid"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "RNG^Normál"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "RNG^Hosszú"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "RNG^Teljes"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Automatikus bekiabálások"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Idő figyelmeztetés:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "Nincs"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 perc"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 perc"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "Mindkettő"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Találat jelző"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Menü hangok"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Minőség sablon:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "PRE^OMG!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "PRE^Alacsony"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "PRE^Közepes"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "PRE^Normál"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "PRE^Magas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "PRE^Szélsőséges"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "PRE^Végső"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Geometria részletesség:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "DET^Legalacsonyabb"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "DET^Alacsony"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "DET^Normál"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "DET^Jó"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "DET^Még jobb"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "DET^Őrült magas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Élsimítás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "AA^Letiltva"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Textúra felbontás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "RES^Semmi"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "RES^Legalacsonyabb"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "RES^Alacsony"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "RES^Normál"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "RES^Jó"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "RES^Legjobb"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Kerülje a veszteséges textúra tömörítést"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Anizotrópia:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "ANISO^Letiltva"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Részecske minőség:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Részecske távolság:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Dekorációk"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Távolság:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Idő:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Fénytérképek használata"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Deluxe mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Fényes"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Offset mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Relief mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Tükrözödés:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Homályos"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "Refl^Jó"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Éles"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Felületek megjelenítése"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Nincsenek dinamikus fények"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Közelítő villanás keverés"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Valós idejű dinamikus fények"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Árnyékok"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Valós idejű világ fényhatások"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Normál map használata"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Lágy árnyékok"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Fénykörök"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Use Occlusion Queries"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Virágzás"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "Magas dinamika tartomány (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Mozgási elmosás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Sérülés elmosás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Billentyű hozzárendelések:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Billentyű változtatás..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Szerkesztés..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Érzékenység:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "UI egér sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Egér szürés"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Forditott egér"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Joystick bemenet használata"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "OS egér gyorsítás kikapcsolása"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"belépés a konzolba\" zár is"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Felhasználó által beállított billentyű"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Parancs lenyomáskor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Parancs felengedéskor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Mentés"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Menü felületek:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Aktuális idő mutatása"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Aktuális dátum mutatása"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "A képkocka/s mutatása"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Sebességmérő"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (rejtett)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "csomó"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Gyorsulásmérő mutatása"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Gyorsulásmérő beosztás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Bemeneti késleltetés minimalizása"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "További beállítások"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Cvar szűrés:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Beállítás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Érték:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Leírás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Kliens-oldali mozgás előrejelzés"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Hálózat forgalom megjelenítése"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Hálózati sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Lassú ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Gyors ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Szélessávú"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Bemeneti csomagok/s:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP letöltéseket:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Letöltések:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Sebesség (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Kliens UDP port:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Felbontás:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Font/UI méret:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "SZ^Olvashatatlan"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "SZ^Apró"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "SZ^Pici"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "SZ^Kicsi"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "SZ^Közepes"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "SZ^Nagy"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "SZ^Hatalmas"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "SZ^Gigantikus"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "SZ^Óriási"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Színmélység:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Teljes képernyő"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Szinkonizálás a képfrissítéshez"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "OpenGL 2.0 árnyalók (GLSL) használata"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "GLSL használata a színvezérlés kezeléséhez"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Objects (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "VBO^Off"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Csúcspontok, néhány háromszög (kompatibilis)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Csúcspontok"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Csúcspontok és háromszögek"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Mélység először:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "Kikapcsolva"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "Világ"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "Minden"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Többszálú OpenGL letiltása"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Várakozás minden képkockánál, hogy a GPU végezzen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Fényerő:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Kontraszt:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Kontraszt növelés:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Színtelítettség:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+msgid "LIT^Ambient:"
+msgstr "Környezet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Erősség:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Egyjátékos"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Azonnali játék (véletlenszerű pálya botokkal)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Egyjátékos mód indítása"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Győztes"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Csapat választás"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "Csatlakozás a 'legjobb' csapathoz (auto-választás)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "vörös"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "kék"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "sárga"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "rózsaszín"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "néző"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Ne nyomd meg újra ezt a gombot!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Jajj? Ezzel nem lehet játszani (m is NULL). Állítsd át a szürést, hogy ne "
+"ismétlődjön meg!\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "%s Xonotic kiszolgálója"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Jajj? Ezzel nem lehet játszani (érvénytelen játék típus). Állítsd át a "
+"szürést, hogy ne ismétlődjön meg!\n"
+"."
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<modell nem található>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Eltávolítás"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Könyvjelző"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Ping"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Gazda név"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Térkép"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Típus"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Játékosok"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<CÍM>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<SZERZŐ>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "Hangerő ki"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "Hangerő maximum"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Érvénytelen HTTP adatkérés érkezett id %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "Frissítési értesítési hiba: az állapota %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "Hiba: frissítési értesítés helyett egy HTML-t kapott\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "Hiba: a frissítés értesítő szerverről egy 'kocsi vissza'-t kapott\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Frissítés letölthető: \n"
+"%s -ről\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Önállóan előállitott MapInfo az újonnan hozzáadott térképekhez..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Most frissítsd %s-re!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1Hiba: textúra tömörítés szükséges, de nem támogatott.\n"
+"^1Gondok lehetnek a látvánnyal.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Aréna"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Ostrom"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Szerezd meg a zászlót"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Klán Aréna"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Mindenki mindenki ellen"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Uralom"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Kulcs vadászat"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Last Man Standing"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Támadás"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Futam"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Race CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Rúnameccs"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Csapatos öldöklés"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Tuba Dobás"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Háttér:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Alapértelmezett"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Alapértékek használata"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Csapat színe:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Panel engedélyezés"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+#, fuzzy
+msgid "Fireball"
+msgstr "Nexball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+#, fuzzy
+msgid "Mortar"
+msgstr "Előre"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, fuzzy, c-format
+msgid "%s detonated"
+msgstr "néző"
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+#, fuzzy
+msgid "Grappling Hook"
+msgstr "Ragadós horog"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+#, fuzzy
+msgid "Laser"
+msgstr "Mester:"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+#, fuzzy
+msgid "Mine Layer"
+msgstr "Egyjátékos"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+#, fuzzy
+msgid "MinstaNex"
+msgstr "MinstaGib"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+#, fuzzy
+msgid "Nex"
+msgstr "Nexball"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Lövések:"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, fuzzy, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba Dobás"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid ""
+#~ "Please answer a few initial questions to enhance the game experience."
+#~ msgstr ""
+#~ "A jobb játékélmény érdekében, kérlek, válaszolj pár inditó kérdésre!"
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Útpont beállítások:"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "error: status is %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Gebruik: menu_cmd command..., waar mogelijke opdrachten zijn:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - alle cvars op de huidige menupagina worden opnieuw geladen\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITEM - selecteer deel van menu als hoofddeel"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "fout bij aanmaken curl handgreep\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Ongeldige opdracht. Voor een lijst met ondersteunde opdrachten, probeer "
+"menu_cmd help.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Browser is niet geinitialiseerd!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr ""
+"ATTENTIE: tekst van het label is %s te wijd, word met een factor %f "
+"verkleind\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Item %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "aangepast"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Versie informatie: %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Level %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "word in config.cfg opgeslagen"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "word niet opgeslagen"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "privé "
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "engine instelling"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "alleen lezen"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Aftiteling"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Welkom"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Taal van de tekst:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Naam:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Opslaginstellingen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Ammunitie Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Ammunitie venster:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Laat alleen huidig ammunitietype zien"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Chat Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Chat posts:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Chat grootte"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Chat tijd:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Chat geluid"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Engine Informatie Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Engine Informatie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Gebruik een middelend algoritme voor fps"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Health/Armor Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Activeer status balk"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Statusbalk positie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Binnenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Buitenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Icoon positie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Keer health en armor posities om"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Informatieberichten Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Informatieberichten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Anders uitlijnen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Speliconen Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Notificatie Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Notificaties:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Notificaties ook in de console printen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Notificatievolgorde omdraaien"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Post tijd:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Post vervaagtijd:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Powerups paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Keer kracht en schild posities om"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Ingedrukte Toetsen Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneel uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Paneel activeren tijdens observeren"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Paneel altijd actief"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Aspect ratio:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Race Tijd Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Radar Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Paneel actief in teammodus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Radar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Rotatie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Voorwaarts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "West"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Zuid"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Oost"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Noord"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Schaal:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Zoom modus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Ingezoomd"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Uitgezoomd"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Altijd ingezoomd"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Altijd uitgezoomd"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Score Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Tijd Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Timer:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Laat verstreken tijd zien"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Stem Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Alpha na stemmen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Wapenpaneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Vervagen na:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Nooit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Vervagingseffect:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "EF^Geen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Schuiven"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alpha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Wapeniconen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Toon wapen-ID als:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "SHOWAS^Geen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Nummer"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Binden"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Nauwkeurigheid tonen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Ammunitie tonen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Ammunitie balk kleur:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Ammunitie alpha:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Paneel HUD Instellingen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Paneel achtergrond standaards:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Uitschakelen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Kleur:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Grootte rand:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Teamkleur:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Test teamkleur in aanpassingsmodus"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Opvulling:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "HUD Werf:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "DOCK^Uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "DOCK^Klein"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "DOCK^Gemiddeld"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "DOCK^Groot"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Raster instellingen"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Lijn panelen uit met grid"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Raster grootte:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Beëindig panel HUD modus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Multiplayer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Servers"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Maak aan"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demo’s"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Speler Instellingen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Game modus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Match instellingen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Tijdslimiet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Gebruik map specificaties"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Punten limiet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Aantal spelers:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Aantal bots"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Bot vaardigheid"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Botlike"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Beginner"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Je zal winnen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Je kan winnen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Je zou kunnen winnen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Expert"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Pro"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Sluipmoordenaar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Onmenselijk"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Goddelijk"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Mutaties..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Geavanceerde instellingen..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Map lijst:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Selecteer alles"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Selecteer niets"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Start Multiplayer!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Vlaggen limiet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Levens:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Rondes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Goals:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Frag limiet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Geavanceerde server instellingen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Game instellingen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Observeren toestaan"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Spawn shild:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Team modus instellingen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Friendly fire schaal:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Virtuele friendly fire (alleen effect)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Friendly fire straf"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Virtuele straf (alleen effect)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Teams:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Map stemmen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Geen stemmen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 keuzes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Simple meerderheid wint vcall"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Map informatie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Volledige item distributie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Alleen MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Titel:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Auteur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Bevat:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Game modus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Dichtdoen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Speel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Mutaties"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Alle Wapens Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Meeste Wapens Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Ontwijken"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Raket Vliegen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Geen start wapens"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Lage zwaartekracht"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Onzichtbaarheid"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Haak"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "In de lucht"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampier"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Wapens blijven"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Bloedverlies"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Jet pack"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "MUT^Geen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Gameplay mutaties:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Wapen & item mutaties:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Grappling hook"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Wapen arena’s:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Normaal (geen arena)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "met lazer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Speciale arenas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Meeste wapens"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Demo’s opnemen tijdens het spelen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Filter:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Legen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Benchmark demo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Meedoen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "SRVS^Leeg"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "SRVS^Vol"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Pauze"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Adres:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Info..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Meedoen!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Server Informatie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d gemodificeerde instellingen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Officiële configuratie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (kan geen verbinding maken)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "niet ondersteund (kan geen verbinding maken)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "niet ondersteund (zal niet versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "ondersteund (zal versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "ondersteund (zal niet versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "verzocht (zal versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "verzocht (zal niet versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "verplicht (kan geen verbinding maken)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "verplicht (zal versleutelen)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Spelers:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Type:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Map:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Gameplay:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Bots:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Mod:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Versie:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Ping:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Sleutel:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Versleuteling:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Personage:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Kijkhoek (FoV):"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Schommelend zicht:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Zoom factor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Zoom snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Wapen instellingen..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Richtkruis:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Per wapen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Richtkruis grootte:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Richtkruis alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Richtkruis kleur:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Activeer middenpunt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Grootte"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Tref test:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "HTST^Geen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "Echt mikken"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Tegenstanders"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Wegwijzers instellingen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Ga naar HUD editor"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Forceer modellen:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "MDL^Geen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "MDL^Aangepast"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "MDL^Alle"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Schakel bloederigheid uit"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Gibs:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "GIBS^Geen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "GIBS^Weinig"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "GIBS^Veel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "GIBS^Erg veel"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Pijn spatten:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Meteen toepassen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Wegwijzers"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Laat wegwijzers zien voor de basis"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Wegwijzer schaal:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Wegwijzer alpha:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Laat namen zien:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Teammaten"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Alle spelers"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Wapen instellingen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Wapen prioriteit lijst:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Omhoog"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Omlaag"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Gebruik de prioriteit lijst voor het wisselen van wapens "
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Automatisch wapens wisselen bij oppakken"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Wapen positie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Spiegel zicht horizontaal"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Nieuws"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Afsluiten"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Weet je zeker dat je wil afsluiten?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Ja"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Nee"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Instellingen"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Input"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Video"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Effecten"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Geluid"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Netwerk"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Misc"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Volume:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Muziek:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+msgid "VOL^Ambient:"
+msgstr "VOL^Achtergrond:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Info:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Items:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Pijn:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Speler:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Schoten:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Spraak:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Wapens:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frequentie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Kanalen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Stereo omwisselen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Koptelefoon modus"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Ruimtelijke stemmen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "VOCS^Geen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "VOCS^Honen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "VOCS^Alles"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Hoon afstand:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "RNG^Erg kort"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "RNG^Kort"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "RNG^Normaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "RNG^Lang"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "RNG^Vol"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Automatisch honen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Tijd notificatie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "WRN^Geen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minuut"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minuten"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "WRN^Beiden"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Tref indicator"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Menu geluiden"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Kwaliteit voorinstellingen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "PRE^"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "PRE^Laag"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "PRE^Middel"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "PRE^Normaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "PRE^Hoog"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "PRE^Ultra"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "PRE^Uitstekend"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Geometrie detail:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "DET^Laagste"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "DET^Laag"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "DET^Normaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "DET^Goed"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "DET^Beste"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "DET^Geweldig"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Antialiasing:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "AA^Uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Textuur resolutie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "RES^"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "RES^Laagste"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "RES^Laag"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "RES^Normaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "RES^Goed"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "RES^Beste"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Voorkom textuur compressie met kwaliteitsverlies"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Anisotropie"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "ANISO^Uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Deeltjes kwaliteit"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Deeltjes afstand"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Decals"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Afstand:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Tijd:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Gebuik "
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Deluxe mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Glans"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Offset mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Relief mapping"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Reflecties"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Vervaagd"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "REFL^Goed"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Scherp"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Laat oppervlaktes zien"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Geen dynamische verlichting"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Flash blend approximation"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Real-time dynamische verlichting"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Schaduwen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Real-time wereld verlichting"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Gebruik normal maps"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Zachte schaduwen"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Coronas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Gebruik Occlusion Queries"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Bloom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "Hoog dynamisch bereik (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Bewegingsonscherpte:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Schadeonscherpte"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Toetsen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Verander toets..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Aanpassen..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Gevoeligheid:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "UI muis snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Muis filter"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Invert muis"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Gebruik joystick input"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Gebruik joystick input"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"console activeren\" sluit deze ook weer"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Keybind van gebruiker"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Opdracht bij drukken:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Opdracht bij loslaten:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Opslaan"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Menu thema’s:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Laat huidige tijd zien"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Laat huidige datum zien"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Laat frames per seconde zien"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Snelheidsmeter"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (verborgen)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "knopen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Laat versnellingsmeter zien"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Versnellingsmeter schaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Minimaliseer input latentie"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Geavanceerde instellingen"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Cvar filter:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Cvar"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Waarde:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Omschrijving:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Client beweging voorspelling"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Netwerk grafiek tonen"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Netwerk snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Langzaam ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Snel ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Breedband"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Inkomende pakketten/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP downloads:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Downloads:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Snelheid (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Client UDP poort:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Resolutie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Tekst/UI afmetingen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "SZ^Onleesbaar"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "SZ^Minuscuul"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "SZ^Miniem"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "SZ^Klein"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "SZ^Gemiddeld"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "SZ^Aanzienlijk"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "SZ^Groot"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "SZ^Gigantisch"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "SZ^Kolossaal"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Kleurdiepte:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Volledig scherm"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Verticale synchronisatie"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Gebruik OpenGL 2.0 shaders (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Gebruik GLSL voor gamma correctie"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Objecten (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "VBO^Uit"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Vertices, sommige Tris (compatibel)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Vertices"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Vertices en Tris"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Diepte eerst:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "DF^Uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "DF^Wereld"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "DF^Alles"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Schakel multithreaded OpenGL uit"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Wacht op GPU voor elk frame"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Helderheid:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Contrast:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Verhoog contrast:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Verzadiging:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+msgid "LIT^Ambient:"
+msgstr "LIT^Omgevingslicht"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Intensiteit:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Singleplayer"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Instant actie! (random map met bots)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Start Singleplayer!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Winnaar"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Team Selectie"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "aansluiten bij het ‘beste’ team (autoselect)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "rood"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "blauw"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "geel"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "roze"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "observeren"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Druk deze knop niet meer in!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"He? Kan (m is NULL) niet spelen. Opnieuw filteren zodat dit niet weer "
+"gebeurt.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "%s zijn Xonotic Server"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"He? Kan (ongeldige spel modus) niet spelen. Opnieuw filteren zodat dit niet "
+"weer gebeurt.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<geen model gevonden>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Bookmark"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Ping"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Server naam"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Map"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Type"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Spelers"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TITEL>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTEUR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "VOL^UIT"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "OL^MAX"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "HTTP verzoek ontvangen voor ongeldig id %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "fout bij ontvangen update melding: status is %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "fout: HTML ontvangen in plaats van update melding\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "fout: enters ontvangen van update meldingsserver"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Update kan gedownload worden bij:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Automatisch map info aanmaken voor nieuwe maps..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Update nu naar %s!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1ERROR: Textuurcompressie is nodig maar niet ondersteund.\n"
+"^1Verwacht grafische problemen.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Assault"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Capture The Flag"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Clan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Domination"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Key Hunt"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Last Man Standing"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Onslaught"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Race"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Race CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Runematch"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Team Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Tuba Smijten"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Achtergrond"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Standaard"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Gebruik standaard"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Team Kleur:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Activeer paneel"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Wegwijzer instellingen"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Xontoic 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Ricardo 'Hellgardia' Silva <ricardo.mccs@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "erro: o estado é &d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Uso: menu_cmd command..., onde estão possíveis comandos:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - recarrega todas as cvars no menu actual"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITEM - selecciona um item do menu como o principal\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "erro a criar curl handle"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Comando inválido. Para uma lista de comandos suportados, escrever menu_cmd "
+"help.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Browser não inicializado!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr ""
+"NOTA: marca texto %s demasiado larga para etiqueta, condensada por factor "
+"%f\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Item %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "modificado"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQ Informação da Build %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Nível %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "vai ser guardado para config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "não será guardado"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "privado"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "definição do motor"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "apenas ler"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Créditos"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Bem-Vindo"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Linguagem do texto:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Nome:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Guardar Definições"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Painel de munições"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Mostrar munições:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Mostrar apenas o tipo de munição actual"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Esquerda"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Direita"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Painel de Conversa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Entradas na Conversa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Tamanho da Conversa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Tempo de vida da Conversa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Som de aviso de Conversa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Painel de Informação do Motor"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Informação do Motor:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Usar um algorítmo médio para os fps"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Painel Vida/Armadura"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Activar barra de estado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Alinhar barra de estado:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Para Dentro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Para Fora"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Alinhamento dos Icones"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Trocar posição da vida e armadura"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Painel de Info de Mensagens"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Informação de mensagens:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Trocar alinhamento"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Painel dos Icones de Mod"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Painel de Notificações"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Notificações:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Imprimir notificações na consola também"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Trocar ordem de notificações"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Tempo de vida de cada entrada:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Desaparecimento de cada entrada:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Painel de Powerups"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Trocar posição do escudo e da força"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Painel das Teclas Pressionadas"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Painel desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Painel activado quando espectador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Painel sempre activado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Forçar aspecto:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Painel do Cronómetro de Corrida"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Painel do Radar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Painel activo em jogos de equipa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Radar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alfa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Rotação:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Para a frente"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Para oeste"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Para sul"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Para este"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Para norte"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Escala:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Modo de ampliação:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Ampliado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Não-Ampliado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Sempre ampliado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Nunca ampliado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Painel de Pontos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Painel Temporizador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Temporizador:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Mostrar tempo passado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Painel de votos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Alfa após votagem:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Painel das Armas"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Desaparecer após:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Nunca"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Efeito de desaparecimento"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#, fuzzy
+msgid "EF^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Deslocador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alfa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Icones das armas"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Mostra o ID da arma como:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#, fuzzy
+msgid "SHOWAS^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Número"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Ligar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Mostrar Pontaria"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Mostrar Munições"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Cor da barra de munições:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Cor da barra alfa:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Configuração do painel do HUD"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Fundo do painel por defeito:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Desactivar"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Cor:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Tamanho do limite:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Cor da Equipa:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Testa cor da equipa no modo de configuração"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Padding:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Local do HUD:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+#, fuzzy
+msgid "DOCK^Disabled"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+#, fuzzy
+msgid "DOCK^Small"
+msgstr "Pequena"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+#, fuzzy
+msgid "DOCK^Medium"
+msgstr "Média"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+#, fuzzy
+msgid "DOCK^Large"
+msgstr "Grande"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Definições da Rede:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Fixar paineis à Rede"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Tamanho da Rede:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Sair da configuração"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Multi-jogador"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Servidores"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Criar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Configuração do Jogador"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Tipo de jogo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Definições de jogo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Tempo limite:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Usar definição específica do mapa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Limite de pontos:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Slots para Jogadores:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Número de jogadores controlados pelo computador:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Nível de dificuldade:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Bot"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Iniciado"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Vais ganhar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Podes ganhar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Talvez ganhes"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Avançado"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Perito"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Profissional"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Assassino"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Desumano"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Divinal"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Mutators..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Definições avançadas..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Lista de mapas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Seleccionar todos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Seleccionar nenhum"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Começar Multijogador!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Limite de capturas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Vidas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Voltas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Golos:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Limite de Frags:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Definições avançadas do servidor"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Definições de Jogo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Permitir espectador"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Protecção de Spawn:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Velocidade do jogo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Definições de Jogo de Equipa:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Escala de Dano nos aliados:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Dano nos Aliados Virtual (Apenas o efeito)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Penalização por Dano nos Aliados:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Penalidade Virtual (Apenas o efeito)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Equipas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Votação de mapa:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Sem votação"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 escolhas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Maioria ganha vcall"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Informação do Mapa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Colocação total dos items"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Apenas MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Título:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Autor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Características:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Modos de jogo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Fechar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Jogar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Mutators"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Arena com Todas as Armas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Arena com Maior Parte das Armas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s Arena"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Desvio"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Voar com Rockets"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Sem armas iniciais"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Pouca gravidade"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Escondido"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Gancho"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "A meio do ar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampiro"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Armas ficam"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Perda de sangue"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Jetpack"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#, fuzzy
+msgid "MUT^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Mutators de jogabilidade"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Mutators de armas e items"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Gancho de trepar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Arenas de Armas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Regular (não arena específica)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "com laser"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Arenas Especiais:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Maior parte das Armas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Gravar demos enquanto joga"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Filtrar:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Limpar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Demo temporizado"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Juntar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+#, fuzzy
+msgid "SRVS^Empty"
+msgstr "Vazio"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+#, fuzzy
+msgid "SRVS^Full"
+msgstr "Total"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Pausar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Endereço:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Informação..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Juntar!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Informação do Servidor"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d definições modificadas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Definições oficiais"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (não conseguiu ligar)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "não é suportado (não conseguiu ligar)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "não suportado (não encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "suportado (vai encriptar)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "suportado (não encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "pedido (encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "pedido (não encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "necessário (não consegue ligar)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "necessário (encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Jogadores:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Tipo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Mapa:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Jogabilidade:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Jogadores controlados pelo computador:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Mod:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Versão:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Ping:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Chave:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Encriptação:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Modelo:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Campo de visão:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Ver tremor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Factor de Ampliação (ZOOM):"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Velocidade de Ampliação (ZOOM):"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Definições das Armas..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Mira:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Por arma"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Tamanho da mira:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Alfa da mira:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Cor da mira:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Activar ponto central"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Tamanho:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Teste de Tiro:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+#, fuzzy
+msgid "HTST^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "PontariaCerta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Inimigos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Configurar caminhos..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Entrar no editor do HUD"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Forçar modelos:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+#, fuzzy
+msgid "MDL^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+#, fuzzy
+msgid "MDL^Custom"
+msgstr "Modificado"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+#, fuzzy
+msgid "MDL^All"
+msgstr "Todos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Desactivar sangue/violencia"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Tripas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+#, fuzzy
+msgid "GIBS^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "Poucas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+#, fuzzy
+msgid "GIBS^Many"
+msgstr "Muitas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+#, fuzzy
+msgid "GIBS^Lots"
+msgstr "Imensas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Dano Colateral:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Aplicar imediatamente"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Caminhos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Mostrar caminhos base"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Escala dos Caminhos:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Caminhos alfa:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Mostrar nomes:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Companheiros de Equipa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Todos os jogadores"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Definições de Armas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Prioridade das Armas:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Cima"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Baixo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Usar lista de prioridades para ciclo entre as armas"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Mudar armas automaticamente ao apanhar do chão"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Desenhar modelo da arma na 1a pessoa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Alinhamento à esquerda"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Alinhamento à direita"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Trocar vista horizontal"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Novidades"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Sair"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Tens a certeza que queres sair?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Sim"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Não"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Definições"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Input"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Vídeo"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Efeitos"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Som"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Rede"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Misc"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Principal:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Música:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#, fuzzy
+msgid "VOL^Ambient:"
+msgstr "Som Ambiente:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Informação:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Items:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Dor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Jogador:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Tiros:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Voz:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Armas:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frequência:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Canais:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Trocar Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Modo de Headphones"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Vozes espaciais:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#, fuzzy
+msgid "VOCS^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#, fuzzy
+msgid "VOCS^Taunts"
+msgstr "Taunts"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#, fuzzy
+msgid "VOCS^All"
+msgstr "Todos"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Nível dos taunts:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#, fuzzy
+msgid "RNG^Very short"
+msgstr "Muito baixo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#, fuzzy
+msgid "RNG^Short"
+msgstr "Baixo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#, fuzzy
+msgid "RNG^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#, fuzzy
+msgid "RNG^Long"
+msgstr "Alto"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#, fuzzy
+msgid "RNG^Full"
+msgstr "Total"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Taunts Automáticos"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Aviso de tempo:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#, fuzzy
+msgid "WRN^None"
+msgstr "Nenhum"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minuto"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minutos"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#, fuzzy
+msgid "WRN^Both"
+msgstr "Ambos"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Indicador de tiro acertado"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Sons do menu"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Predefinição de Qualidade:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+#, fuzzy
+msgid "PRE^OMG!"
+msgstr "OMG!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+#, fuzzy
+msgid "PRE^Low"
+msgstr "Baixa"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+#, fuzzy
+msgid "PRE^Medium"
+msgstr "Média"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+#, fuzzy
+msgid "PRE^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+#, fuzzy
+msgid "PRE^High"
+msgstr "Alta"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+#, fuzzy
+msgid "PRE^Ultra"
+msgstr "Ultra"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+#, fuzzy
+msgid "PRE^Ultimate"
+msgstr "Máxima"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Detalhes geométricos:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+#, fuzzy
+msgid "DET^Lowest"
+msgstr "Mínimo"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+#, fuzzy
+msgid "DET^Low"
+msgstr "Baixa"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+#, fuzzy
+msgid "DET^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+#, fuzzy
+msgid "DET^Good"
+msgstr "Bom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+#, fuzzy
+msgid "DET^Best"
+msgstr "Melhores"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+#, fuzzy
+msgid "DET^Insane"
+msgstr "Máximo"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Antialiasing:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+#, fuzzy
+msgid "AA^Disabled"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2 passagens"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4 passagens"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Resolução das texturas:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+#, fuzzy
+msgid "RES^Leet"
+msgstr "Leet"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+#, fuzzy
+msgid "RES^Lowest"
+msgstr "Mínimo"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+#, fuzzy
+msgid "RES^Low"
+msgstr "Baixa"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#, fuzzy
+msgid "RES^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+#, fuzzy
+msgid "RES^Good"
+msgstr "Bom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+#, fuzzy
+msgid "RES^Best"
+msgstr "Melhores"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Evitar compressão de Texturas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Filtro Anisotrópico:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+#, fuzzy
+msgid "ANISO^Disabled"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Qualidade das Partículas:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Distancia visível das Partículas:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Símbolos"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Distância:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Tempo:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Usar lightmaps"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Mapeamento Deluxe"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Lustro"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Mapeamento Offset"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Mapeamento Relief"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Reflexos:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Grau de Blur"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#, fuzzy
+msgid "REFL^Good"
+msgstr "Bom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Grau de Definição"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Mostrar superfícies"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Iluminação dinâmica desligada"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Aproximação Flash Blend"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Iluminação dinâmica em tempo real"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Sombras"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Iluminação do mundo em tempo real"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Usar mapas normais"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Sombras Suaves"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Coronas"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Usar Consultas Oclusão"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Bloom"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "High Dynamic Range (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Distorção por movimento:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Distorção por dano:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Bindings de Teclas"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Mudar tecla..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Editar..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Sensibilidade:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Velocidade do rato:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Filtro do Rato"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Inverter Rato"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Usar input do joystick"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Desligar aceleração de Rato do SO"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"entrar na consola\" também fecha"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Keybinds definidas pelo utilizador"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Comando quando carregado:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Comando quando largado:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Guardar"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Skins de Menu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Mostrar tempo corrente"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Mostrar data corrente"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Mostrar Frames por Segundo"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Medidor de Velocidade"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (escondido)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "nós"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Mostrar accelerómetro"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Escala do accelerómetro:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Minimizar latência de entrada"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Definições avançadas"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Filtro de Cvar"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Definição:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Valor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Descrição:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Previsão de movimento pelo Cliente"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Mostrar gráfico-net"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Velocidade da Rede:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "ADSL Lenta"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "ADSL Rápida"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Banda-larga"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Pacotes Entrada /s"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "Transferências via HTTP:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Transferências:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Velocidade (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Port UDP do Cliente:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Resolução:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Font/UI - tamanho:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+#, fuzzy
+msgid "SZ^Unreadable"
+msgstr "Ilegível"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+#, fuzzy
+msgid "SZ^Tiny"
+msgstr "Minuscula"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+#, fuzzy
+msgid "SZ^Little"
+msgstr "Muito Pequena"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+#, fuzzy
+msgid "SZ^Small"
+msgstr "Pequena"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+#, fuzzy
+msgid "SZ^Medium"
+msgstr "Média"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+#, fuzzy
+msgid "SZ^Large"
+msgstr "Grande"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+#, fuzzy
+msgid "SZ^Huge"
+msgstr "Enorme"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+#, fuzzy
+msgid "SZ^Gigantic"
+msgstr "Gigante"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+#, fuzzy
+msgid "SZ^Colossal"
+msgstr "Colossal"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Profundidade da cor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Ecrã Inteiro"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Sincronização Vertical"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Usar shaders OpenGL2.0 (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Usar GLSL para o controlo de cores"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Objectos Vertex Buffers (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+#, fuzzy
+msgid "VBO^Off"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Vértices, alguns Triângulos (compatível)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Vértices"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Vértices e Triângulos"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Profundidade primeiro:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#, fuzzy
+msgid "DF^Disabled"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#, fuzzy
+msgid "DF^World"
+msgstr "Mundo"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#, fuzzy
+msgid "DF^All"
+msgstr "Todos"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Desactivar OpenGL em múltiplos threads"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Esperar que a placa gráfica termine cada frame"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Brilho:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Contraste:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gamma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Contraste - Boost"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Saturação da Cor:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#, fuzzy
+msgid "LIT^Ambient:"
+msgstr "Som Ambiente:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Intensidade:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Um Jogador"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Acção Instantânea! (Mapa ao acaso contra o computador)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Começar Um só Jogador!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Vencedor"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Selecção de Equipa"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "juntar 'melhor' equipa (selecção automática)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "vermelha"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "azul"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "amarela"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "rosa"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "espectador"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Não voltar a carregar neste botão!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Huh? Não posso jogar isto (m é NULL). Voltando a filtrar de maneira a que "
+"isto não se repitanovamente.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "Servidor de Xonotic do %s"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Huh? Não posso jogar isto (tipo de jogo inválido). Voltando a filtrar de "
+"maneira a que isto não se repitanovamente.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<nenhum modelo encontrado>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Remover"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Marcar"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Ping"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Nome do Host"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Mapa"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Tipo"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Jogadores"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TÍTULO>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTOR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+#, fuzzy
+msgid "VOL^OFF"
+msgstr "DESLIGADO"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+#, fuzzy
+msgid "VOL^MAX"
+msgstr "MÀX"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Recebido um pedido HTTP de um id inválido %d. \n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "erro ao receber notificação: o estado e %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "erro: recebido HTML em vez de notificação de actualização\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr ""
+"erro: recebido 'carriage return' de um servidor de notificação de "
+"actualização\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Actualização pode ser transferida em:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Informação de mapas auto-gerada para novos mapas..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Actualize para %s agora!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1ERRO: A compressão de texturas é necessária mas não é suportada.\n"
+"^1Possíveis problemas visuais.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Assalto"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Captura a Bandeira"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Clan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Combate até à Morte"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Domínio"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Procura da Chave"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "O Ultimo a Cair"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Investida"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Corrida"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Corrida CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Luta de Runas"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Combate até à Morte por Equipas"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Tuba Throwing"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Fundo:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Por Defeito"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Usar defeito"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Cor da Equipa:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Actival painel"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Definições dos caminhos:"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# Xonotic Romanian Translation.
+# Copyright (C) 2011
+# This file is distributed under the same license as the PACKAGE package.
+# MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>, 2011.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Xonotic 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: 2011-01-18 11:53+0100\t\n"
+"Last-Translator: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "eroare: statusul este %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Utilizare: menu_cmd comanda..., unde comenzile posibile sunt:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - reincarca toate variabilele de pe pagina de meniu curenta\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr ""
+" directmenu OBIECT - selecteaza un obiect din meniu ca obiect principal\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "eroare in crearea unei manevre curl"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Comanda invalida. Pentru o lista cu comenzile suportate, scrieti menu_cmd "
+"ajutor (in consola).\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Browserul nu a fost initializat!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr "ATENTIE: eticheta text %s este prea mare, condensata cu %f\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Obiect %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "personalizat"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4MQC Informatii compilare: %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Nivelul %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "se va salva catre config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "nu se va salva"
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "privat"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "setari motor"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "numai de citit"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Credite"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Bun venit"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Limba text:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Nume:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Salvare setari"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Fereastra Munitii"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Afisaj mutitii:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Afiseaza numai munitia armei selectate"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Stanga"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Dreapta"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Fereastra Chat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Intrari chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Marime chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Durata chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Sunet chat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Fereastra Informatii Motor"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Informatii motor:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Utilizare algoritm centrare FPS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Fereastra Viata/Armura"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Activare bara de statut"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Aliniere bara de statut:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Interior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Exterior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Aliniere iconuri:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Oglindire pozitie viata/armura"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Fereastra Informatii"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Informatii:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Oglindire pozitie"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Fereastra Iconuri Moduri"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Fereastra Notificatii"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Notificatii:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Printare notificatii si in consola"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Inversare ordine notificatii"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Durata notificare:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Durata atenuare notificatie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Fereastra Powerup"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Oglindire pozitie iconuri"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Fereastra Taste Apasate"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Dezactivata"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Activa pentru spectatori"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Mereu activa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Aspect fortat:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Fereastra Timp Curse"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Fereastra Radar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Activa in jocuri de echipa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Radar:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Opacitate:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Rotatie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Inainte"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Vest"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Sud"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Est"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Nord"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Marime:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Modalitate Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "In interior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "In exterior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Permanent activ"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Niciodata activ"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Fereastra Scor"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Fereastra Timp"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Timp:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Afisaj timp ramas"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Fereastra Voturi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Opacitate dupa vot:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Fereastra Arme"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Atenuare opacitate dupa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Niciodata"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Atenuare opacitate:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#, fuzzy
+msgid "EF^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Glisare"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Opacitate"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Iconuri arme:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Afisaj ID arme ca:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#, fuzzy
+msgid "SHOWAS^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Numar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Tasta"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Afisaj Acuratete"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Afisaj Munitie"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Culoare bara munitie:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Opacitate bara munitie:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Configurate Interfata (HUD)"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Setari normale fond:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Culoare:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Marime borduri:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Culoare echipa:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Testare culoare echipa in timpul configurarii"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Ajustare:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Magnet ferestre:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+#, fuzzy
+msgid "DOCK^Disabled"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+#, fuzzy
+msgid "DOCK^Small"
+msgstr "Mic"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+#, fuzzy
+msgid "DOCK^Medium"
+msgstr "Mediu"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+#, fuzzy
+msgid "DOCK^Large"
+msgstr "Mare"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Setari grila:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Utilizare grila pentru ferestre"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Marime grila:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Iesire configurare"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Multiplayer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Servere"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Creare Joc"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demonstratii"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Setari Jucator"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Mod joc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Setari meci:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Limita de timp:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Utilizare setari harta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Limita de puncte:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Numar maxim jucatori:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Numar boti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Dificultate boti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Nula"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Incepator"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Vei castiga"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Poti castiga"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Ai putea castiga"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Avansat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Expert"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Profesional"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Asasin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Inuman"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Dumnezeiesc"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Modificari speciale..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Setari avansate..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Lista harti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Selecteaza totul"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Golire selectie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Pornire Joc Multiplayer!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Limita de capturi:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Vieti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Ture:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Goluri:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Limita de omoruri:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Setari avansate server"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Setari joc"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Perimite spectatori"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Scut pornire:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Viteza joc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Setari echipe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Scara foc prietenesc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Foc prietenesc virtual (efect)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Penalitate foc prietenesc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Penalitate virtuala (efect)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Echipe:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Vot harti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Vot dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 alegeri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 alageri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Majoritatea castiga mereu"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Informatii harta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Plasare obiecte"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Numai MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Titlu:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Autor:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Trasaturi:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Moduri de joc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Inchidere"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Joaca"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Modificari speciale"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Toate armele"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Cele mai multe arme"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "Arena %s"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Satiruta laterala"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Zbor Rachete"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Fara arme initiale"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Gravitatie scazuta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Jucatori transparenti"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Carlig"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Lovituri in aer"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Vampir"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Arme persistente"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Pierdere de sange"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Reactie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#, fuzzy
+msgid "MUT^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Modificari speciale joc:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Modificari speciale arme si obiecte:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Carlig"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Arene arme:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Normal (fara arene)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "cu arma laser"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Arene speciale:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Majoritatea armelor"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Demonstratie"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Creare demonstratii in timpul jocului"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Filtrare:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Curatare"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Timedemo"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Alaturare"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+#, fuzzy
+msgid "SRVS^Empty"
+msgstr "Gol"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+#, fuzzy
+msgid "SRVS^Full"
+msgstr "Plin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Pauza"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Adresa:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Informatii..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Alaturare!"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Informatii Server"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "N/A"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "%d setari modificate"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Setarile oficiale"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "N/A (nu se poate conecta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "nesuportat (nu se poate conecta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "nesuportat (nu se poate encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "suportat (se va encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "suportat (nu se va encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "cerut (se va encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "cerut (nu se va encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "necesar (nu se poate conecta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "necesar (se va encripta)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Jucatori:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Tip:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Harta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Mod:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Boti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Modificare:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Versiune:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Latenta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Cheie:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Encriptare:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Model:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Camp vizual:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Miscare camera mers:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Factor Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Viteza Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Setari arme..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Ochian:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Depinde de arma"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Marime ochian:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Opacitate ochian:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Culoare ochian:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Utilizare punct ochian"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Marime:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Detectare tinta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+#, fuzzy
+msgid "HTST^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Dusmani"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Setari indicatoare..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Editor interfata"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Modele jucator fortate:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+#, fuzzy
+msgid "MDL^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+#, fuzzy
+msgid "MDL^Custom"
+msgstr "Personalizat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+#, fuzzy
+msgid "MDL^All"
+msgstr "Toate"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Dezactivare efecte violente"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Cotlete:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+#, fuzzy
+msgid "GIBS^None"
+msgstr "Nici unul"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "Putine"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+#, fuzzy
+msgid "GIBS^Many"
+msgstr "Multe"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+#, fuzzy
+msgid "GIBS^Lots"
+msgstr "Foarte multe"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Efect ranire:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Aplica imediat"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Indicatoare"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Afisaj indicatoare de baza"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Marime indicatoare:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Opacitate indicatoare:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Afisaj nume:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Coechipieri"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Toti jucatorii"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Setari arme"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Lista prioritate arme:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Sus"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Jos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Utilizare lista pentru selectarea armelor"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Selectare automata a armelor obtinute"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Afisaj model 1st person"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Aliniere stanga"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Aliniere dreapta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Oglindire orizontala ecran"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Stiri"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Iesire"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Sunteti sigur ca vreti sa iesiti?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Da"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Nu"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Setari"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Control"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Video"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Efecte"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Audio"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Retea"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Altele"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "General:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Muzica:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#, fuzzy
+msgid "VOL^Ambient:"
+msgstr "Ambianta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Informatii:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Obiecte:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Durere:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Jucator:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Focuri de arma:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Voci:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Arme:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frecventa:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Canale:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Mono"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Inversare canale stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Mod casti audio"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Voci spatializate:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#, fuzzy
+msgid "VOCS^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#, fuzzy
+msgid "VOCS^Taunts"
+msgstr "Glume"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "Toate"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Distanta voci:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#, fuzzy
+msgid "RNG^Very short"
+msgstr "Foarte scurta"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#, fuzzy
+msgid "RNG^Short"
+msgstr "Scurta"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#, fuzzy
+msgid "RNG^Normal"
+msgstr "Normala"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#, fuzzy
+msgid "RNG^Long"
+msgstr "Lunga"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#, fuzzy
+msgid "RNG^Full"
+msgstr "Toate"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Glume automate"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Avertisment timp:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#, fuzzy
+msgid "WRN^None"
+msgstr "Nici una"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minut"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minute"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#, fuzzy
+msgid "WRN^Both"
+msgstr "Ambele"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Indicator lovituri"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Sunete meniu"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Setari calitate:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+#, fuzzy
+msgid "PRE^OMG!"
+msgstr "SFINTE!"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+#, fuzzy
+msgid "PRE^Low"
+msgstr "Scazut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+#, fuzzy
+msgid "PRE^Medium"
+msgstr "Mediu"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+#, fuzzy
+msgid "PRE^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+#, fuzzy
+msgid "PRE^High"
+msgstr "Ridicat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+#, fuzzy
+msgid "PRE^Ultra"
+msgstr "Foarte ridicat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+#, fuzzy
+msgid "PRE^Ultimate"
+msgstr "Extrem de ridicat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Detaliu geometrie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+#, fuzzy
+msgid "DET^Lowest"
+msgstr "Cel mai scazut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+#, fuzzy
+msgid "DET^Low"
+msgstr "Scazut"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+#, fuzzy
+msgid "DET^Normal"
+msgstr "Normal"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+#, fuzzy
+msgid "DET^Good"
+msgstr "Ridicat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+#, fuzzy
+msgid "DET^Best"
+msgstr "Cel mai ridicat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+#, fuzzy
+msgid "DET^Insane"
+msgstr "Extrem"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Margini fine:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+#, fuzzy
+msgid "AA^Disabled"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Calitate texturi:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+#, fuzzy
+msgid "RES^Leet"
+msgstr "Minima"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+#, fuzzy
+msgid "RES^Lowest"
+msgstr "Cea mai joasa"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+#, fuzzy
+msgid "RES^Low"
+msgstr "Joasa"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#, fuzzy
+msgid "RES^Normal"
+msgstr "Normala"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+#, fuzzy
+msgid "RES^Good"
+msgstr "Ridicata"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+#, fuzzy
+msgid "RES^Best"
+msgstr "Cea mai ridicata"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Evitare compresie rapida texturi"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Filtrare anisotropica:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+#, fuzzy
+msgid "ANISO^Disabled"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Calicate particule:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Distanta particule:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Semne"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Distanta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Durata:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Utilizare lightmap"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Texturi Deluxe"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Suprafete lucioase"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Relief"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Detaliu relief"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Reflectii:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Blurate"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#, fuzzy
+msgid "REFL^Good"
+msgstr "Bune"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Ascutite"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Afisaj suprafete"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Luminozitate dinamica dezactivata"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Luminozitate dinamica rapida"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Luminozitate dinamica in timp real"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Umbre"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Luminozitate ambienta in timp real"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Utilizare texturi normale"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Umbre fine"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Coroane lumini"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Utilizare Ocluzii"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Luminozitate moale"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "Distanta Dinamica Inalta (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Blurare viteza:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Blurare ranire:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Taste:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Schimbare tasta..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Editare..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Sensitivitate:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Viteza mouse in meniu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Filtrare mouse"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Inversare mouse"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Utilizare joystick"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Dezactivare acceleratie mouse din OS"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"enter\" inchide si consola"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Functionalitate tasta definita:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Commanda apasare tasta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Commanda eliberare tasta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Salvare"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Anulare"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Stil meniu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Afisaj ora"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Afisaj data"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Afisaj cadre pe secunda"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Vitezometru"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (ascuns)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "noduri"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Afisaj metru acceleratie"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Marime metru acceleratie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Minimizare latenta control"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Setari avansate"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Filtru variabile:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Setari:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Valoare:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Descriere:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Predictie miscare"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Afisaj grafic retea"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Viteza retea:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "ADSL lent"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "ADSL rapid"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Cablu/Fibra optica"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Pachete intrare/secunda:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "Descarcari HTTP:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Descarcari simultane:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Viteza (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Port UDP client:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Rezolutie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Marime font:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+#, fuzzy
+msgid "SZ^Unreadable"
+msgstr "Ilizibil"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+#, fuzzy
+msgid "SZ^Tiny"
+msgstr "Minuscul"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+#, fuzzy
+msgid "SZ^Little"
+msgstr "Foarte mic"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+#, fuzzy
+msgid "SZ^Small"
+msgstr "Mic"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+#, fuzzy
+msgid "SZ^Medium"
+msgstr "Mediu"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+#, fuzzy
+msgid "SZ^Large"
+msgstr "Mare"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+#, fuzzy
+msgid "SZ^Huge"
+msgstr "Foarte mare"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+#, fuzzy
+msgid "SZ^Gigantic"
+msgstr "Gigantic"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+#, fuzzy
+msgid "SZ^Colossal"
+msgstr "Colosal"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Adancime culoare:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "Ecran plin"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Sincronizare Verticala"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Utilizare OpenGL 2.0 (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Utilizare GLSL pentru culori"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Tampon Memorie Obiecte (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+#, fuzzy
+msgid "VBO^Off"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Puncte, unele Triunghiuri (compatibil)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Puncte"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Puncte si Triunghiuri"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Calcul adancime:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#, fuzzy
+msgid "DF^Disabled"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#, fuzzy
+msgid "DF^World"
+msgstr "Mediul"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#, fuzzy
+msgid "DF^All"
+msgstr "Totul"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Dezactiveaza OpenGL multi-core"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Asteapta ca GPU sa termine fiecare cadru"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Luminozitate:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Contrast:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Gama:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Exagerare contrast:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Saturatie:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#, fuzzy
+msgid "LIT^Ambient:"
+msgstr "Ambianta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Intensitate:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Joc singular"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Actiune instanta! (harta aleatorie cu boti)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Pornire Joc Singular!"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Castigator"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Selectie echipa"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "cea mai potrivita echipa (selectie automata)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "rosu"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "albastru"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "galben"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "roz"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "spectator"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Nu mai apasati acest buton din nou!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Huh? Nu se poate juca asta (m este NUL). Re-filtrez pentru a preveni asta pe "
+"viitor.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "Serverul Xonotic al lui %s"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Huh? Nu se poate juca asta (tipul jocului este invalid). Re-filtrez pentru a "
+"preveni asta pe viitor.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<nu a fost gasit nici un model>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Stergere"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "Favorit"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Latenta"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Nume server"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Harta"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Mod"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Jucatori"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<TITLU>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<AUTOR>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+#, fuzzy
+msgid "VOL^OFF"
+msgstr "OPRIT"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+#, fuzzy
+msgid "VOL^MAX"
+msgstr "MAXIM"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s dB"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Primit cerere HTTP pentru un id invalid %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "eroare primire notificare update: statutul este %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "eroare: primit HTML in schimbul unei notificari de update\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "eroare: primit un mesaj eronat de la serverul de notificari update\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Un update se poate descarca aici:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Auto-generare mapinfo pentru hartile proaspat adaugate..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Updatati la %s acum!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1EROARE: Comprimarea texturilor este necesara dar nu si suportata.\n"
+"^1Asteptati-va la probleme vizuale.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Asalt"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Captureaza Steagul"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Clan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Meciul Mortii"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Dominatie"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Inghet"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Vanatoarea Cheilor"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Ultimul Supravietuitor"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Onslaught"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Cursa"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Cursa CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Runematch"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Meciul Mortii (in echipa)"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "Arunca @!#%'n Tuba"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Fundal:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Setare normala"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Utilizare setare normala"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Culoare echipa:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Activare panou"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Setari indicatoare:"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# Xonotic Menu
+# Copyright (C) 2011 Team Xonotic
+# This file is distributed under the same license as the Xonotic package.
+# Lord Canistra <lordcanistra@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1preview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:50+0100\n"
+"PO-Revision-Date: 2011-01-20 13:16+0300\n"
+"Last-Translator: Nikoli <nikoli@lavabit.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "ошибка: статус %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Использование: menu_cmd command..., где возможные команды:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " синх. - обновляет все cvar на текущей странице меню\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITEM - определить элемент меню как главный элемент\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "ошибка при создании curl handle\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Неверная команда. Попробуйте menu_cmd help, чтобы получить список доступных "
+"команд.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr "Браузер не запущен!"
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr "ВНИМАНИЕ: текст %s слишком широк для надписи, сжат до %f раз\n"
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr "Предмет %d"
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr "%d (%s)"
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr "особо"
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr "^4Сведения о сборке MQC: %s\n"
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr "???"
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr "Уровень %d: %s"
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr "будет сохранено в config.cfg"
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr "не будет сохранено"
+
+# личное, частное
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr "личное"
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr "установка движка"
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr "только чтение"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr "Разработчики"
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "ОК"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr "Добро пожаловать"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+"Добро пожаловать в Xonotic. Для начала, пожалуйста, выберите ваш язык и "
+"введите ваше имя. Позже вы сможете изменить эти настройки в меню."
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Text language:"
+msgstr "Язык меню:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Имя:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
+msgstr "Сохранить настройки:"
+
+# делать транслитерацию вместо перевода нежелательно, panel можно перевести как:
+# область, табло, (приборная) доска, щит, лист, плата, плита, список
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr "Панель боеприпасов"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr "Показ боеприпасов:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr "Показывать только текущий вид боеприпасов"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr "Слева"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr "Справа"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr "Панель чата"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr "Записи в чате:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr "Размер чата:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr "Время жизни:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr "Звук чата:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr "Панель сведений о движке"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr "Сведения о движке:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr "Исп. алгоритм усреднения для FPS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr "Панель здоровья/брони"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr "Включить полосу состояния"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr "Выравнивание полосы состояния:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr "Внутрь"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr "Наружу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr "Выравнивание иконок:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr "Поменять местами здоровье и броню"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr "Панель информационных сообщений"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr "Инф. сообщения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr "Перевернуть выравнивание"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr "Панель иконок мода"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr "Панель уведомлений"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr "Уведомления:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr "Также показывать уведомления в консоли"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr "Обратить порядок уведомлений"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr "Время видимости:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr "Время исчезновения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr "Панель бонусов"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr "Поменять местами Силу и Щит"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr "Панель нажатых кнопок"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr "Включена при наблюдении"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Всегда включена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr "Соотношение:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Панель Гоночного Таймера"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr "Панель радара"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr "Панель включена в командных играх"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr "Радар:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Прозрачность:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr "Поворот:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr "Взгляд"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr "Запад"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr "Юг"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr "Восток"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr "Север"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr "Размер:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr "Режим увел.:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr "Приближён"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr "Не приближён"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr "Всегда приближён"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr "Никогда не приближён"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Таблица Очков"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr "Панель таймера"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr "Таймер:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr "Показывать прошедшее время"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr "Панель голосования"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr "Прозр. после голосования:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Панель оружия"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Исчезать после:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Никогда"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%dс"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Эффект исчезновения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr "Отсутствует"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Скольжение"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Исчезновение"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Иконки оружия:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Показывать ID оружия как:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr "Не показывать"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Число"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Привязка"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Показывать Точность"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Показывать Боеприпасы"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Цвет полосы боеприпасов"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Прозрачность полосы боеприпасов:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr "Настройка панелей"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr "Фон по умолчанию:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Отключить"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Цвет:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Ширина краёв:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr "Цвет команды:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Проверить цвет команды в режиме настройки"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Промежуток:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr "Область HUD:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr "Небольшая"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr "Средняя"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr "Большая"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr "Настройки сетки:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr "Передвижение панелей по сетке"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr "Шаг сетки:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr "X:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr "Y:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr "Выйти из настроек"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Игра по сети"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Серверы"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Создать"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Демо"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Настройки игрока"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr "Вид игры:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr "Настройки состязания:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr "Предел времени:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr "Исп. предел карты"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr "Предел очков:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr "Кол-во игроков:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr "Кол-во ботов:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr "Уровень ботов:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr "Ботоподобный"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr "Новичок"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr "Легко победить"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr "Можно победить"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr "Возможно победить"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr "Продвинутый"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr "Опытный"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr "Профессионал"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr "Убийца"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr "Сверхчеловек"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr "Богоподобный"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr "Мутаторы..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr "Доп. настройки..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr "Список карт:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr "Выбрать все"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr "Снять выделение"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr "Начать игру по сети"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr "Предел захватов:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr "Жизни:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr "Круги:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr "Цели:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr "Предел убийств:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr "Доп. серверные настройки"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr "Настройки игры:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr "Разрешить наблюдение"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr "Защита при возрождении"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr "Скорость игры:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr "Настройки команд:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr "Огонь по союзникам:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr "Мнимый огонь по союзникам (только впечатление)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr "Штраф за огонь по союзникам"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr "Мнимый штраф (только впечатление)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr "Команды:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr "Голосование за карты:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr "Без голосования"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr "2 выбора"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr "3 выбора"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr "4 выбора"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr "5 выборов"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr "6 выборов"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr "7 выборов"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr "8 выборов"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr "9 выборов"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr "Простое большинство выигрывает"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Сведения о карте"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "С оружием"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Только MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Заголовок:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Автор:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Особенности:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Режимы игры:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Закрыть"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Играть"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr "Мутаторы"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr "Арена со всем оружием"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr "Арена с большинством оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr "%s Арена"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr "Уклонение"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr "MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr "NIX"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr "Ракетный полёт"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr "Начинать без оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr "Низкая гравитация"
+
+# В игре это включает не невидимость, а полупрозрачность, хотя так переводить вполне уместно.
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr "Невидимость"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr "Крюк"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr "Воздушный бой"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr "Вампиризм"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr "Piñata"
+
+# "Неисчерпаемое Оружие" - неправильно, галка не даёт бесконечный боеприпас, а сохраняет все подобранные оружия после каждого возраждения.
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr "Оружия остаются"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr "Кровотечение"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr "Реактивный ранец"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr "Отсутствуют"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr "Мутаторы игрового процесса:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr "Мутаторы оружия и предметов:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr "Крюк"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr "Арены оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr "Обычная (не арена)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr "с лазером"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr "Особые арены:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr "Большинство оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr "Демо"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr "Записывать демо во время игры"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr "Фильтр:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Очистить"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr "Проверка производительности"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr "Присоединиться"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr "Пустые"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
+msgstr "Полные"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr "Пауза"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr "Адрес:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr "Сведения..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr "Присоединиться"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr "Сведения о сервере"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr "Н/Д"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr "кол-во изменённых настроек: %d"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr "Официальные настройки"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr "Н/Д (не могу подключиться)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr "не поддерживается (не могу подключиться)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr "не поддерживается (шифрования не будет)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr "поддерживается (будет шифрование)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr "поддерживается (шифрования не будет)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr "запрошено (будет шифрование)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr "запрошено (шифрования не будет)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr "требуется (не могу подключиться)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr "требуется (будет шифрование)"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr "Игроки:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Вид:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr "Карта:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr "Геймплей:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr "Боты:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr "Мод:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr "Версия:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr "Пинг:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr "CA:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr "Ключ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr "Шифрование:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr "Модель:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr "Угол обзора:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr "Качание вида:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr "Множитель увеличения:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr "Скорость увеличения:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr "Настройки оружия..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr "Прицел:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr "Зависит от оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr "Величина прицела:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr "Прозрачность:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr "Цвет прицела:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr "Точка в центре"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr "Размер:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr "Проверка на попадание:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr "TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr "Враги"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr "Настройка отметок..."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr "Войти в редактор HUD"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr "Использовать свои модели:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr "Нет"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr "Вместо нестандартных"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+msgid "MDL^All"
+msgstr "Вместо всех"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr "Отключить эффекты жестокости"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr "Ошмётки:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr "Нет"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr "Мало"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr "Много"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr "Тонны"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr "Изображ. урона"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Применить"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr "Отметки"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr "Показывать основные отметки"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr "Размер отметок:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr "Прозрачность отметок:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr "Показывать имена:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr "Союзники"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr "Все игроки"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Настройки оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Список приоритета оружия:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr "Вверх"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr "Вниз"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr "Использовать приоритеты для прокрутки оружия"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr "Автоматически переключаться на поднятое оружие"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr "Показывать модель оружия в руках"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Слева"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr "Справа"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr "Перевернуть изображение по горизонтали"
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr "Новости"
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr "http://www.xonotic.org/team/blog/"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr "Выход"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr "Вы точно желаете выйти?"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr "Да"
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr "Нет"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Настройки"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Ввод"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Изображение"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Эффекты"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Звук"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Сеть"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Разное"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Главный:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Музыка:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+msgid "VOL^Ambient:"
+msgstr "Фоновые звуки:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Инфо:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Предметы:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Боль:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Игрок:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Выстрелы:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Голос:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Оружие:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Частота:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr "8 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr "11.025 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr "16 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr "22.05 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr "24 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr "32 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr "44.1 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr "48 кГц"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Каналы:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr "Моно"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr "Стерео"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr "2.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr "4"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr "5"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr "5.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr "6.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr "7.1"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Обмен местами каналов"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Ориентированный на наушники режим"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Объёмные голоса:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr "Отключены"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+msgid "VOCS^Taunts"
+msgstr "Насмешки"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr "Все"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Радиус насмешек:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+msgid "RNG^Very short"
+msgstr "Очень маленький"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+msgid "RNG^Short"
+msgstr "Маленький"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+msgid "RNG^Normal"
+msgstr "Обычный"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+msgid "RNG^Long"
+msgstr "Большой"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+msgid "RNG^Full"
+msgstr "Полный"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Автоматические насмешки"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Предупреждение о таймауте за:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr "Нет"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 минуту"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 минут"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "WRN^Both"
+msgstr "1 и 5 минут"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Оповещать о попадании"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Звуки меню"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr "Предустановки качества:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr "Ужасное"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr "Низкое"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr "Среднее"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+msgid "PRE^Normal"
+msgstr "Обычное"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr "Высокое"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr "Сверх"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr "Предельное"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr "Подробность геометрии:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr "Нижайшая"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr "Низкая"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+msgid "DET^Normal"
+msgstr "Обычная"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr "Хорошая"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr "Лучшая"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr "Высочайшая"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr "Сглаживание:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+msgid "AA^Disabled"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr "Разрешение текстур:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr "Ужасное"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr "Нижайшее"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr "Низкое"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+msgid "RES^Normal"
+msgstr "Обычное"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr "Хорошее"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr "Лучшее"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr "Избегать сжатия текстур с потерями"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr "Анизотропия:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+msgid "ANISO^Disabled"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr "8x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr "16x"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr "Качество частиц:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr "Дальность частиц:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr "Декали:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr "Дальность:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr "Время:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr "Использовать карты освещения"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr "Особое качество"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr "Блеск"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr "Офсетное текстурирование"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr "Рельефное текстурирование"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr "Отражения:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr "Размытые"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr "Хорошие"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr "Резкие"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Показывать поверхности"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr "Без динамического освещения"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr "Грубая имитация"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr "Дин. освещение в реальном времени"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr "Тени"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr "Дин. освещение мира в реальном времени"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr "Использовать карты нормалей"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr "Мягкие тени"
+
+# Перевод может быть неверным.
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr "Короны"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr "Использовать Occlusion Queries (Проверка видимости)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr "Свечение"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr "High Dynamic Range (HDR)"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr "Размытие от движения:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr "Размытие от урона:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr "Привязки клавиш:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr "Сменить кнопку..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr "Чувствительность:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr "Скорость мыши в UI:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr "Фильтр мыши"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr "Обратить мышь"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr "Использовать ввод с джойстика"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr "Отключить ускорение OS мыши"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr "\"открыть консоль\" также закрывает"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Определённая пользователем привязка клавиш"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Команда при нажатии:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Команда при отжатии:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Сохранение"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Отмена"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr "Оформления:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr "Показывать время"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr "Показывать дату"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr "Показывать кадры/с (FPS)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr "Спидометр"
+
+# "quake units per second"
+# you can also translate it as inch/second
+# as it is roughly the same
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr "qu/s (без назв.)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr "м/с"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr "км/ч"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr "м/ч"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr "узлы"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr "Показывать акселерометр"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr "Размер акселерометра:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr "Уменьшить задержку ввода"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Доп. настройки"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Фильтр Cvar:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Настройка:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Значение:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Описание:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Предсказание движения на стороне клиента"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Показывать netgraph"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Скорость соединения:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr "56k"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr "ISDN"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Медленный ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Быстрый ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Широкополосное"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Кол-во пакетов/с"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP загрузки:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Загрузки:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Скорость (кБ/с):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "UDP порт клиента:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr "Разрешение:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr "Размера шрифта/UI"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr "Нечитаемый"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr "Крошечный"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr "Маленький"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr "Небольшой"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr "Средний"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr "Большой"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr "Огромный"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr "Гигантский"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr "Колоссальный"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr "Глубина цвета:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr "На весь экран"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr "Вертикальная синхронизация"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Использовать шейдеры OpenGL 2.0 (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr "Использовать GLSL для управления цветом"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Использование Vertex Buffer Objects (VBOs)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr "Вершины, некоторые треугольники (совместимо)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr "Вершины"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr "Вершины и треугольники"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr "Сперва глубина:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr "Мир"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
+msgstr "Всё"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr "Отключить многопоточный OpenGL"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr "Ждать завершения каждого кадра GPU"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr "Яркость:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr "Контраст:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr "Гамма:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr "Усиление контраста:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr "Насыщенность:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+msgid "LIT^Ambient:"
+msgstr "Окружающее освещение:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr "Мощность:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "Одиночная игра"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr "Быстрая игра (случайная карта с ботами)"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr "Начать одиночную игру"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Победитель"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr "Выбор команды"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr "Выбрать 'лучшую' команду (автовыбор)"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr "красная"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr "синяя"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr "жёлтая"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr "розовая"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr "наблюдать"
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr "Не нажимайте снова эту кнопку!"
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+"Что? Не могу зайти (m = NULL). Перефильтрую, чтобы такого больше не "
+"случалось.\n"
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr "Сервер Xonotic от %s"
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+"Что? Не могу зайти (неверный вид игры). Перефильтрую, чтобы такого больше не "
+"случалось.\n"
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<модель игрока не найдена>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr "Убрать"
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr "В закладки"
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr "Пинг"
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr "Имя сервера"
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr "Карта"
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr "Вид"
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr "Игроки"
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr "<ЗАГОЛОВОК>"
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr "<АВТОР>"
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr "Максимум"
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr "%s дБ"
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr "%dx%d"
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Получены данные HTTP запроса для неверного id %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "ошибка при получении уведомления об обновлении: статус %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "ошибка: получение HTML вместо уведомления об обновлении\n"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr ""
+"ошибка: получены символы возврата строки от сервера уведомлений об "
+"обновлениях\n"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Обновление может быть загружено с:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Автоматическое создание mapinfo для новых карт..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr "Обновитесь до %s сейчас же!"
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"1^ОШИБКА: Сжатие текстур требуется, но не поддерживается.\n"
+"1^Ожидайте проблемы с отображением.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Assault"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Capture The Flag"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Clan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Domination"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Freeze Tag"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Keepaway"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Key Hunt"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Last Man Standing"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexball"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Onslaught"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Race"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr "Race CTS"
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr "Runematch"
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Team Deathmatch"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Швыряние Тубой"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Фон:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "По умолчанию"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Исп. настройки по умолчанию"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Цвет команды:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr "Включить панель"
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr "Crylink"
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr "Heavy Laser Assault Cannon"
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr "Grappling Hook"
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr "MinstaNex"
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr "Sniper Rifle"
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tuba"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+
+#~ msgid "Waypoint settings:"
+#~ msgstr "Настройки отметок:"
+
+#~ msgid "%d/%d"
+#~ msgstr "%d/%d"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-07 07:29+0100\n"
+"PO-Revision-Date: 2011-01-11 22:51+ZONE\n"
+"Last-Translator: marcus256 <marcus256@users.sourceforge.net>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: se\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
+msgstr "fel: status är %d\n"
+
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
+msgstr "Användning: menu_cmd kommando..., där möjliga kommandon är:\n"
+
+#: qcsrc/menu/gamecommand.qc:66
+msgid " sync - reloads all cvars on the current menu page\n"
+msgstr " sync - laddar om alla cvars på nuvarande menysida\n"
+
+#: qcsrc/menu/gamecommand.qc:67
+msgid " directmenu ITEM - select a menu item as main item\n"
+msgstr " directmenu ITEM - utse en menyrad som huvudrad\n"
+
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
+msgstr "fel vid skapande av curl handle\n"
+
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+msgstr ""
+"Ogiltigt kommando. För en lista över giltiga kommandon, prova menu_cmd "
+"help.\n"
+
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
+msgstr ""
+
+#: qcsrc/menu/item/label.c:63
+#, c-format
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+msgstr ""
+
+#: qcsrc/menu/item/listbox.c:300
+#, c-format
+msgid "Item %d"
+msgstr ""
+
+#: qcsrc/menu/item/slider.c:64
+#, c-format
+msgid "%d (%s)"
+msgstr ""
+
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
+msgstr ""
+
+#: qcsrc/menu/menu.qc:29
+#, c-format
+msgid "^4MQC Build information: %s\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/campaign.c:284
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+msgid "???"
+msgstr ""
+
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+msgid "OK"
+msgstr "OK"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+#, fuzzy
+msgid "Text language:"
+msgstr "Avstånd för pikar:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+msgid "Name:"
+msgstr "Namn:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+#, fuzzy
+msgid "Save settings"
+msgstr "Inställningar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
+msgstr "Tidtagningspanel för Lopp"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
+msgid "Radar Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
+msgid "Panel enabled in teamgames"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
+msgid "Radar:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Alpha:"
+msgstr "Alfa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
+msgid "Rotation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
+msgid "Forward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
+msgid "West"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
+msgid "South"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
+msgid "East"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
+msgid "North"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+msgid "Scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
+msgid "Zoom mode:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
+msgid "Zoomed in"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
+msgid "Zoomed out"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
+msgid "Always zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
+msgid "Never zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
+msgstr "Poängpanel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
+msgstr "Vapenpanel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
+msgstr "Tona ut efter:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
+msgstr "Aldrig"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
+msgstr "%ds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
+msgstr "Uttoningseffekt:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+msgid "EF^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "Slide"
+msgstr "Ingen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
+msgstr "Alfa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+msgid "Weapon icons:"
+msgstr "Vapenikoner:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+msgid "Show weapon ID as:"
+msgstr "Visa vapen-ID som:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+msgid "SHOWAS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Number"
+msgstr "Nummer"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "Bind"
+msgstr "Koppla"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+msgid "Show Accuracy"
+msgstr "Visa Noggrannhet"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+msgid "Show Ammo"
+msgstr "Visa Ammunition"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+msgid "Ammo bar color:"
+msgstr "Färg på ammoraden:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+msgid "Ammo bar alpha:"
+msgstr "Alfa på ammoraden:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+msgid "Disable"
+msgstr "Inaktivera"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+msgid "Color:"
+msgstr "Färg:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+msgid "Border size:"
+msgstr "Ramstorlek:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+msgid "Test team color in configure mode"
+msgstr "Testa lagfärg i konfigureringsläge"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+msgid "Padding:"
+msgstr "Utfyllnad:"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+#, fuzzy
+msgid "DOCK^Disabled"
+msgstr "Inaktivera"
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
+msgid "X:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
+msgid "Y:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
+msgid "Exit setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
+msgstr "Flera Spelare"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
+msgstr "Servrar"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+msgid "Create"
+msgstr "Skapa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
+msgstr "Demos"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
+msgid "Player Setup"
+msgstr "Spelarinställning"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+msgid "Game type:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+msgid "Match settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+msgid "Time limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+msgid "Use map specified default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Point limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+msgid "Player slots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+msgid "Number of bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+msgid "Bot skill:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Botlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "Beginner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You will win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You can win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "You might win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Advanced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Expert"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Pro"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Assassin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Unhuman"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+msgid "Godlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+msgid "Mutators..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "Advanced settings..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+msgid "Map list:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+msgid "Select all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+msgid "Select none"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+msgid "Start Multiplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+msgid "Capture limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Lives:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Laps:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+msgid "Goals:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+msgid "Frag limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
+msgstr "Kartinformation"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
+msgstr "Fullständing sakplacering"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
+msgstr "Endast MinstaGib"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
+msgstr "Titel:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
+msgstr "Upphovsman:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
+msgstr "Egenskaper."
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
+msgstr "Speltyper:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+msgid "Close"
+msgstr "Stäng"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "Play"
+msgstr "Spela"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+msgid "Clear"
+msgstr "Rensa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+#, fuzzy
+msgid "SRVS^Full"
+msgstr "Fullt"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:65
+msgid "Info..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+msgid "Join!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr "Typ:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+msgid "Model:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
+msgid "Field of view:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
+msgid "View bobbing:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
+msgid "Zoom factor:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
+msgid "Zoom speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
+msgid "Weapon settings..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
+msgid "Crosshair:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+msgid "Per weapon"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+msgid "Crosshair size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+msgid "Crosshair alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+msgid "Crosshair color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:145
+msgid "Enable center dot"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
+msgid "Size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:155
+msgid "Hit test:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:156
+msgid "HTST^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:157
+msgid "TrueAim"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
+msgid "Enemies"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
+msgid "Waypoints setup..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:167
+msgid "Enter HUD editor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
+msgid "Force models:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+msgid "MDL^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
+msgid "MDL^Custom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
+#, fuzzy
+msgid "MDL^All"
+msgstr "Alla"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:179
+msgid "Disable gore effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:181
+msgid "Gibs:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:183
+msgid "GIBS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+msgid "GIBS^Few"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+msgid "GIBS^Many"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+msgid "GIBS^Lots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:190
+msgid "Damage splash:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Apply immediately"
+msgstr "Tillämpa nu"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+msgid "Flip view horizontally"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
+msgstr "Inställningar"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
+msgstr "Inmatning"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
+msgstr "Video"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
+msgstr "Effekter"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
+msgstr "Ljud"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
+msgstr "Nätverk"
+
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
+msgstr "Blandat"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
+msgid "Master:"
+msgstr "Master:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+msgid "Music:"
+msgstr "Musik:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#, fuzzy
+msgid "VOL^Ambient:"
+msgstr "Bakgrund"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+msgid "Info:"
+msgstr "Info:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+msgid "Items:"
+msgstr "Saker:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+msgid "Pain:"
+msgstr "Smärta:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+msgid "Player:"
+msgstr "Spelare:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+msgid "Shots:"
+msgstr "Skott:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+msgid "Voice:"
+msgstr "Röst:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+msgid "Weapons:"
+msgstr "Vapen:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+msgid "Frequency:"
+msgstr "Frekvens:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+msgid "8 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+msgid "11.025 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+msgid "16 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+msgid "22.05 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+msgid "24 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+msgid "32 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+msgid "44.1 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+msgid "48 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+msgid "Channels:"
+msgstr "Kanaler."
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "Mono"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+msgid "Stereo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "2.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+msgid "4"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+msgid "5"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+msgid "5.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+msgid "6.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+msgid "7.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+msgid "Swap Stereo"
+msgstr "Växla Stereo"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+msgid "Headphone friendly mode"
+msgstr "Hörlursvänligt läge"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+msgid "Spatial voices:"
+msgstr "Spatiala kanaler:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+msgid "VOCS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#, fuzzy
+msgid "VOCS^Taunts"
+msgstr "Pikar"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+msgid "VOCS^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+msgid "Taunt range:"
+msgstr "Avstånd för pikar:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#, fuzzy
+msgid "RNG^Very short"
+msgstr "Väldigt kort"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#, fuzzy
+msgid "RNG^Short"
+msgstr "Kort"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#, fuzzy
+msgid "RNG^Normal"
+msgstr "Normalt"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#, fuzzy
+msgid "RNG^Long"
+msgstr "Långt"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#, fuzzy
+msgid "RNG^Full"
+msgstr "Fullt"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+msgid "Automatic taunts"
+msgstr "Automatiska pikar"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+msgid "Time warning:"
+msgstr "Tidsvarning:"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+msgid "WRN^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+msgid "1 minute"
+msgstr "1 minut"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+msgid "5 minutes"
+msgstr "5 minuter"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#, fuzzy
+msgid "WRN^Both"
+msgstr "Både och"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Hit indicator"
+msgstr "Skadoindikator"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+msgid "Menu sounds"
+msgstr "Menyljud"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
+msgid "Quality preset:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
+msgid "PRE^OMG!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
+msgid "PRE^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
+msgid "PRE^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
+#, fuzzy
+msgid "PRE^Normal"
+msgstr "Normalt"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
+msgid "PRE^High"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
+msgid "PRE^Ultra"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
+msgid "PRE^Ultimate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
+msgid "Geometry detail:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
+msgid "DET^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
+msgid "DET^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
+#, fuzzy
+msgid "DET^Normal"
+msgstr "Normalt"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
+msgid "DET^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
+msgid "DET^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
+msgid "DET^Insane"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
+msgid "Antialiasing:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
+#, fuzzy
+msgid "AA^Disabled"
+msgstr "Inaktivera"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "2x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
+msgid "4x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
+msgid "Texture resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
+msgid "RES^Leet"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+msgid "RES^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+msgid "RES^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#, fuzzy
+msgid "RES^Normal"
+msgstr "Normalt"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+msgid "RES^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+msgid "RES^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Avoid lossy texture compression"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Anisotropy:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
+#, fuzzy
+msgid "ANISO^Disabled"
+msgstr "Inaktivera"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
+msgid "8x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
+msgid "16x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "Particle quality:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
+msgid "Particle distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+msgid "Decals"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+msgid "Distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+msgid "Time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use lightmaps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+msgid "Deluxe mapping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+msgid "Gloss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+msgid "Offset mapping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+msgid "Relief mapping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+msgid "Reflections:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+msgid "Blurred"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+msgid "REFL^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+msgid "Sharp"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "No dynamic lighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Flash blend approximation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "Realtime dynamic lighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+msgid "Realtime world lighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "Use normal maps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+msgid "Soft shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+msgid "Coronas"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+msgid "Use Occlusion Queries"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+msgid "Bloom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+msgid "High Dynamic Range (HDR)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+msgid "Motion blur:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+msgid "Damage blur:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+msgid "UI mouse speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+msgid "Mouse filter"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+msgid "Invert mouse"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+msgid "Use joystick input"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Turn off OS mouse acceleration"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+msgid "\"enter console\" also closes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
+msgstr "Användardefinierad tangentkoppling"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr "Kommando när nedtryckt:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
+msgstr "Kommando när uppsläppt:"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
+msgstr "Spara"
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Speedometer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
+msgid "qu/s (hidden)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
+msgid "Show accelerometer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
+msgid "Accelerometer scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
+msgid "Minimize input latency"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Avancerade inställningar"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
+msgstr "Cvar-filter:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
+msgstr "Inställning:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
+msgstr "Värde:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
+msgstr "Beskrivning:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
+msgstr "Rörelseprediktering i klienten"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
+msgstr "Visa nätgraf"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
+msgstr "Nätverkshastighet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
+msgstr "Långsam ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
+msgstr "Snabb ADSL"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
+msgstr "Bredband"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
+msgstr "Inputpaket/s"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
+msgstr "HTTP-nedladdningar:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
+msgstr "Nedladdningar:"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
+msgstr "Hastighet (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
+msgstr "Klientens UDB-port:"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#, fuzzy
+msgid "DF^Disabled"
+msgstr "Inaktivera"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#, fuzzy
+msgid "DF^All"
+msgstr "Alla"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+msgid "Contrast boost:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+msgid "Saturation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#, fuzzy
+msgid "LIT^Ambient:"
+msgstr "Bakgrund"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+msgid "Intensity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
+msgstr "En Spelare"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
+msgstr "Vinnare"
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
+msgstr ""
+
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
+msgstr "<ingen modell funnen>"
+
+#: qcsrc/menu/xonotic/serverlist.c:360
+msgid "Remove"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:362
+msgid "Bookmark"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:518
+msgid "Ping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:519
+msgid "Host name"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:520
+msgid "Map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:521
+msgid "Type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.c:522
+msgid "Players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
+msgstr "Mottog HTTP-förfrågan för en ogiltig ID %d.\n"
+
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
+msgstr "fel vid mottagande av uppdateringsnotifiering: status 'r %d\n"
+
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
+msgstr "fel: mottog HTML istället för en uppdateringsnotifiering"
+
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
+msgstr "fel: mottog radslut från uppdateringsnotifieringsservern"
+
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
+msgstr ""
+"Uppdatering kan laddas ner från:\n"
+"%s\n"
+
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr "Automatgenererar kartinfo för nyligen tillagda kartor..."
+
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:509
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
+msgstr ""
+"^1FEL: Texturkompression krävs men stöds ej.\n"
+"^1Räkna med visuella problem.\n"
+
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Arena"
+msgstr "Arena"
+
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Assault"
+msgstr "Anfall"
+
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Capture The Flag"
+msgstr "Erövra Flaggan"
+
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Clan Arena"
+msgstr "Klan Arena"
+
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Deathmatch"
+msgstr "Dödsmatch"
+
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Domination"
+msgstr "Dominering"
+
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Freeze Tag"
+msgstr "Frys-Kull"
+
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Keepaway"
+msgstr "Håll Dig Undan"
+
+#: qcsrc/menu/xonotic/util.qc:539
+msgid "Key Hunt"
+msgstr "Nyckeljakt"
+
+#: qcsrc/menu/xonotic/util.qc:540
+msgid "Last Man Standing"
+msgstr "Herre På Täppan"
+
+#: qcsrc/menu/xonotic/util.qc:541
+msgid "Nexball"
+msgstr "Nexboll"
+
+#: qcsrc/menu/xonotic/util.qc:542
+msgid "Onslaught"
+msgstr "Stormning"
+
+#: qcsrc/menu/xonotic/util.qc:543
+msgid "Race"
+msgstr "Lopp"
+
+#: qcsrc/menu/xonotic/util.qc:544
+msgid "Race CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:545
+msgid "Runematch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:546
+msgid "Team Deathmatch"
+msgstr "Dödsmatch i Lag"
+
+#: qcsrc/menu/xonotic/util.qc:565
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#%'n Tubakastning"
+
+#: qcsrc/menu/xonotic/util.qc:583
+msgid "Background:"
+msgstr "Bakgrund:"
+
+#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
+#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
+#: qcsrc/menu/xonotic/util.qc:630
+msgid "Default"
+msgstr "Standard"
+
+#: qcsrc/menu/xonotic/util.qc:596
+msgid "Use default"
+msgstr "Använd standard"
+
+#: qcsrc/menu/xonotic/util.qc:616
+msgid "Team Color:"
+msgstr "Lagfärg:"
+
+#: qcsrc/menu/xonotic/util.qh:49
+msgid "Enable panel"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:645
+#, c-format
+msgid "%s succeeded at self-destructing themself with the Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:650
+#, c-format
+msgid "%s could not hide from %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:652
+#, c-format
+msgid "%s was too close to %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_crylink.qc:654
+#, c-format
+msgid "%s took a close look at %s's Crylink"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:503
+#, c-format
+msgid "%s could not remember where they put plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:505
+#, c-format
+msgid "%s played with plasma"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:512
+#, c-format
+msgid "%s just noticed %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:514
+#, c-format
+msgid "%s got in touch with %s's blue ball"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:519
+#, c-format
+msgid "%s felt the electrifying air of %s's combo"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:521
+#, c-format
+msgid "%s got too close to %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_electro.qc:523
+#, c-format
+msgid "%s was blasted by %s's blue beam"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:2
+#, fuzzy
+msgid "Fireball"
+msgstr "Nexboll"
+
+#: qcsrc/server/w_fireball.qc:392
+#, c-format
+msgid "%s forgot about some firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:394 qcsrc/server/w_hlac.qc:223
+#, c-format
+msgid "%s should have used a smaller gun"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:401
+#, c-format
+msgid "%s tried to catch %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:403
+#, c-format
+msgid "%s fatefully ignored %s's firemine"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:410
+#, c-format
+msgid "%s could not hide from %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:412
+#, c-format
+msgid "%s saw the pretty lights of %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:415
+#, c-format
+msgid "%s got too close to %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:357
+#, c-format
+msgid "%s tried out his own grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:359
+#, c-format
+msgid "%s detonated"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:365
+#, c-format
+msgid "%s didn't see %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:367
+#, c-format
+msgid "%s almost dodged %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:369
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:185 qcsrc/server/w_seeker.qc:523
+#, c-format
+msgid "%s played with tiny rockets"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:189
+#, c-format
+msgid "%s hoped %s's missiles wouldn't bounce"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:191
+#, c-format
+msgid "%s was pummeled by %s"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
+msgstr ""
+
+#: qcsrc/server/w_hlac.qc:225
+#, c-format
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:267 qcsrc/server/w_minstanex.qc:257
+#: qcsrc/server/w_nex.qc:224 qcsrc/server/w_porto.qc:293
+#: qcsrc/server/w_shotgun.qc:179 qcsrc/server/w_uzi.qc:287
+#, c-format
+msgid "%s did the impossible"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:269
+#, c-format
+msgid "%s has run into %s's gravity bomb"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:2
+#, fuzzy
+msgid "Laser"
+msgstr "Master:"
+
+#: qcsrc/server/w_laser.qc:285
+#, c-format
+msgid "%s lasered themself to hell"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:289
+#, c-format
+msgid "%s was cut in half by %s's gauntlet"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:291
+#, c-format
+msgid "%s was lasered to death by %s"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+#, fuzzy
+msgid "Mine Layer"
+msgstr "En Spelare"
+
+#: qcsrc/server/w_minelayer.qc:438 qcsrc/server/w_rocketlauncher.qc:480
+#, c-format
+msgid "%s exploded"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:442
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:444
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:446
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:259 qcsrc/server/w_nex.qc:226
+#, c-format
+msgid "%s has been vaporized by %s"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+#, fuzzy
+msgid "Nex"
+msgstr "Nexboll"
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/server/w_porto.qc:295
+#, c-format
+msgid "%s felt %s doing the impossible to him"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:484
+#, c-format
+msgid "%s got too close to %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:486
+#, c-format
+msgid "%s almost dodged %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_rocketlauncher.qc:488
+#, c-format
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:527
+#, c-format
+msgid "%s ran into %s's flac"
+msgstr ""
+
+#: qcsrc/server/w_seeker.qc:529
+#, c-format
+msgid "%s was tagged by %s"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Kort"
+
+#: qcsrc/server/w_shotgun.qc:183
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgstr ""
+
+#: qcsrc/server/w_shotgun.qc:185
+#, c-format
+msgid "%s was gunned by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:2
+msgid "Sniper Rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:321
+#, c-format
+msgid "%s shot themself automatically"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:323
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:330
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:332
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:339
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:344
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr ""
+
+#: qcsrc/server/w_sniperrifle.qc:346 qcsrc/server/w_uzi.qc:291
+#, c-format
+msgid "%s was sniped by %s"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:2
+#, fuzzy, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#%'n Tubakastning"
+
+#: qcsrc/server/w_tuba.qc:260
+#, c-format
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_tuba.qc:264
+#, c-format
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr ""
+
+#: qcsrc/server/w_uzi.qc:293
+#, c-format
+msgid "%s was riddled full of holes by %s"
+msgstr ""
+++ /dev/null
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my ($in, $out) = @ARGV;
-
-my %changes = ();
-while(<STDIN>)
-{
- chomp;
- /^(?:seta?\s)?\s*(\S+)\s+(.*)/
- or next;
- $changes{$1} = $2;
-}
-
-my %changes_unapplied = %changes;
-my $result = "";
-open my $fh, "<", $in
- or die "<$in: $!";
-while(<$fh>)
-{
- chomp;
- /^(seta?\s?\s*)(\S+)(\s+)(.*)/
- or do { $result .= "$_\n"; next; };
- my $v = exists($changes{$2}) ? $changes{$2} : $4;
- $result .= "$1$2$3$v\n";
- delete $changes_unapplied{$2};
-}
-close $fh;
-open $fh, ">", $out
- or die ">$out: $!";
-print $fh $result;
-print $fh "set $_ $changes_unapplied{$_}\n" for keys %changes_unapplied;
-close $fh;
--- /dev/null
+0 50 5 1
\ No newline at end of file
-flag,flags/flag_red
-flag_cloth,flags/flag_red_cloth
-flag_laser,flags/flag_red_laser
+mesh,models/ctf/flag_red.tga
+mesh2,models/ctf/banner_red.tga
+mesh3,models/ctf/glow_red.tga
\ No newline at end of file
-flag,flags/flag_blue
-flag_cloth,flags/flag_blue_cloth
-flag_laser,flags/flag_blue_laser
+mesh,models/ctf/flag_blue.tga
+mesh2,models/ctf/banner_blue.tga
+mesh3,models/ctf/glow_blue.tga
\ No newline at end of file
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
--- /dev/null
+erebus,erebus
+erebus.001,shadowhead
--- /dev/null
+erebus,erebusfullbright
+erebus.001,shadowhead
--- /dev/null
+//TAG: soldier
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/soldier/coms/attack 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/soldier/coms/attackinfive 0
+coverme sound/player/soldier/coms/coverme 0
+defend sound/player/soldier/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+flagcarriertakingdamage sound/player/soldier/coms/flagcarriertakingdamage 0
+freelance sound/player/soldier/coms/freelance 2
+getflag sound/player/soldier/coms/getflag 0
+incoming sound/player/soldier/coms/incoming 0
+meet sound/player/soldier/coms/meet 0
+needhelp sound/player/soldier/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/soldier/coms/seenflag 0
+taunt sound/player/soldier/coms/taunt 3
+teamshoot sound/player/soldier/coms/teamshoot 3
+death sound/player/soldier/player/death 3
+drown sound/player/soldier/player/drown 0
+fall sound/player/soldier/player/fall 0
+falling sound/player/soldier/player/falling 0
+gasp sound/player/soldier/player/gasp 0
+jump sound/player/soldier/player/jump 0
+pain25 sound/player/soldier/player/pain25 0
+pain50 sound/player/soldier/player/pain50 0
+pain75 sound/player/soldier/player/pain75 0
+pain100 sound/player/soldier/player/pain100 0
--- /dev/null
+name Glowing Erebus
+species human
+sex Male
+weight 106
+age 26
+
+Heavyweight Xonotic Solider with LEDs
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
--- /dev/null
+erebus,erebus
+erebus.001,shadowhead
--- /dev/null
+erebus,erebusfullbright
+erebus.001,shadowhead
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
--- /dev/null
+erebus,erebus
+erebus.001,shadowhead
--- /dev/null
+erebus,erebusfullbright
+erebus.001,shadowhead
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
156 16 15.000000 0 // jump
172 15 15.000000 0 // painone
187 17 15.000000 0 // paintwo
-204 5 15.000000 1 // shoot
+204 5 15.000000 0 // shoot
209 21 15.000000 1 // taunt
230 21 40.000000 1 // run
251 21 40.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
184 21 25.000000 0 // jump
205 15 15.000000 0 // painone
220 17 15.000000 0 // paintwo
-237 3 15.000000 1 // shoot
+237 3 15.000000 0 // shoot
240 21 15.000000 1 // taunt
261 21 35.000000 1 // run
282 21 35.000000 1 // runbackwards
156 16 15.000000 0 // jump
172 15 15.000000 0 // painone
187 17 15.000000 0 // paintwo
-204 5 15.000000 1 // shoot
+204 5 15.000000 0 // shoot
209 21 15.000000 1 // taunt
230 21 40.000000 1 // run
251 21 40.000000 1 // runbackwards
sprite race-finish "Finish" ff8000 000000 0.0
sprite race-start "Start" ff8000 000000 0.0
sprite nb-ball "Ball" e8d8a0 000000 0.0
+sprite ka-ball "Ball" 00ffff 000000 0.0
+sprite ka-ballcarrier "Ball carrier" ff0000 000000 0.0
sprite wpn-laser "Laser" ff8080 000000 0.0 # bright red
sprite wpn-shotgun "Shotgun" 804000 000000 0.0 # brown
sprite wpn-fireball "Fireball" ff8000 000000 0.0 # orange
sprite wpn-hlac "HLAC" 00ff00 000000 0.0 # green
sprite wpn-campingrifle "Rifle" 80ff00 000000 0.0 # orange
+sprite wpn-minelayer "Mine Layer" ccff00 000000 0.0 # yellowish orange
sprite dom-neut "Control point" 00ffff 000000 0.0
sprite dom-red "Control point" ff0000 000000 0.0
sprite item-shield "Shield" ff00ff 000000 0.5 ff00ff ffff00 0.5
sprite item-fuelregen "Fuel regen" ff8000 000000 0.5 ff8000 ffff00 0.5
sprite item-jetpack "Jet Pack" 808080 000000 0.5 808080 ffff00 0.5
+
+sprite freezetag_frozen "Frozen!" 40e6ff 000000 0.0 # bright cyan
+++ /dev/null
-// Xonotic 1.0 physics
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 100
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0.5
-sv_doublejump 0
-// 1.0 did not allow re-jumping due to a bug, this is quite close to it
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// Xonotic 1.5 physics
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 50
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0.25
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// experimental post-Xonotic 1.5 physics (never released)
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 50
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// experimental post-Xonotic 1.5 physics (never released)
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 25
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// experimental post-Xonotic 1.5 physics (never released)
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 50
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0.2
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// Quake, Bunny Reintroduced (Xonotic 2.0 to 2.4.2 physics)
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 220
-sv_stopspeed 100
-sv_accelerate 5.5
-sv_airaccelerate 5.5
-sv_friction 5
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0.3
-sv_airaccel_qw 0.93
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// Xonotic 2.5 physics
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 220
-sv_stopspeed 100
-sv_accelerate 8
-sv_airaccelerate 5.5
-sv_friction 7
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0.35
-sv_airaccel_qw 0.95
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+++ /dev/null
-// Xonotic 2.6 physics
-sv_gravity 800
-sv_maxspeed 400
-sv_maxairspeed 220
-sv_stopspeed 100
-sv_accelerate 8
-sv_airaccelerate 5.5
-sv_friction 7
-edgefriction 1
-sv_stepheight 34
-sv_jumpvelocity 300
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0.35
-sv_airaccel_qw 0.95
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_airstrafeaccel_qw 0
-sv_aircontrol 0
-sv_aircontrol_penalty 0
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 0
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 400
sv_jumpspeedcap_min 0 // need predicting? (it should already be in CSQC prediction code)
sv_jumpspeedcap_max 0.35
sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// "NoQWBunny" physics based on XPM
+sv_gravity 800
+sv_maxspeed 424
+sv_maxairspeed 400
+
+sv_stopspeed 100
+sv_accelerate 13
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 26
+// Q1: 16+2
+// Nex: 32+2
+// we try: 24+2
+
+// actually, what we want is 266.6666 for 180bpm
+// but 260 takes same amount of frames and is nicer to mappers
+sv_jumpvelocity 260
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0 // breaks strafing?
+sv_airaccel_qw -0.8
+
+sv_airstopaccelerate -0.95
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.97
+sv_aircontrol 125
+sv_aircontrol_penalty 150
+sv_aircontrol_power 2.5
+sv_airspeedlimit_nonqw 800
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0 // TINY (1.35x normal) doublejumps only, can be disabled if wanted...
+sv_jumpspeedcap_min 0 // need predicting? (it should already be in CSQC prediction code)
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max 0.38
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// Xonotic 1.0 physics
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 100
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0.5
+sv_doublejump 0
+// 1.0 did not allow re-jumping due to a bug, this is quite close to it
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// Xonotic 1.5 physics
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 50
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0.25
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// experimental post-Xonotic 1.5 physics (never released)
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 50
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// experimental post-Xonotic 1.5 physics (never released)
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 25
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// experimental post-Xonotic 1.5 physics (never released)
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 50
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0.2
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// Quake, Bunny Reintroduced (Xonotic 2.0 to 2.4.2 physics)
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 220
+sv_stopspeed 100
+sv_accelerate 5.5
+sv_airaccelerate 5.5
+sv_friction 5
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.3
+sv_airaccel_qw 0.93
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// Xonotic 2.5 physics
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 220
+sv_stopspeed 100
+sv_accelerate 8
+sv_airaccelerate 5.5
+sv_friction 7
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.35
+sv_airaccel_qw 0.95
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// Xonotic 2.6 physics
+sv_gravity 800
+sv_maxspeed 400
+sv_maxairspeed 220
+sv_stopspeed 100
+sv_accelerate 8
+sv_airaccelerate 5.5
+sv_friction 7
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.35
+sv_airaccel_qw 0.95
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_penalty 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
+++ /dev/null
-// "NoQWBunny" physics based on XPM
-sv_gravity 800
-sv_maxspeed 320
-sv_maxairspeed 400
-
-sv_stopspeed 100
-sv_accelerate 15
-sv_airaccelerate 2
-sv_friction 8
-edgefriction 1
-sv_stepheight 26
-// Q1: 16+2
-// Nex: 32+2
-// we try: 24+2
-
-// actually, what we want is 266.6666 for 180bpm
-// but 260 takes same amount of frames and is nicer to mappers
-sv_jumpvelocity 260
-sv_wateraccelerate -1
-sv_waterfriction -1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw -0.8
-
-sv_airstopaccelerate 3
-sv_airstrafeaccelerate 24
-sv_maxairstrafespeed 100
-sv_airstrafeaccel_qw -0.95
-sv_aircontrol 125
-sv_aircontrol_penalty 150
-sv_aircontrol_power 2
-sv_airspeedlimit_nonqw 800
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 0
-sv_jumpspeedcap_min ""
-sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 1
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 320
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
--- /dev/null
+// "NoQWBunny" physics based on XPM
+sv_gravity 800
+sv_maxspeed 360
+sv_maxairspeed 400
+
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 2
+sv_friction 8
+edgefriction 1
+sv_stepheight 26
+// Q1: 16+2
+// Nex: 32+2
+// we try: 24+2
+
+// actually, what we want is 266.6666 for 180bpm
+// but 260 takes same amount of frames and is nicer to mappers
+sv_jumpvelocity 260
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw -0.8
+
+sv_airstopaccelerate 3
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.95
+sv_aircontrol 125
+sv_aircontrol_penalty 150
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 800
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
sv_airaccelerate 1
sv_friction 8
edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
// CPMA: 18
sv_jumpvelocity 270
sv_wateraccelerate 4
sv_jumpspeedcap_min 0
sv_jumpspeedcap_max 0.5
sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 400
sv_airaccelerate 1
sv_friction 8
edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
// CPMA: 18
sv_jumpvelocity 270
sv_wateraccelerate 4
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
--- /dev/null
+#!/bin/sh
+set -ex
+git checkout divVerent/autocvarizer_test
+trap 'git reset --hard; git checkout divVerent/autocvarizer' EXIT
+trap 'exit 1' INT
+git merge --no-commit -s ours divVerent/autocvarizer
+git read-tree -m -u divVerent/autocvarizer # "theirs"
+find server \( -type f -a \( -name \*.c -o -name \*.qc -o -name \*.h -o -name \*.qh \) \) -print0 | AUTOCVARING_SVQC=1 xargs -0 perl autocvarize.pl > server/autocvars.qh.new
+diff -Nu server/autocvars.qh server/autocvars.qh.new || true
+mv server/autocvars.qh.new server/autocvars.qh
+find client \( -type f -a \( -name \*.c -o -name \*.qc -o -name \*.h -o -name \*.qh \) \) -print0 | xargs -0 perl autocvarize.pl > client/autocvars.qh.new
+diff -Nu client/autocvars.qh client/autocvars.qh.new || true
+mv client/autocvars.qh.new client/autocvars.qh
+if make -C .. FTEQCC=../../../../fteqcc/fteqcc.bin FTEQCCFLAGS=; then
+ echo "Commit? ^C to not"
+ read -r L
+ git add server/autocvars.qh
+ git add client/autocvars.qh
+ git commit -a
+else
+ echo "FAILED. Exit this shell when done examining."
+ sh -i
+fi
--- /dev/null
+#!/usr/bin/perl
+# this tool generates JUST the autocvar declarations for cvars
+use strict;
+use warnings;
+
+my @files = @ARGV;
+
+my %cvars = ();
+my %old = ();
+my %menu = ();
+my %defaults = ();
+
+sub found($$$$)
+{
+ my ($name, $type, $default, $force) = @_;
+ if(length $name >= 55)
+ {
+ warn "cvar $name is a Dr. honorificabilitudinitatibis causa BRLOGENSHFEGLE";
+ $type = 'cvar_toolong';
+ return;
+ }
+# $old{$name} = 1
+# if $force;
+# $menu{$name} = 1
+# if $force > 1;
+ if(exists $cvars{$name} and not defined $cvars{name})
+ {
+ # have already warned
+ }
+ elsif(exists $cvars{$name} and $type ne $cvars{$name})
+ {
+ warn "cvar $name used with different types";
+ if($force)
+ {
+ $defaults{$name} = $default;
+ $cvars{$name} = $type;
+ }
+ else
+ {
+ undef $cvars{$name}
+ unless $old{$name};
+ }
+ return;
+ }
+ elsif(exists $cvars{$name} and exists $defaults{$name} and $default ne $defaults{$name})
+ {
+ warn "cvar $name used with different defaults";
+ if($force)
+ {
+ $defaults{$name} = $default;
+ $cvars{$name} = $type;
+ }
+ else
+ {
+ undef $cvars{$name}
+ unless $old{$name};
+ }
+ }
+ else
+ {
+ $defaults{$name} = $default;
+ $cvars{$name} = $type;
+ }
+}
+
+for my $f(@files)
+{
+ print STDERR "In file $f\n";
+ open my $fh, "<", $f;
+ while(<$fh>)
+ {
+ chomp;
+ if(/^\/\/#NO AUTOCVARS START/ .. /^\/\/#NO AUTOCVARS END/)
+ {
+ next;
+ }
+ s/\/\/.*//;
+ if(/^(?:var )?float autocvar_(\w+);$/)
+ {
+ found $1, 'cvar', 0, 1;
+ next;
+ }
+ if(/^var float autocvar_(\w+) = (.*);$/)
+ {
+ found $1, 'cvar', $2, 1;
+ next;
+ }
+ if(/^(?:var )?vector autocvar_(\w+);$/)
+ {
+ found $1, 'cvar_vector', "0 0 0", 1;
+ next;
+ }
+ if(/^var vector autocvar_(\w+) = '(.*)';$/)
+ {
+ found $1, 'cvar_vector', $2, 1;
+ next;
+ }
+ if(/^(?:var )?string autocvar_(\w+);$/)
+ {
+ found $1, 'cvar_string', "", 1;
+ next;
+ }
+ if(/^var string autocvar_(\w+) = "(.*)";$/)
+ {
+ found $1, 'cvar_string', $2, 1;
+ next;
+ }
+ if(/^#define autocvar_(\w+) cvar("\1")$/)
+ {
+ found $1, 'cvar', 0, 2;
+ next;
+ }
+ if(/^#define autocvar_(\w+) cvar_or("\1", (.*))$/)
+ {
+ found $1, 'cvar', $1, 2;
+ next;
+ }
+ if(/^#define autocvar_(\w+) cvar_string("\1")$/)
+ {
+ found $1, 'cvar_string', "", 2;
+ next;
+ }
+ while(/\bcvar\s*\(\s*"(\w+)"\s*\)/g)
+ {
+ found $1, 'cvar', 0, 0;
+ }
+ while(/\bcvar_string\s*\(\s*"(\w+)"\s*\)/g)
+ {
+ found $1, 'cvar_string', "", 0;
+ }
+ while(/\bcvar_vector\s*\(\s*"(\w+)"\s*\)/g)
+ {
+ found $1, 'cvar_vector', "0 0 0", 0;
+ }
+ while(/\bcvar_or\s*\(\s*"(\w+)"\s*,\s*([^\s)]+)\s*\)/g)
+ {
+ found $1, 'cvar', $2, 0;
+ }
+ }
+}
+
+if($ENV{AUTOCVARING_SVQC})
+{
+ for my $f(<menu/xonotic/*.c>)
+ {
+ print STDERR "In file $f\n";
+ open my $fh, "<", $f;
+ while(<$fh>)
+ {
+ for(/"([^"]*)"/g)
+ {
+ $menu{$1} = 1;
+ }
+ }
+ }
+
+ for my $f(<../maps/campaign*.txt>)
+ {
+ print STDERR "In file $f\n";
+ open my $fh, "<", $f;
+ while(<$fh>)
+ {
+ for(/\b(.+?)\b/g)
+ {
+ $menu{$1} = 1;
+ }
+ }
+ }
+}
+
+for my $name(sort keys %cvars)
+{
+ my $type = $cvars{$name};
+ my $menu = $menu{$name};
+ my $default = $defaults{$name};
+ die "wtf" if $name =~ /\0/;
+ if(not defined $type)
+ {
+ print "// cannot declare $name, it is used with different types\n";
+ }
+ elsif($type eq 'cvar_toolong')
+ {
+ print "// cannot declare $name, name is too long\n";
+ }
+ elsif($type eq 'cvar' and not $menu and $default eq "0")
+ {
+ print "float autocvar_$name;\n";
+ }
+ elsif($type eq 'cvar' and not $menu and $default ne "0")
+ {
+ print "var float autocvar_$name = $default;\n";
+ }
+ elsif($type eq 'cvar_vector' and not $menu and $default eq "0 0 0")
+ {
+ print "vector autocvar_$name;\n";
+ }
+ elsif($type eq 'cvar_vector' and not $menu and $default ne "0 0 0")
+ {
+ print "var vector autocvar_$name = '$default';\n";
+ }
+ elsif($type eq 'cvar_string' and not $menu and $default eq "")
+ {
+ print "string autocvar_$name;\n";
+ }
+ elsif($type eq 'cvar_string' and not $menu and $default ne "")
+ {
+ print "var string autocvar_$name = \"$default\";\n";
+ }
+ elsif($type eq 'cvar' and $menu and $default eq "0")
+ {
+ print "#define autocvar_$name cvar(\"$name\")\n";
+ }
+ elsif($type eq 'cvar' and $menu and $default ne "0")
+ {
+ print "#define autocvar_$name cvar_or(\"$name\", \"$default\")\n";
+ }
+ elsif($type eq 'cvar_string' and $menu) # sorry, no cvar_or for these
+ {
+ print "#define autocvar_$name cvar_string(\"$name\")\n";
+ }
+ elsif($type eq 'cvar_vector' and $menu) # sorry, no cvar_or for these
+ {
+ print "#define autocvar_$name cvar_vector(\"$name\")\n";
+ }
+}
+
+for my $f(@files)
+{
+ print STDERR "In file $f\n";
+ open my $fh, "<", $f;
+ my $out = "";
+ while(<$fh>)
+ {
+ chomp;
+ if(/^\/\/#NO AUTOCVARS START/ .. /^\/\/#NO AUTOCVARS END/)
+ {
+ $out .= "$_\n";
+ next;
+ }
+ if(/^(?:var )?float autocvar_(.*);$/)
+ {
+ $out .= "$_\n";
+ next;
+ }
+ if(/^(?:var )?string autocvar_(.*);$/)
+ {
+ $out .= "$_\n";
+ next;
+ }
+ if(/^#define autocvar_(.*) cvar/)
+ {
+ $out .= "$_\n";
+ next;
+ }
+ s{\b(cvar|cvar_string|cvar_vector|cvar_or)\s*\(\s*"([^"]+)"\s*(?:,\s*[^\s)]+\s*)?\)}{
+ my ($type, $name) = ($1, $2);
+ $type = 'cvar' if $type eq 'cvar_or';
+ my $realtype = $cvars{$name};
+ my $r = $&;
+ if(defined $realtype)
+ {
+ #$r = "$realtype(\"$name\")";
+ $r = "autocvar_$name";
+ if($type eq 'cvar' && $realtype eq 'cvar_string')
+ {
+ $r = "stof($r)";
+ }
+ if($type eq 'cvar_string' && $realtype eq 'cvar')
+ {
+ $r = "ftos($r)";
+ }
+ }
+ $r;
+ }ge;
+ $out .= "$_\n";
+ }
+ close $fh;
+ open $fh, ">", $f;
+ print $fh $out;
+ close $fh;
+}
// float coop;
// float deathmatch;
-// float dmg_take;
+float dmg_take;
// float dmg_save;
// vector dmg_origin;
string w_deathtypestring;
vector w_org, w_backoff;
-float campingrifle_scope;
+float sniperrifle_scope;
float nex_scope;
float cr_maxbullets;
float nex_charge_movingavg;
float serverflags;
+
+float uid2name_dialog;
void() menu_show_error =
{
- drawstring('0 200 0', "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!", '8 8 0', '1 0 0', 1, 0);
+ drawstring('0 200 0', _("ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"), '8 8 0', '1 0 0', 1, 0);
};
// CSQC_Init : Called every time the CSQC code is initialized (essentially at map load)
void WaypointSprite_Load();
void CSQC_Init(void)
{
+ prvm_language = cvar_string("prvm_language");
+
#ifdef USE_FTE
#pragma target ID
__engine_check = checkextension("DP_SV_WRITEPICTURE");
if(!__engine_check)
{
- print("^3Your engine build is outdated\n^3This Server uses a newer QC VM. Please update!\n");
+ print(_("^3Your engine build is outdated\n^3This Server uses a newer QC VM. Please update!\n"));
localcmd("\ndisconnect\n");
return;
}
#pragma target FTE
#endif
-
+
check_unacceptable_compiler_bugs();
#ifdef WATERMARK
- print("^4CSQC Build information: ", WATERMARK(), "\n");
+ print(sprintf(_("^4CSQC Build information: %s\n"), WATERMARK()));
#endif
float i;
- CSQC_CheckEngine();
binddb = db_create();
tempdb = db_create();
ClientProgsDB = db_load("client.db");
compressShortVector_init();
- drawfont = 0;
+ drawfont = FONT_USER+1;
menu_visible = FALSE;
menu_show = menu_show_error;
menu_action = menu_sub_null;
WaypointSprite_Load();
// precaches
+ precache_sound("misc/hit.wav");
+ precache_sound("misc/typehit.wav");
Projectile_Precache();
Hook_Precache();
GibSplash_Precache();
Casings_Precache();
DamageInfo_Precache();
- if(cvar_string("cl_announcer") != cl_announcer_prev) {
+ if(autocvar_cl_announcer != cl_announcer_prev) {
Announcer_Precache();
if(cl_announcer_prev)
strunzone(cl_announcer_prev);
- cl_announcer_prev = strzone(cvar_string("cl_announcer"));
+ cl_announcer_prev = strzone(autocvar_cl_announcer);
}
Tuba_Precache();
remove(players);
db_close(binddb);
db_close(tempdb);
- if(cvar("cl_db_saveasdump"))
+ if(autocvar_cl_db_saveasdump)
db_dump(ClientProgsDB, "client.db");
else
db_save(ClientProgsDB, "client.db");
default:
if(GetTeam(Team, false) == NULL)
{
- print("trying to switch to unsupported team ", ftos(Team), "\n");
+ print(sprintf(_("trying to switch to unsupported team %d\n"), Team));
Team = COLOR_SPECTATOR;
}
break;
default:
if(GetTeam(Team, false) == NULL)
{
- print("trying to switch to unsupported team ", ftos(Team), "\n");
+ print(sprintf(_("trying to switch to unsupported team %d\n"), Team));
Team = COLOR_SPECTATOR;
}
break;
{
if(o.has_team)
{
- //print("(DISCONNECT) leave team ", ftos(o.team), "\n");
tm = GetTeam(o.team, false);
tm.team_size -= 1;
o.has_team = 0;
{
if not(o.has_team)
{
- //print("(CONNECT) enter team ", ftos(o.team), "\n");
o.team = Team;
tm = GetTeam(Team, true);
tm.team_size += 1;
}
else if(Team != o.team)
{
- //print("(CHANGE) leave team ", ftos(o.team), "\n");
tm = GetTeam(o.team, false);
tm.team_size -= 1;
o.team = Team;
- //print("(CHANGE) enter team ", ftos(o.team), "\n");
tm = GetTeam(Team, true);
tm.team_size += 1;
return TRUE;
{
if(e.sort_prev)
{
- //print("playerchecker: KILL KILL KILL\n");
// player disconnected
SetTeam(e, -1);
RemovePlayer(e);
{
if not(e.sort_prev)
{
- //print("playerchecker: SPAWN SPAWN SPAWN\n");
// player connected
if not(e)
playerslots[i] = e = spawn();
void TrueAim_Init();
void PostInit(void)
{
- print(strcat("PostInit\n maxclients = ", ftos(maxclients), "\n"));
- localcmd(strcat("\nscoreboard_columns_set ", cvar_string("scoreboard_columns"), ";\n"));
+ localcmd(strcat("\nscoreboard_columns_set ", autocvar_scoreboard_columns, ";\n"));
entity playerchecker;
playerchecker = spawn();
strCmd = argv(0);
if(strCmd == "hud_configure") { // config hud
- cvar_set("_hud_configure", ftos(!cvar("_hud_configure")));
+ cvar_set("_hud_configure", ftos(!autocvar__hud_configure));
return true;
} else if(strCmd == "hud_save") { // save hud config
if(argv(1) == "" || argv(2)) {
- print("Usage:\n");
- print("hud_save configname (saves to hud_skinname_configname.cfg)\n");
+ print(_("Usage:\n"));
+ print(_("hud_save configname (saves to hud_skinname_configname.cfg)\n"));
}
else
HUD_Panel_ExportCfg(argv(1));
if(argv(0) == "help" || argc == 0)
{
- print("Usage: cl_cmd COMMAND..., where possible commands are:\n");
- print(" settemp cvar value\n");
- print(" scoreboard_columns_set ...\n");
- print(" scoreboard_columns_help\n");
+ print(_("Usage: cl_cmd COMMAND..., where possible commands are:\n"));
+ print(_(" settemp cvar value\n"));
+ print(_(" scoreboard_columns_set ...\n"));
+ print(_(" scoreboard_columns_help\n"));
GameCommand_Generic("help");
return;
}
e.draw = DrawDebugModel;
e.classname = "debugmodel";
}
+ else if(cmd == "vyes")
+ {
+ if(uid2name_dialog)
+ {
+ vote_active = 0; // force the panel to disappear right as we have selected the value (to prevent it from fading out in the normal vote panel pos)
+ vote_prev = 0;
+ cvar_set("cl_allow_uid2name", "1");
+ vote_change = -9999;
+ }
+ else
+ {
+ localcmd("cmd vote yes\n");
+ }
+ }
+ else if(cmd == "vno")
+ {
+ if(uid2name_dialog)
+ {
+ vote_active = 0;
+ vote_prev = 0;
+ cvar_set("cl_allow_uid2name", "0");
+ vote_change = -9999;
+ }
+ else
+ {
+ localcmd("cmd vote no\n");
+ }
+ }
+
else
{
print("Invalid command. For a list of supported commands, try cl_cmd help.\n");
local float bSkipKey;
bSkipKey = false;
- if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE) && panel_fg_alpha && !scoreboard_active) // don't lock keys before we actually see what's going on
- {
- /*
- string vyes_keys;
- float keys;
- vyes_keys = findkeysforcommand("vyes");
- keys = tokenize(vyes_keys);
-
- float i;
- for (i = 0; i < keys; ++i)
- {
- print(ftos(nPrimary), " ", argv(i), "\n");
- if(nPrimary == stof(argv(i)))
- {
- vote_active = 0;
- cvar_set("cl_allow_uid2name", "1");
- return TRUE;
- }
- }
-
- string vno_keys;
- vno_keys = findkeysforcommand("vno");
- keys = tokenize(vno_keys);
-
- float i;
- for (i = 0; i < keys; ++i)
- {
- if(nPrimary == stof(argv(i)))
- {
- vote_active = 0;
- cvar_set("cl_allow_uid2name", "0");
- return TRUE;
- }
- }
- */ // If only I could grab F1-F12 in CSQC... but no
-
- if(nPrimary == 121) // ascii value for y
- {
- vote_active = 0;
- cvar_set("cl_allow_uid2name", "1");
- return TRUE;
- }
- else if(nPrimary == 110) // ascii value for n
- {
- vote_active = 0;
- cvar_set("cl_allow_uid2name", "0");
- return TRUE;
- }
- }
-
if (HUD_Panel_InputEvent(bInputType, nPrimary, nSecondary))
return true;
#ifdef DP_CSQC_ENTITY_REMOVE_IS_B0RKED
if(!isNew && n != self.sv_entnum)
{
- print("A CSQC entity changed its owner!\n");
+ print(_("A CSQC entity changed its owner!\n"));
isNew = true;
Ent_Remove();
self.enttype = ENT_CLIENT_SCORES;
if(newspectatee_status != spectatee_status)
{
float i;
- // clear the weapon accuracy stats
- for(i = WEP_FIRST; i <= WEP_LAST; ++i) {
- weapon_hits[i] = 0;
- weapon_fired[i] = 0;
- }
// clear race stuff
race_laptime = 0;
psrandom(s);
}
+void Ent_ReadAccuracy(void)
+{
+ float sf, f, w, b;
+ sf = ReadInt24_t();
+ if(sf == 0)
+ {
+ for(w = 0; w <= WEP_LAST - WEP_FIRST; ++w)
+ weapon_accuracy[w] = -1;
+ return;
+ }
+
+ for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
+ {
+ if(sf & f)
+ {
+ b = ReadByte();
+ if(b == 0)
+ weapon_accuracy[w] = -1;
+ else if(b == 255)
+ weapon_accuracy[w] = 1.0; // no better error handling yet, sorry
+ else
+ weapon_accuracy[w] = (b - 1.0) / 100.0;
+ }
+ }
+}
+
// CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured.
// The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS.
void Ent_RadarLink();
if(self.enttype)
if(t != self.enttype)
{
- print("A CSQC entity changed its type!\n");
+ print(_("A CSQC entity changed its type!\n"));
Ent_Remove();
bIsNewEntity = 1;
}
case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break;
case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
+ case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
default:
- error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
+ error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
break;
}
g_weaponswitchdelay = ReadByte() / 255.0;
- g_balance_grenadelauncher_secondary_bouncefactor = ReadCoord();
- g_balance_grenadelauncher_secondary_bouncestop = ReadCoord();
+ g_balance_grenadelauncher_bouncefactor = ReadCoord();
+ g_balance_grenadelauncher_bouncestop = ReadCoord();
+ g_balance_electro_secondary_bouncefactor = ReadCoord();
+ g_balance_electro_secondary_bouncestop = ReadCoord();
nex_scope = !ReadByte();
- campingrifle_scope = !ReadByte();
+ sniperrifle_scope = !ReadByte();
serverflags = ReadByte();
+ cr_maxbullets = ReadByte();
+
+ g_trueaim_minrange = ReadCoord();
+
if(!postinit)
PostInit();
}
Net_WeaponComplain();
bHandled = true;
break;
- case TE_CSQC_CR_MAXBULLETS:
- cr_maxbullets = ReadByte();
- bHandled = true;
- break;
default:
// No special logic for this temporary entity; return 0 so the engine can handle it
bHandled = false;
if ("" == keys) {
if (hud_showbinds > 1)
- return strcat(text, " (not bound)");
+ return sprintf(_("%s (not bound)"), text);
else
return text;
}
else if (hud_showbinds > 1)
- return strcat(text, " (", keys, ")");
+ return sprintf(_("%s (%s)"), text, keys);
else
return keys;
}
if (previous_game_starttime != startTime) {
if ((time + 5.0) < startTime) {
//if connecting to server while restart was active don't always play prepareforbattle
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
}
if (time < startTime) {
restartAnnouncer = spawn();
{
float zoomsensitivity, zoomspeed, zoomfactor, zoomdir, velocityzoom;
- zoomsensitivity = cvar("cl_zoomsensitivity");
- zoomfactor = cvar("cl_zoomfactor");
+ zoomsensitivity = autocvar_cl_zoomsensitivity;
+ zoomfactor = autocvar_cl_zoomfactor;
if(zoomfactor < 1 || zoomfactor > 16)
zoomfactor = 2.5;
- zoomspeed = cvar("cl_zoomspeed");
+ zoomspeed = autocvar_cl_zoomspeed;
if(zoomspeed >= 0)
if(zoomspeed < 0.5 || zoomspeed > 16)
zoomspeed = 3.5;
zoomdir = button_zoom;
- if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_CAMPINGRIFLE && campingrifle_scope)) // do NOT use switchweapon here
+ if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_SNIPERRIFLE && sniperrifle_scope)) // do NOT use switchweapon here
zoomdir += button_attack2;
if(spectatee_status > 0 || isdemo())
{
else
setsensitivityscale(1);
- velocityzoom = bound(0, drawframetime / max(0.000000001, cvar_or("cl_velocityzoomtime", 0.3)), 1);
+ velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
- velocityzoom = exp(float2range11(avgspeed * -cvar_or("cl_velocityzoom", 0) / 1) * 1);
+ velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
- //print(ftos(avgspeed), " avgspeed, ", ftos(cvar_or("cl_velocityzoom", 0)), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+ //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
float frustumx, frustumy, fovx, fovy;
frustumy = tan(fov * M_PI / 360.0) * 0.75 * current_viewzoom * velocityzoom;
case WEP_MINSTANEX:
mv = MOVE_NORMAL;
break;
- case WEP_CAMPINGRIFLE:
+ case WEP_SNIPERRIFLE:
ta = trueaim_rifle;
mv = MOVE_NORMAL;
if(zoomscript_caught)
traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, mv, ta);
trueaimpoint = trace_endpos;
+ if(vlen(trueaimpoint - view_origin) < g_trueaim_minrange)
+ trueaimpoint = view_origin + view_forward * g_trueaim_minrange;
+
if(vecs_x > 0)
vecs_y = -vecs_y;
else
entity nightvision_noise, nightvision_noise2;
float pickup_crosshair_time, pickup_crosshair_size;
+float hit_time, typehit_time;
+float nextsound_hit_time, nextsound_typehit_time;
+float hitindication_crosshair_time, hitindication_crosshair_size;
+float use_nex_chargepool;
+
+float myhealth, myhealth_prev;
+float myhealth_flash;
+
+vector myhealth_gentlergb;
+
+float contentavgalpha, liquidalpha_prev;
+vector liquidcolor_prev;
void CSQC_UpdateView(float w, float h)
{
input_angles = warpzone_fixview_cl_viewangles;
view_angles = warpzone_fixview_angles;
- if(cvar("cl_lockview") || (autocvar__hud_configure && spectatee_status <= 0))
+ if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0))
{
pmove_org = freeze_pmove_org;
input_angles = view_angles = freeze_input_angles;
maptimeAnnouncer();
carrierAnnouncer();
- fov = cvar("fov");
+ fov = autocvar_fov;
if(button_zoom || fov <= 59.5)
{
if(!zoomscript_caught)
}
}
- ColorTranslateMode = cvar("cl_stripcolorcodes");
+ ColorTranslateMode = autocvar_cl_stripcolorcodes;
activeweapon = getstati(STAT_SWITCHWEAPON);
- f = cvar("teamplay");
+ f = (serverflags & SERVERFLAG_TEAMPLAY);
if(f != teamplay)
{
teamplay = f;
R_SetView(VF_DRAWWORLD, 1);
// Set the console size vars
- vid_conwidth = cvar("vid_conwidth");
- vid_conheight = cvar("vid_conheight");
- vid_pixelheight = cvar("vid_pixelheight");
+ vid_conwidth = autocvar_vid_conwidth;
+ vid_conheight = autocvar_vid_conheight;
+ vid_pixelheight = autocvar_vid_pixelheight;
R_SetView(VF_FOV, GetCurrentFov(fov));
// Camera for demo playback
if(camera_active)
{
- if(cvar("camera_enable"))
+ if(autocvar_camera_enable)
CSQC_Demo_Camera();
else
{
}
}
#ifdef CAMERATEST
- else if(cvar("camera_enable"))
+ else if(autocvar_camera_enable)
#else
- else if(cvar("camera_enable") && isdemo())
+ else if(autocvar_camera_enable && isdemo())
#endif
{
// Enable required Darkplaces cvars
- chase_active_backup = cvar("chase_active");
+ chase_active_backup = autocvar_chase_active;
cvar_set("chase_active", "2");
cvar_set("cl_demo_mousegrab", "1");
camera_active = TRUE;
R_SetView(VF_DRAWENGINEHUD, 0);
// fetch this one only once per frame
- hud_showbinds = cvar("hud_showbinds");
- hud_showbinds_limit = cvar("hud_showbinds_limit");
+ hud_showbinds = autocvar_hud_showbinds;
+ hud_showbinds_limit = autocvar_hud_showbinds_limit;
// Update the mouse position
/*
// next R_RenderScene call
drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0);
- if(cvar("r_fakelight") >= 2 || cvar("r_fullbright") >= 1)
+ if(autocvar_r_fakelight >= 2 || autocvar_r_fullbright)
if not(serverflags & SERVERFLAG_ALLOW_FULLBRIGHT)
{
// apply night vision effect
}
// color tint in yellow
- drawfill('0 0 0', cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', '0.5 1 0.3', 1, DRAWFLAG_MODULATE);
+ drawfill('0 0 0', autocvar_vid_conwidth * '1 0 0' + autocvar_vid_conheight * '0 1 0', '0.5 1 0.3', 1, DRAWFLAG_MODULATE);
// draw BG
a = Noise_Pink(nightvision_noise, frametime * 1.5) * 0.05 + 0.15;
tc_11 = tc_01 + tc_10 - tc_00;
R_BeginPolygon("gfx/nightvision-bg.tga", DRAWFLAG_ADDITIVE);
R_PolygonVertex('0 0 0', tc_00, rgb, a);
- R_PolygonVertex(cvar("vid_conwidth") * '1 0 0', tc_10, rgb, a);
- R_PolygonVertex(cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', tc_11, rgb, a);
- R_PolygonVertex(cvar("vid_conheight") * '0 1 0', tc_01, rgb, a);
+ R_PolygonVertex(autocvar_vid_conwidth * '1 0 0', tc_10, rgb, a);
+ R_PolygonVertex(autocvar_vid_conwidth * '1 0 0' + autocvar_vid_conheight * '0 1 0', tc_11, rgb, a);
+ R_PolygonVertex(autocvar_vid_conheight * '0 1 0', tc_01, rgb, a);
R_EndPolygon();
// draw FG
tc_11 = tc_01 + tc_10 - tc_00;
R_BeginPolygon("gfx/nightvision-fg.tga", DRAWFLAG_ADDITIVE);
R_PolygonVertex('0 0 0', tc_00, rgb, a);
- R_PolygonVertex(cvar("vid_conwidth") * '1 0 0', tc_10, rgb, a);
- R_PolygonVertex(cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', tc_11, rgb, a);
- R_PolygonVertex(cvar("vid_conheight") * '0 1 0', tc_01, rgb, a);
+ R_PolygonVertex(autocvar_vid_conwidth * '1 0 0', tc_10, rgb, a);
+ R_PolygonVertex(autocvar_vid_conwidth * '1 0 0' + autocvar_vid_conheight * '0 1 0', tc_11, rgb, a);
+ R_PolygonVertex(autocvar_vid_conheight * '0 1 0', tc_01, rgb, a);
R_EndPolygon();
}
// the view to go back to normal, so reticle_type would become 0 as we fade out)
if(spectatee_status || getstati(STAT_HEALTH) <= 0)
reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
- else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_CAMPINGRIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
+ else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_SNIPERRIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
reticle_type = 2; // nex zoom
else if(button_zoom || zoomscript_caught)
reticle_type = 1; // normal zoom
- else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_CAMPINGRIFLE && button_attack2)
+ else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_SNIPERRIFLE && button_attack2)
reticle_type = 2; // nex zoom
- if(cvar("cl_reticle_stretch"))
+ if(autocvar_cl_reticle_stretch)
{
reticle_size_x = vid_conwidth;
reticle_size_y = vid_conheight;
f = current_zoomfraction;
if(zoomscript_caught)
f = 1;
- if(cvar("cl_reticle_item_normal"))
+ if(autocvar_cl_reticle_item_normal)
{
precache_pic("gfx/reticle_normal");
if(reticle_type == 1 && f)
- drawpic(reticle_pos, "gfx/reticle_normal", reticle_size, '1 1 1', f * cvar("cl_reticle_item_normal"), DRAWFLAG_NORMAL);
+ drawpic(reticle_pos, "gfx/reticle_normal", reticle_size, '1 1 1', f * autocvar_cl_reticle_item_normal, DRAWFLAG_NORMAL);
}
- if(cvar("cl_reticle_item_nex"))
+ if(autocvar_cl_reticle_item_nex)
{
precache_pic("gfx/reticle_nex");
if(reticle_type == 2 && f)
- drawpic(reticle_pos, "gfx/reticle_nex", reticle_size, '1 1 1', f * cvar("cl_reticle_item_nex"), DRAWFLAG_NORMAL);
+ drawpic(reticle_pos, "gfx/reticle_nex", reticle_size, '1 1 1', f * autocvar_cl_reticle_item_nex, DRAWFLAG_NORMAL);
+ }
+
+
+ // improved polyblend
+ vector rgb;
+ if(autocvar_hud_contents)
+ {
+ float contentalpha_temp, incontent, liquidalpha, contentfadetime;
+ vector liquidcolor;
+
+ switch(pointcontents(view_origin))
+ {
+ case CONTENT_WATER:
+ liquidalpha = autocvar_hud_contents_water_alpha;
+ liquidcolor = stov(autocvar_hud_contents_water_color);
+ incontent = 1;
+ break;
+
+ case CONTENT_LAVA:
+ liquidalpha = autocvar_hud_contents_lava_alpha;
+ liquidcolor = stov(autocvar_hud_contents_lava_color);
+ incontent = 1;
+ break;
+
+ case CONTENT_SLIME:
+ liquidalpha = autocvar_hud_contents_slime_alpha;
+ liquidcolor = stov(autocvar_hud_contents_slime_color);
+ incontent = 1;
+ break;
+
+ default:
+ liquidalpha = 0;
+ liquidcolor = '0 0 0';
+ incontent = 0;
+ break;
+ }
+
+ if(incontent) // fade in/out at different speeds so you can do e.g. instant fade when entering water and slow when leaving it.
+ { // also lets delcare previous values for blending properties, this way it isn't reset until after you have entered a different content
+ contentfadetime = autocvar_hud_contents_fadeintime;
+ liquidalpha_prev = liquidalpha;
+ liquidcolor_prev = liquidcolor;
+ }
+ else
+ contentfadetime = autocvar_hud_contents_fadeouttime;
+
+ contentalpha_temp = bound(0, drawframetime / max(0.0001, contentfadetime), 1);
+ contentavgalpha = contentavgalpha * (1 - contentalpha_temp) + incontent * contentalpha_temp;
+
+ if(contentavgalpha)
+ drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, liquidcolor_prev, contentavgalpha * liquidalpha_prev, DRAWFLAG_NORMAL);
+ }
+
+ if(autocvar_hud_damage)
+ {
+ float myhealth_flash_temp;
+ myhealth = getstati(STAT_HEALTH);
+
+ // fade out
+ myhealth_flash = max(0, myhealth_flash - autocvar_hud_damage_fade_rate * frametime);
+ // add new damage
+ myhealth_flash = bound(0, myhealth_flash + dmg_take * autocvar_hud_damage_factor, autocvar_hud_damage_maxalpha);
+
+ float pain_threshold, pain_threshold_lower, pain_threshold_lower_health;
+ pain_threshold = autocvar_hud_damage_pain_threshold;
+ pain_threshold_lower = autocvar_hud_damage_pain_threshold_lower;
+ pain_threshold_lower_health = autocvar_hud_damage_pain_threshold_lower_health;
+
+ if(pain_threshold_lower && myhealth < pain_threshold_lower_health)
+ {
+ pain_threshold = pain_threshold - max(autocvar_hud_damage_pain_threshold_pulsating_min, fabs(sin(M_PI * time / autocvar_hud_damage_pain_threshold_pulsating_period))) * pain_threshold_lower * (1 - max(0, myhealth)/pain_threshold_lower_health);
+ }
+
+ myhealth_flash_temp = bound(0, myhealth_flash - pain_threshold, 1);
+
+ if(myhealth_prev < 1)
+ {
+ if(myhealth >= 1)
+ {
+ myhealth_flash = 0; // just spawned, clear the flash immediately
+ myhealth_flash_temp = 0;
+ }
+ else
+ {
+ myhealth_flash += autocvar_hud_damage_fade_rate * frametime; // dead
+ }
+ }
+
+ if(spectatee_status == -1 || intermission)
+ {
+ myhealth_flash = 0; // observing, or match ended
+ myhealth_flash_temp = 0;
+ }
+
+ myhealth_prev = myhealth;
+
+ if(autocvar_cl_gentle_damage || autocvar_cl_gentle)
+ {
+ if(autocvar_cl_gentle_damage == 2)
+ {
+ if(myhealth_flash < pain_threshold) // only randomize when the flash is gone
+ {
+ myhealth_gentlergb = eX * random() + eY * random() + eZ * random();
+ }
+ }
+ else
+ myhealth_gentlergb = stov(autocvar_hud_damage_gentle_color);
+
+ drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, myhealth_gentlergb, autocvar_hud_damage_gentle_alpha_multiplier * bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
+ }
+ else
+ drawpic(reticle_pos, "gfx/blood", reticle_size, stov(autocvar_hud_damage_color), bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
}
// Draw the mouse cursor
scoreboard_active = HUD_WouldDrawScoreboard();
+ hit_time = getstatf(STAT_HIT_TIME);
+ if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
+ {
+ sound(world, CHAN_AUTO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+ nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
+ }
+ typehit_time = getstatf(STAT_TYPEHIT_TIME);
+ if(typehit_time > nextsound_typehit_time)
+ {
+ sound(world, CHAN_AUTO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+ nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
+ }
+
float hud;
hud = getstati(STAT_HUD);
if(hud == HUD_SPIDERBOT)
CSQC_RAPTOR_HUD();
else
{
- if(cvar("r_letterbox") == 0)
- if(cvar("viewsize") < 120)
+ if(gametype == GAME_FREEZETAG)
+ {
+ if(getstati(STAT_FROZEN))
+ drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
+ if(getstatf(STAT_REVIVE_PROGRESS))
+ {
+ DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
+ drawstring_aspect(eY * 0.64 * vid_conheight, "Revival progress", eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
+ }
+ }
+
+ if(autocvar_r_letterbox == 0)
+ if(autocvar_viewsize < 120)
CSQC_common_hud();
// crosshair goes VERY LAST
if(!scoreboard_active && !camera_active && intermission != 2) {
string wcross_style;
float wcross_alpha, wcross_resolution;
- wcross_style = cvar_string("crosshair");
+ wcross_style = autocvar_crosshair;
if (wcross_style == "0")
return;
- wcross_resolution = cvar("crosshair_size");
+ wcross_resolution = autocvar_crosshair_size;
if (wcross_resolution == 0)
return;
- wcross_alpha = cvar("crosshair_alpha");
+ wcross_alpha = autocvar_crosshair_alpha;
if (wcross_alpha == 0)
return;
// wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
wcross_origin = project_3d_to_2d(view_origin + MAX_SHOT_DISTANCE * view_forward);
wcross_origin_z = 0;
- if(cvar("crosshair_hittest"))
+ if(autocvar_crosshair_hittest)
{
vector wcross_oldorigin;
wcross_oldorigin = wcross_origin;
if(vlen(v) > 0.01)
shottype = SHOTTYPE_HITOBSTRUCTION;
}
- if(!cvar("crosshair_hittest_showimpact"))
+ if(!autocvar_crosshair_hittest_showimpact)
wcross_origin = wcross_oldorigin;
}
else
string wcross_wep, wcross_name;
float wcross_scale, wcross_blur;
- wcross_color_x = cvar("crosshair_color_red");
- wcross_color_y = cvar("crosshair_color_green");
- wcross_color_z = cvar("crosshair_color_blue");
- if (cvar("crosshair_per_weapon")) {
+ if (autocvar_crosshair_per_weapon || autocvar_crosshair_color_per_weapon) {
e = get_weaponinfo(activeweapon);
if (e && e.netname != "")
{
wcross_wep = e.netname;
- wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size"));
- if (wcross_resolution == 0)
- return;
- wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_alpha"));
- if (wcross_alpha == 0)
- return;
-
- wcross_style = cvar_string(strcat("crosshair_", wcross_wep));
- if(wcross_style == "")
- wcross_style = e.netname;
-
- if(!cvar("crosshair_color_override"))
+ if(autocvar_crosshair_per_weapon)
{
- wcross_color_x = cvar(strcat("crosshair_", wcross_wep, "_color_red"));
- wcross_color_y = cvar(strcat("crosshair_", wcross_wep, "_color_green"));
- wcross_color_z = cvar(strcat("crosshair_", wcross_wep, "_color_blue"));
+ wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size"));
+ if (wcross_resolution == 0)
+ return;
+ wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_alpha"));
+ if (wcross_alpha == 0)
+ return;
+
+ wcross_style = cvar_string(strcat("crosshair_", wcross_wep));
+ if(wcross_style == "" || wcross_style == "0")
+ wcross_style = wcross_wep;
}
}
}
+ if(wcross_wep != "" && autocvar_crosshair_color_per_weapon)
+ wcross_color = stov(cvar_string(strcat("crosshair_", wcross_wep, "_color")));
+ else if(autocvar_crosshair_color_by_health)
+ {
+ local float x = getstati(STAT_HEALTH);
+
+ //x = red
+ //y = green
+ //z = blue
+
+ wcross_color_z = 0;
+
+ if(x > 200)
+ {
+ wcross_color_x = 0;
+ wcross_color_y = 1;
+ }
+ else if(x > 150)
+ {
+ wcross_color_x = 0.4 - (x-150)*0.02 * 0.4;
+ wcross_color_y = 0.9 + (x-150)*0.02 * 0.1;
+ }
+ else if(x > 100)
+ {
+ wcross_color_x = 1 - (x-100)*0.02 * 0.6;
+ wcross_color_y = 1 - (x-100)*0.02 * 0.1;
+ wcross_color_z = 1 - (x-100)*0.02;
+ }
+ else if(x > 50)
+ {
+ wcross_color_x = 1;
+ wcross_color_y = 1;
+ wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+ }
+ else if(x > 20)
+ {
+ wcross_color_x = 1;
+ wcross_color_y = (x-20)*90/27/100;
+ wcross_color_z = (x-20)*90/27/100 * 0.2;
+ }
+ else
+ {
+ wcross_color_x = 1;
+ wcross_color_y = 0;
+ }
+ }
+ else
+ wcross_color = stov(autocvar_crosshair_color);
wcross_name = strcat("gfx/crosshair", wcross_style);
- if(cvar("crosshair_effect_scalefade"))
+ if(autocvar_crosshair_effect_scalefade)
{
wcross_scale = wcross_resolution;
wcross_resolution = 1;
wcross_scale = 1;
}
- if(cvar("crosshair_pickup"))
+ if(autocvar_crosshair_pickup)
{
if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP))
{
}
if(pickup_crosshair_size > 0)
- pickup_crosshair_size -= cvar("crosshair_pickup_speed") * frametime;
+ pickup_crosshair_size -= autocvar_crosshair_pickup_speed * frametime;
else
pickup_crosshair_size = 0;
- wcross_scale += sin(pickup_crosshair_size) * cvar("crosshair_pickup");
+ wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
+ }
+
+ vector hitindication_color;
+ if(autocvar_crosshair_hitindication)
+ {
+ hitindication_color = stov(autocvar_crosshair_hitindication_color);
+ if(hitindication_crosshair_time < hit_time)
+ {
+ hitindication_crosshair_size = 1;
+ hitindication_crosshair_time = hit_time;
+ }
+
+ if(hitindication_crosshair_size > 0)
+ hitindication_crosshair_size -= autocvar_crosshair_hitindication_speed * frametime;
+ else
+ hitindication_crosshair_size = 0;
+
+ wcross_scale += sin(hitindication_crosshair_size) * autocvar_crosshair_hitindication;
+ wcross_color_x += sin(hitindication_crosshair_size) * hitindication_color_x;
+ wcross_color_y += sin(hitindication_crosshair_size) * hitindication_color_y;
+ wcross_color_z += sin(hitindication_crosshair_size) * hitindication_color_z;
}
if(shottype == SHOTTYPE_HITENEMY)
- wcross_scale *= cvar("crosshair_hittest"); // is not queried if hittest is 0
+ wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0
if(shottype == SHOTTYPE_HITTEAM)
- wcross_scale /= cvar("crosshair_hittest"); // is not queried if hittest is 0
+ wcross_scale /= autocvar_crosshair_hittest; // is not queried if hittest is 0
- f = cvar("crosshair_effect_speed");
+ f = autocvar_crosshair_effect_speed;
if(f < 0)
f *= -2 * g_weaponswitchdelay;
if(wcross_scale != wcross_scale_goal_prev || wcross_alpha != wcross_alpha_goal_prev || wcross_color != wcross_color_goal_prev)
wcross_alpha_goal_prev = wcross_alpha;
wcross_color_goal_prev = wcross_color;
- if(shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && cvar("crosshair_hittest_blur") && !cvar("chase_active")))
+ if(shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active))
{
wcross_blur = 1;
wcross_alpha *= 0.75;
wcross_alpha_prev = wcross_alpha;
wcross_color_prev = wcross_color;
- wcross_scale *= 1 - cvar("_menu_alpha");
- wcross_alpha *= 1 - cvar("_menu_alpha");
+ wcross_scale *= 1 - autocvar__menu_alpha;
+ wcross_alpha *= 1 - autocvar__menu_alpha;
- ring_scale = cvar("crosshair_ring_size");
+ ring_scale = autocvar_crosshair_ring_size;
wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
- float nex_charge;
+ float nex_charge, nex_chargepool;
nex_charge = getstatf(STAT_NEX_CHARGE);
+ nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
nex_charge_movingavg = nex_charge;
// ring around crosshair representing bullets left in camping rifle clip
- if (activeweapon == WEP_CAMPINGRIFLE && cr_maxbullets)
+ if (activeweapon == WEP_SNIPERRIFLE && cr_maxbullets)
{
bullets = getstati(STAT_BULLETS_LOADED);
f = bound(0, bullets / cr_maxbullets, 1);
- a = cvar("crosshair_campingrifle_bulletcounter_alpha");
+ a = autocvar_crosshair_ring_sniperrifle_alpha;
DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
}
else if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex
{
- vector rgb;
- // indicate how much we're charging right now with an inner circle
- a = cvar("crosshair_nexvelocity_currentcharge_alpha");
- nex_charge_movingavg = (1 - cvar("crosshair_nexvelocity_currentcharge_movingavg_rate")) * nex_charge_movingavg + cvar("crosshair_nexvelocity_currentcharge_movingavg_rate") * nex_charge;
+ if(nex_chargepool || use_nex_chargepool)
+ {
+ use_nex_chargepool = 1;
+
+ a = autocvar_crosshair_ring_nex_inner_alpha;
+ rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", nex_chargepool, rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ }
+ else
+ {
+ // indicate how much we're charging right now with an inner circle
+ a = autocvar_crosshair_ring_nex_inner_alpha;
+ nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
- rgb = eX * cvar("crosshair_nexvelocity_currentcharge_color_red") + eY * cvar("crosshair_nexvelocity_currentcharge_color_green") + eZ * cvar("crosshair_nexvelocity_currentcharge_color_blue");
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, cvar("crosshair_nexvelocity_currentcharge_scale") * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ }
// draw the charge
- a = cvar("crosshair_nexvelocity_alpha");
+ a = autocvar_crosshair_ring_nex_outer_alpha;
DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
}
wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
- if(cvar("crosshair_dot"))
- CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", wcross_alpha * f * cvar("crosshair_dot_alpha"));
+ if(autocvar_crosshair_dot)
+ {
+ vector wcross_color_old;
+ wcross_color_old = wcross_color;
+ if(autocvar_crosshair_dot_color != "0")
+ wcross_color = stov(autocvar_crosshair_dot_color);
+ CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
+ wcross_color = wcross_color_old;
+ }
wcross_name_alpha_goal_prev = f;
}
if(cs_project_is_b0rked == 0)
{
string w0, h0;
- w0 = cvar_string("vid_conwidth");
- h0 = cvar_string("vid_conheight");
+ w0 = ftos(autocvar_vid_conwidth);
+ h0 = ftos(autocvar_vid_conheight);
//R_SetView(VF_VIEWPORT, '0 0 0', '640 480 0');
//R_SetView(VF_FOV, '90 90 0');
R_SetView(VF_ORIGIN, '0 0 0');
// Draw the crosshairs
picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- picsize_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
+ picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+ picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
hudloc_y = 4;
hudloc_x = 4;
// Draw the crosshairs
picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- picsize_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
+ picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+ picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
hudloc_y = 4;
hudloc_x = 4;
vector picsize, hudloc;
picsize = drawgetimagesize(SPIDER_CROSS);
- picsize_x *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- picsize_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
- drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
+ picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+ picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+ drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
/*
const float STAT_VEHICLESTAT_HEALTH = 60;
case HUD_NORMAL:
// do some accuracy var caching
float i;
- if(cvar_string("hud_panel_weapons_accuracy_color_levels") != acc_color_levels)
if(!(gametype == GAME_RACE || gametype == GAME_CTS))
{
- if(acc_color_levels)
- strunzone(acc_color_levels);
- acc_color_levels = strzone(cvar_string("hud_panel_weapons_accuracy_color_levels"));
- acc_levels = tokenize(acc_color_levels);
- if (acc_levels > MAX_ACCURACY_LEVELS)
- acc_levels = MAX_ACCURACY_LEVELS;
-
- for (i = 0; i < acc_levels; ++i)
- acc_lev[i] = stof(argv(i));
+ if(autocvar_accuracy_color_levels != acc_color_levels)
+ {
+ if(acc_color_levels)
+ strunzone(acc_color_levels);
+ acc_color_levels = strzone(autocvar_accuracy_color_levels);
+ acc_levels = tokenize(acc_color_levels);
+ if (acc_levels > MAX_ACCURACY_LEVELS)
+ acc_levels = MAX_ACCURACY_LEVELS;
+
+ for (i = 0; i < acc_levels; ++i)
+ acc_lev[i] = stof(argv(i)) / 100.0;
+ }
+ // let know that acc_col[] needs to be loaded
+ acc_col_x[0] = -1;
}
HUD_Main(); // always run these functions for alpha checks
HUD_Reset();
centerprint_start_x = 0;
- centerprint_start_y = cvar("scr_centerpos") * vid_conheight;
+ centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
}
else // hud
{
centerprint_start_x = 0;
- centerprint_start_y = cvar("scr_centerpos") * vid_conheight;
+ centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
}
HUD_DrawCenterPrint();
float speed, attenuation, dimensions;
vector tmp, delta;
- if( cvar("camera_reset") || !camera_mode )
+ if( autocvar_camera_reset || !camera_mode )
{
camera_offset = '0 0 0';
current_angles = '0 0 0';
// Camera angles
if( camera_roll )
- mouse_angles_z += camera_roll * cvar("camera_speed_roll");
+ mouse_angles_z += camera_roll * autocvar_camera_speed_roll;
- if(cvar("camera_look_player"))
+ if(autocvar_camera_look_player)
{
local vector dir;
local float n;
else
{
tmp = getmousepos() * 0.1;
- if(vlen(tmp)>cvar("camera_mouse_treshold"))
+ if(vlen(tmp)>autocvar_camera_mouse_threshold)
{
mouse_angles_x += tmp_y * cos(mouse_angles_z * DEG2RAD) + (tmp_x * sin(mouse_angles_z * DEG2RAD));
mouse_angles_y -= tmp_x * cos(mouse_angles_z * DEG2RAD) + (tmp_y * -sin(mouse_angles_z * DEG2RAD));
if(mouse_angles_y > 60 && current_angles_y < -60)
delta = '0 -360 0';
- if(cvar("camera_look_player"))
- attenuation = cvar("camera_look_attenuation");
+ if(autocvar_camera_look_player)
+ attenuation = autocvar_camera_look_attenuation;
else
- attenuation = cvar("camera_speed_attenuation");
+ attenuation = autocvar_camera_speed_attenuation;
attenuation = 1 / max(1, attenuation);
current_angles += (mouse_angles - current_angles + delta) * attenuation;
{
tmp_x = camera_direction_x * cos(current_angles_y * DEG2RAD);
tmp_y = camera_direction_x * sin(current_angles_y * DEG2RAD);
- if( cvar("camera_forward_follows") && !cvar("camera_look_player") )
+ if( autocvar_camera_forward_follows && !autocvar_camera_look_player )
tmp_z = camera_direction_x * -sin(current_angles_x * DEG2RAD);
++dimensions;
}
++dimensions;
}
- if(cvar("camera_free"))
- speed = cvar("camera_speed_free");
+ if(autocvar_camera_free)
+ speed = autocvar_camera_speed_free;
else
- speed = cvar("camera_speed_chase");
+ speed = autocvar_camera_speed_chase;
if(dimensions)
{
current_camera_offset += (camera_offset - current_camera_offset) * attenuation;
// Camera modes
- if( cvar("camera_free") )
+ if( autocvar_camera_free )
{
if ( camera_mode == CAMERA_CHASE )
{
camera_mode = CAMERA_CHASE;
- if(cvar("camera_chase_smoothly"))
+ if(autocvar_camera_chase_smoothly)
current_origin += (view_origin - current_origin) * attenuation;
else
current_origin = view_origin;
-var float autocvar_cl_projectiles_sloppy = 0;
-
-var float autocvar_cl_gibs_ticrate = 0.1;
-var float autocvar_cl_gibs_sloppy = 1;
-
-var float autocvar_cl_casings_ticrate = 0.1;
+float autocvar__con_chat_maximized;
+float autocvar__hud_configure;
+string autocvar__hud_panelorder;
+float autocvar__menu_alpha;
+string autocvar_accuracy_color_levels;
+float autocvar_bgmvolume;
+float autocvar_camera_chase_smoothly;
+float autocvar_camera_enable;
+float autocvar_camera_forward_follows;
+float autocvar_camera_free;
+float autocvar_camera_look_attenuation;
+float autocvar_camera_look_player;
+float autocvar_camera_mouse_threshold;
+float autocvar_camera_reset;
+float autocvar_camera_speed_attenuation;
+float autocvar_camera_speed_chase;
+float autocvar_camera_speed_free;
+float autocvar_camera_speed_roll;
+float autocvar_chase_active;
+float autocvar_cl_allow_uid2name;
+string autocvar_cl_announcer;
+float autocvar_cl_autodemo_delete;
+float autocvar_cl_autodemo_delete_keeprecords;
+float autocvar_cl_casings;
+float autocvar_cl_casings_bronze_time;
+var float autocvar_cl_casings_maxcount = 100;
+float autocvar_cl_casings_shell_time;
var float autocvar_cl_casings_sloppy = 1;
-
-var float autocvar_cl_gentle;
-var float autocvar_cl_gentle_gibs;
-var float autocvar_cl_gentle_messages;
-
-var float autocvar_scoreboard_color_bg_team;
-
-var float autocvar__menu_alpha;
-
-var float autocvar__hud_configure;
-var float autocvar_hud_configure_teamcolorforced;
-var float autocvar_hud_configure_checkcollisions;
-var float autocvar_hud_configure_bg_minalpha;
-var float autocvar_hud_configure_grid;
-var float autocvar_hud_configure_grid_xsize;
-var float autocvar_hud_configure_grid_ysize;
-var float autocvar_hud_configure_grid_alpha;
-
-var float autocvar__con_chat_maximized;
-var string autocvar__hud_panelorder;
-
-var string autocvar_hud_skin;
-var string autocvar_hud_dock;
-var string autocvar_hud_dock_color;
-var float autocvar_hud_dock_color_team;
-var float autocvar_hud_dock_alpha;
-
-var float autocvar_hud_progressbar_alpha;
-var vector autocvar_hud_progressbar_strength_color;
-var vector autocvar_hud_progressbar_shield_color;
-var vector autocvar_hud_progressbar_health_color;
-var vector autocvar_hud_progressbar_armor_color;
-var vector autocvar_hud_progressbar_fuel_color;
-var vector autocvar_hud_progressbar_nexball_color;
-
-var string autocvar_hud_panel_bg;
-var vector autocvar_hud_panel_bg_color;
-var float autocvar_hud_panel_bg_color_team;
-var float autocvar_hud_panel_bg_alpha;
-var float autocvar_hud_panel_bg_border;
-var float autocvar_hud_panel_bg_padding;
-var float autocvar_hud_panel_fg_alpha;
-
-var float autocvar_hud_panel_weapons;
-var vector autocvar_hud_panel_weapons_pos;
-var vector autocvar_hud_panel_weapons_size;
-var string autocvar_hud_panel_weapons_bg;
-var string autocvar_hud_panel_weapons_bg_color;
-var string autocvar_hud_panel_weapons_bg_color_team;
-var string autocvar_hud_panel_weapons_bg_alpha;
-var string autocvar_hud_panel_weapons_bg_border;
-var string autocvar_hud_panel_weapons_bg_padding;
-var float autocvar_hud_panel_weapons_aspect;
-var float autocvar_hud_panel_weapons_accuracy;
-var float autocvar_hud_panel_weapons_ammo;
-var vector autocvar_hud_panel_weapons_ammo_color;
-var float autocvar_hud_panel_weapons_ammo_alpha;
-var float autocvar_hud_panel_weapons_ammo_full_shells;
-var float autocvar_hud_panel_weapons_ammo_full_nails;
-var float autocvar_hud_panel_weapons_ammo_full_rockets;
-var float autocvar_hud_panel_weapons_ammo_full_cells;
-var float autocvar_hud_panel_weapons_ammo_full_fuel;
-var float autocvar_hud_panel_weapons_label;
-var float autocvar_hud_panel_weapons_complainbubble;
-var float autocvar_hud_panel_weapons_complainbubble_padding;
-var float autocvar_hud_panel_weapons_complainbubble_time;
-var float autocvar_hud_panel_weapons_complainbubble_fadetime;
-var vector autocvar_hud_panel_weapons_complainbubble_color_outofammo;
-var vector autocvar_hud_panel_weapons_complainbubble_color_donthave;
-var vector autocvar_hud_panel_weapons_complainbubble_color_unavailable;
-
-var float autocvar_hud_panel_ammo;
-var vector autocvar_hud_panel_ammo_pos;
-var vector autocvar_hud_panel_ammo_size;
-var string autocvar_hud_panel_ammo_bg;
-var string autocvar_hud_panel_ammo_bg_color;
-var string autocvar_hud_panel_ammo_bg_color_team;
-var string autocvar_hud_panel_ammo_bg_alpha;
-var string autocvar_hud_panel_ammo_bg_border;
-var string autocvar_hud_panel_ammo_bg_padding;
-var float autocvar_hud_panel_ammo_onlycurrent;
-var float autocvar_hud_panel_ammo_iconalign;
-
-var float autocvar_hud_panel_powerups;
-var vector autocvar_hud_panel_powerups_pos;
-var vector autocvar_hud_panel_powerups_size;
-var string autocvar_hud_panel_powerups_bg;
-var string autocvar_hud_panel_powerups_bg_color;
-var string autocvar_hud_panel_powerups_bg_color_team;
-var string autocvar_hud_panel_powerups_bg_alpha;
-var string autocvar_hud_panel_powerups_bg_border;
-var string autocvar_hud_panel_powerups_bg_padding;
-var float autocvar_hud_panel_powerups_flip;
-var float autocvar_hud_panel_powerups_iconalign;
-var float autocvar_hud_panel_powerups_baralign;
-var float autocvar_hud_panel_powerups_progressbar;
-
-var float autocvar_hud_panel_healtharmor;
-var vector autocvar_hud_panel_healtharmor_pos;
-var vector autocvar_hud_panel_healtharmor_size;
-var string autocvar_hud_panel_healtharmor_bg;
-var string autocvar_hud_panel_healtharmor_bg_color;
-var string autocvar_hud_panel_healtharmor_bg_color_team;
-var string autocvar_hud_panel_healtharmor_bg_alpha;
-var string autocvar_hud_panel_healtharmor_bg_border;
-var string autocvar_hud_panel_healtharmor_bg_padding;
-var float autocvar_hud_panel_healtharmor_flip;
-var float autocvar_hud_panel_healtharmor_iconalign;
-var float autocvar_hud_panel_healtharmor_baralign;
-var float autocvar_hud_panel_healtharmor_progressbar;
-
-var float autocvar_hud_panel_notify;
-var vector autocvar_hud_panel_notify_pos;
-var vector autocvar_hud_panel_notify_size;
-var string autocvar_hud_panel_notify_bg;
-var string autocvar_hud_panel_notify_bg_color;
-var string autocvar_hud_panel_notify_bg_color_team;
-var string autocvar_hud_panel_notify_bg_alpha;
-var string autocvar_hud_panel_notify_bg_border;
-var string autocvar_hud_panel_notify_bg_padding;
-var float autocvar_hud_panel_notify_print;
-var float autocvar_hud_panel_notify_time;
-var float autocvar_hud_panel_notify_fadetime;
-var float autocvar_hud_panel_notify_flip;
-
-var float autocvar_hud_panel_timer;
-var vector autocvar_hud_panel_timer_pos;
-var vector autocvar_hud_panel_timer_size;
-var string autocvar_hud_panel_timer_bg;
-var string autocvar_hud_panel_timer_bg_color;
-var string autocvar_hud_panel_timer_bg_color_team;
-var string autocvar_hud_panel_timer_bg_alpha;
-var string autocvar_hud_panel_timer_bg_border;
-var string autocvar_hud_panel_timer_bg_padding;
-var float autocvar_hud_panel_timer_increment;
-
-var float autocvar_hud_panel_radar;
-var vector autocvar_hud_panel_radar_pos;
-var vector autocvar_hud_panel_radar_size;
-var string autocvar_hud_panel_radar_bg;
-var string autocvar_hud_panel_radar_bg_color;
-var string autocvar_hud_panel_radar_bg_color_team;
-var string autocvar_hud_panel_radar_bg_alpha;
-var string autocvar_hud_panel_radar_bg_border;
-var string autocvar_hud_panel_radar_bg_padding;
-
-var float autocvar_hud_panel_score;
-var vector autocvar_hud_panel_score_pos;
-var vector autocvar_hud_panel_score_size;
-var string autocvar_hud_panel_score_bg;
-var string autocvar_hud_panel_score_bg_color;
-var string autocvar_hud_panel_score_bg_color_team;
-var string autocvar_hud_panel_score_bg_alpha;
-var string autocvar_hud_panel_score_bg_border;
-var string autocvar_hud_panel_score_bg_padding;
-
-var float autocvar_hud_panel_racetimer;
-var vector autocvar_hud_panel_racetimer_pos;
-var vector autocvar_hud_panel_racetimer_size;
-var string autocvar_hud_panel_racetimer_bg;
-var string autocvar_hud_panel_racetimer_bg_color;
-var string autocvar_hud_panel_racetimer_bg_color_team;
-var string autocvar_hud_panel_racetimer_bg_alpha;
-var string autocvar_hud_panel_racetimer_bg_border;
-var string autocvar_hud_panel_racetimer_bg_padding;
-
-var float autocvar_hud_panel_vote;
-var vector autocvar_hud_panel_vote_pos;
-var vector autocvar_hud_panel_vote_size;
-var string autocvar_hud_panel_vote_bg;
-var string autocvar_hud_panel_vote_bg_color;
-var string autocvar_hud_panel_vote_bg_color_team;
-var string autocvar_hud_panel_vote_bg_alpha;
-var string autocvar_hud_panel_vote_bg_border;
-var string autocvar_hud_panel_vote_bg_padding;
-var float autocvar_hud_panel_vote_alreadyvoted_alpha;
-
-var float autocvar_hud_panel_modicons;
-var vector autocvar_hud_panel_modicons_pos;
-var vector autocvar_hud_panel_modicons_size;
-var string autocvar_hud_panel_modicons_bg;
-var string autocvar_hud_panel_modicons_bg_color;
-var string autocvar_hud_panel_modicons_bg_color_team;
-var string autocvar_hud_panel_modicons_bg_alpha;
-var string autocvar_hud_panel_modicons_bg_border;
-var string autocvar_hud_panel_modicons_bg_padding;
-
-var float autocvar_hud_panel_pressedkeys;
-var vector autocvar_hud_panel_pressedkeys_pos;
-var vector autocvar_hud_panel_pressedkeys_size;
-var string autocvar_hud_panel_pressedkeys_bg;
-var string autocvar_hud_panel_pressedkeys_bg_color;
-var string autocvar_hud_panel_pressedkeys_bg_color_team;
-var string autocvar_hud_panel_pressedkeys_bg_alpha;
-var string autocvar_hud_panel_pressedkeys_bg_border;
-var string autocvar_hud_panel_pressedkeys_bg_padding;
-var float autocvar_hud_panel_pressedkeys_aspect;
-
-var float autocvar_hud_panel_chat;
-var vector autocvar_hud_panel_chat_pos;
-var vector autocvar_hud_panel_chat_size;
-var string autocvar_hud_panel_chat_bg;
-var string autocvar_hud_panel_chat_bg_color;
-var string autocvar_hud_panel_chat_bg_color_team;
-var string autocvar_hud_panel_chat_bg_alpha;
-var string autocvar_hud_panel_chat_bg_border;
-var string autocvar_hud_panel_chat_bg_padding;
-
-var float autocvar_hud_panel_engineinfo;
-var vector autocvar_hud_panel_engineinfo_pos;
-var vector autocvar_hud_panel_engineinfo_size;
-var string autocvar_hud_panel_engineinfo_bg;
-var string autocvar_hud_panel_engineinfo_bg_color;
-var string autocvar_hud_panel_engineinfo_bg_color_team;
-var string autocvar_hud_panel_engineinfo_bg_alpha;
-var string autocvar_hud_panel_engineinfo_bg_border;
-var string autocvar_hud_panel_engineinfo_bg_padding;
-
-var float autocvar_hud_panel_infomessages;
-var vector autocvar_hud_panel_infomessages_pos;
-var vector autocvar_hud_panel_infomessages_size;
-var string autocvar_hud_panel_infomessages_bg;
-var string autocvar_hud_panel_infomessages_bg_color;
-var string autocvar_hud_panel_infomessages_bg_color_team;
-var string autocvar_hud_panel_infomessages_bg_alpha;
-var string autocvar_hud_panel_infomessages_bg_border;
-var string autocvar_hud_panel_infomessages_bg_padding;
-var float autocvar_hud_panel_infomessages_flip;
-
-var float autocvar_scoreboard_border_thickness;
-
-var float autocvar_cl_allow_uid2name;
+var float autocvar_cl_casings_ticrate = 0.1;
+float autocvar_cl_db_saveasdump;
+float autocvar_cl_deathscoreboard;
+float autocvar_cl_effects_lightningarc_branchfactor_add;
+float autocvar_cl_effects_lightningarc_branchfactor_start;
+float autocvar_cl_effects_lightningarc_drift_end;
+float autocvar_cl_effects_lightningarc_drift_start;
+float autocvar_cl_effects_lightningarc_segmentlength;
+float autocvar_cl_effects_lightningarc_simple;
+float autocvar_cl_gentle;
+float autocvar_cl_gentle_damage;
+float autocvar_cl_gentle_gibs;
+float autocvar_cl_gentle_messages;
+var float autocvar_cl_gibs_damageforcescale = 3.5;
+var float autocvar_cl_gibs_lifetime = 14;
+var float autocvar_cl_gibs_maxcount = 100;
+var float autocvar_cl_gibs_sloppy = 1;
+var float autocvar_cl_gibs_ticrate = 0.1;
+var float autocvar_cl_gibs_velocity_random = 1;
+var float autocvar_cl_gibs_velocity_scale = 1;
+float autocvar_cl_gibs_velocity_up;
+float autocvar_cl_gunalign;
+float autocvar_cl_hidewaypoints;
+float autocvar_cl_lockview;
+float autocvar_cl_nogibs;
+float autocvar_cl_notify_carried_items;
+float autocvar_cl_particlegibs;
+float autocvar_cl_particles_oldnexbeam;
+float autocvar_cl_particles_quality;
+float autocvar_cl_projectiles_sloppy;
+float autocvar_cl_readpicture_force;
+float autocvar_cl_reticle_item_nex;
+float autocvar_cl_reticle_item_normal;
+float autocvar_cl_reticle_stretch;
+float autocvar_cl_showacceleration;
+float autocvar_cl_showacceleration_alpha;
+string autocvar_cl_showacceleration_color;
+float autocvar_cl_showacceleration_color_custom;
+float autocvar_cl_showacceleration_position;
+float autocvar_cl_showacceleration_scale;
+float autocvar_cl_showacceleration_size;
+float autocvar_cl_showacceleration_z;
+float autocvar_cl_showspeed;
+float autocvar_cl_showspeed_position;
+float autocvar_cl_showspeed_size;
+float autocvar_cl_showspeed_unit;
+float autocvar_cl_showspeed_z;
+float autocvar_cl_sound_maptime_warning;
+float autocvar_cl_stripcolorcodes;
+var float autocvar_cl_vehicle_spiderbot_cross_alpha = 0.6;
+var float autocvar_cl_vehicle_spiderbot_cross_size = 1;
+float autocvar_cl_velocityzoom;
+var float autocvar_cl_velocityzoomtime = 0.3;
+string autocvar_cl_weaponpriority;
+float autocvar_cl_zoomfactor;
+float autocvar_cl_zoomsensitivity;
+float autocvar_cl_zoomspeed;
+float autocvar_con_chat;
+float autocvar_con_chatpos;
+float autocvar_con_chatsize;
+float autocvar_con_chattime;
+float autocvar_con_notify;
+float autocvar_con_notifysize;
+string autocvar_crosshair;
+float autocvar_crosshair_alpha;
+string autocvar_crosshair_color;
+float autocvar_crosshair_color_per_weapon;
+float autocvar_crosshair_dot;
+float autocvar_crosshair_dot_alpha;
+string autocvar_crosshair_dot_color;
+float autocvar_crosshair_dot_size;
+float autocvar_crosshair_effect_scalefade;
+float autocvar_crosshair_effect_speed;
+float autocvar_crosshair_hitindication;
+string autocvar_crosshair_hitindication_color;
+float autocvar_crosshair_hitindication_speed;
+float autocvar_crosshair_hittest;
+float autocvar_crosshair_hittest_blur;
+float autocvar_crosshair_hittest_showimpact;
+float autocvar_crosshair_per_weapon;
+float autocvar_crosshair_pickup;
+float autocvar_crosshair_pickup_speed;
+float autocvar_crosshair_ring_sniperrifle_alpha;
+float autocvar_crosshair_ring_nex_currentcharge_movingavg_rate;
+float autocvar_crosshair_ring_nex_currentcharge_scale;
+float autocvar_crosshair_ring_nex_inner_alpha;
+float autocvar_crosshair_ring_nex_inner_color_blue;
+float autocvar_crosshair_ring_nex_inner_color_green;
+float autocvar_crosshair_ring_nex_inner_color_red;
+float autocvar_crosshair_ring_nex_outer_alpha;
+float autocvar_crosshair_ring_size;
+float autocvar_crosshair_size;
+float autocvar_ekg;
+float autocvar_fov;
+float autocvar_g_balance_tuba_attenuation;
+float autocvar_g_balance_tuba_fadetime;
+float autocvar_g_balance_tuba_volume;
+float autocvar_g_warmup_limit;
+var float autocvar_g_waypointsprite_alpha = 1;
+var float autocvar_g_waypointsprite_crosshairfadealpha = 1;
+float autocvar_g_waypointsprite_crosshairfadedistance;
+var float autocvar_g_waypointsprite_crosshairfadescale = 1;
+float autocvar_g_waypointsprite_distancealphaexponent;
+var float autocvar_g_waypointsprite_distancefadealpha = 1;
+var float autocvar_g_waypointsprite_distancefadedistancemultiplier = 1;
+var float autocvar_g_waypointsprite_distancefadescale = 1;
+var float autocvar_g_waypointsprite_edgefadealpha = 1;
+float autocvar_g_waypointsprite_edgefadedistance;
+var float autocvar_g_waypointsprite_edgefadescale = 1;
+float autocvar_g_waypointsprite_minalpha;
+float autocvar_g_waypointsprite_minscale;
+float autocvar_g_waypointsprite_normdistance;
+var float autocvar_g_waypointsprite_scale = 1;
+float autocvar_g_waypointsprite_timealphaexponent;
+var float autocvar_hud_colorflash_alpha = 0.5;
+float autocvar_hud_configure_bg_minalpha;
+float autocvar_hud_configure_checkcollisions;
+float autocvar_hud_configure_grid;
+float autocvar_hud_configure_grid_alpha;
+float autocvar_hud_configure_grid_xsize;
+float autocvar_hud_configure_grid_ysize;
+float autocvar_hud_configure_teamcolorforced;
+float autocvar_hud_contents;
+float autocvar_hud_contents_factor;
+float autocvar_hud_contents_fadeintime;
+float autocvar_hud_contents_fadeouttime;
+float autocvar_hud_contents_lava_alpha;
+string autocvar_hud_contents_lava_color;
+float autocvar_hud_contents_slime_alpha;
+string autocvar_hud_contents_slime_color;
+float autocvar_hud_contents_water_alpha;
+string autocvar_hud_contents_water_color;
+float autocvar_hud_damage;
+string autocvar_hud_damage_color;
+float autocvar_hud_damage_factor;
+float autocvar_hud_damage_fade_rate;
+float autocvar_hud_damage_gentle_alpha_multiplier;
+string autocvar_hud_damage_gentle_color;
+float autocvar_hud_damage_maxalpha;
+float autocvar_hud_damage_pain_threshold;
+float autocvar_hud_damage_pain_threshold_lower;
+float autocvar_hud_damage_pain_threshold_lower_health;
+float autocvar_hud_damage_pain_threshold_pulsating_min;
+float autocvar_hud_damage_pain_threshold_pulsating_period;
+string autocvar_hud_dock;
+float autocvar_hud_dock_alpha;
+string autocvar_hud_dock_color;
+float autocvar_hud_dock_color_team;
+float autocvar_hud_panel_ammo;
+float autocvar_hud_panel_ammo_iconalign;
+float autocvar_hud_panel_ammo_maxammo;
+float autocvar_hud_panel_ammo_onlycurrent;
+float autocvar_hud_panel_ammo_progressbar;
+string autocvar_hud_panel_ammo_progressbar_name;
+float autocvar_hud_panel_ammo_progressbar_xoffset;
+float autocvar_hud_panel_ammo_text;
+string autocvar_hud_panel_bg;
+float autocvar_hud_panel_bg_alpha;
+float autocvar_hud_panel_bg_border;
+vector autocvar_hud_panel_bg_color;
+float autocvar_hud_panel_bg_color_team;
+float autocvar_hud_panel_bg_padding;
+float autocvar_hud_panel_chat;
+float autocvar_hud_panel_engineinfo;
+float autocvar_hud_panel_engineinfo_framecounter_decimals;
+float autocvar_hud_panel_engineinfo_framecounter_time;
+float autocvar_hud_panel_fg_alpha;
+float autocvar_hud_panel_healtharmor;
+float autocvar_hud_panel_healtharmor_baralign;
+float autocvar_hud_panel_healtharmor_flip;
+float autocvar_hud_panel_healtharmor_iconalign;
+float autocvar_hud_panel_healtharmor_maxarmor;
+float autocvar_hud_panel_healtharmor_maxhealth;
+float autocvar_hud_panel_healtharmor_progressbar;
+string autocvar_hud_panel_healtharmor_progressbar_armor;
+string autocvar_hud_panel_healtharmor_progressbar_health;
+float autocvar_hud_panel_healtharmor_text;
+float autocvar_hud_panel_infomessages;
+float autocvar_hud_panel_infomessages_flip;
+float autocvar_hud_panel_modicons;
+float autocvar_hud_panel_notify;
+float autocvar_hud_panel_notify_fadetime;
+float autocvar_hud_panel_notify_flip;
+float autocvar_hud_panel_notify_fontsize;
+float autocvar_hud_panel_notify_print;
+float autocvar_hud_panel_notify_time;
+float autocvar_hud_panel_powerups;
+float autocvar_hud_panel_powerups_baralign;
+float autocvar_hud_panel_powerups_flip;
+float autocvar_hud_panel_powerups_iconalign;
+float autocvar_hud_panel_powerups_progressbar;
+string autocvar_hud_panel_powerups_progressbar_shield;
+string autocvar_hud_panel_powerups_progressbar_strength;
+float autocvar_hud_panel_powerups_text;
+float autocvar_hud_panel_pressedkeys;
+float autocvar_hud_panel_pressedkeys_aspect;
+float autocvar_hud_panel_racetimer;
+float autocvar_hud_panel_radar;
+float autocvar_hud_panel_radar_foreground_alpha;
+float autocvar_hud_panel_radar_rotation;
+float autocvar_hud_panel_radar_scale;
+float autocvar_hud_panel_radar_zoommode;
+float autocvar_hud_panel_score;
+float autocvar_hud_panel_timer;
+float autocvar_hud_panel_timer_increment;
+float autocvar_hud_panel_vote;
+float autocvar_hud_panel_vote_alreadyvoted_alpha;
+string autocvar_hud_panel_vote_bg_alpha;
+float autocvar_hud_panel_weapons;
+float autocvar_hud_panel_weapons_accuracy;
+float autocvar_hud_panel_weapons_ammo;
+float autocvar_hud_panel_weapons_ammo_alpha;
+string autocvar_hud_panel_weapons_ammo_color;
+float autocvar_hud_panel_weapons_ammo_full_cells;
+float autocvar_hud_panel_weapons_ammo_full_fuel;
+float autocvar_hud_panel_weapons_ammo_full_nails;
+float autocvar_hud_panel_weapons_ammo_full_rockets;
+float autocvar_hud_panel_weapons_ammo_full_shells;
+float autocvar_hud_panel_weapons_aspect;
+float autocvar_hud_panel_weapons_complainbubble;
+string autocvar_hud_panel_weapons_complainbubble_color_donthave;
+string autocvar_hud_panel_weapons_complainbubble_color_outofammo;
+string autocvar_hud_panel_weapons_complainbubble_color_unavailable;
+float autocvar_hud_panel_weapons_complainbubble_fadetime;
+float autocvar_hud_panel_weapons_complainbubble_padding;
+float autocvar_hud_panel_weapons_complainbubble_time;
+var float autocvar_hud_panel_weapons_fade = 1;
+float autocvar_hud_panel_weapons_label;
+float autocvar_hud_panel_weapons_timeout;
+float autocvar_hud_panel_weapons_timeout_effect;
+float autocvar_hud_progressbar_alpha;
+float autocvar_hud_showbinds;
+float autocvar_hud_showbinds_limit;
+string autocvar_hud_skin;
+float autocvar_loddebug;
+float autocvar_menu_mouse_speed;
+string autocvar_menu_skin;
+float autocvar_r_fakelight;
+float autocvar_r_fullbright;
+float autocvar_r_letterbox;
+float autocvar_scoreboard_accuracy;
+float autocvar_scoreboard_accuracy_doublerows;
+float autocvar_scoreboard_alpha_bg;
+var float autocvar_scoreboard_alpha_fg = 1.0;
+var float autocvar_scoreboard_alpha_name = 0.9;
+var float autocvar_scoreboard_alpha_name_self = 1;
+float autocvar_scoreboard_bg_scale;
+float autocvar_scoreboard_border_thickness;
+float autocvar_scoreboard_color_bg_b;
+float autocvar_scoreboard_color_bg_g;
+float autocvar_scoreboard_color_bg_r;
+float autocvar_scoreboard_color_bg_team;
+string autocvar_scoreboard_columns;
+var float autocvar_scoreboard_fadeinspeed = 10;
+var float autocvar_scoreboard_fadeoutspeed = 5;
+float autocvar_scoreboard_highlight;
+var float autocvar_scoreboard_highlight_alpha = 0.10;
+var float autocvar_scoreboard_highlight_alpha_self = 0.25;
+float autocvar_scoreboard_offset_left;
+float autocvar_scoreboard_offset_right;
+float autocvar_scr_centerpos;
+float autocvar_scr_centersize;
+float autocvar_scr_centertime;
+float autocvar_v_flipped;
+float autocvar_vid_conheight;
+float autocvar_vid_conwidth;
+float autocvar_vid_pixelheight;
+float autocvar_viewsize;
+float autocvar_crosshair_color_by_health;
+float autocvar_cl_hitsound;
+float autocvar_cl_hitsound_antispam_time;
e.bgmscriptline = e.bgmscriptline0 = i;
if(i >= bgmscriptbufsize)
{
- print("ERROR: bgmscript does not define ", e.bgmscript, "\n");
+ print(sprintf("ERROR: bgmscript does not define %s\n", e.bgmscript));
e.bgmscript = "";
}
}
if(e.bgmscript == "")
return 1;
- if(cvar("bgmvolume") <= 0)
+ if(autocvar_bgmvolume <= 0)
return -1;
e.just_toggled = FALSE;
if(bgmtime < e.bgmscripttime)
{
- //print("reset ", e.bgmscript, "\n");
amp = GetCurrentAmplitude(e, e.bgmscripttime - e.bgmscriptstatetime + drawframetime);
e.bgmscriptline = e.bgmscriptline0;
casing.angles_z = ReadByte() * 360 / 256;
casing.drawmask = MASK_NORMAL;
- if(cvar("cl_casings") && isNew) {
+ if(autocvar_cl_casings && isNew) {
casing.draw = Casing_Draw;
casing.move_origin = casing.origin;
casing.move_velocity = casing.velocity + 2 * prandomvec();
{
case 1:
setmodel(casing, "models/casing_shell.mdl");
- casing.cnt = time + cvar("cl_casings_shell_time");
+ casing.cnt = time + autocvar_cl_casings_shell_time;
break;
default:
setmodel(casing, "models/casing_bronze.mdl");
- casing.cnt = time + cvar("cl_casings_bronze_time");
+ casing.cnt = time + autocvar_cl_casings_bronze_time;
break;
}
else
Casing_Delete();
- RubbleLimit("casing", cvar_or("cl_casings_maxcount",100), Casing_Delete);
+ RubbleLimit("casing", autocvar_cl_casings_maxcount, Casing_Delete);
}
void Casings_Precache()
const float STAT_FRAGLIMIT = 235;
const float STAT_TIMELIMIT = 236;
const float STAT_MOVEVARS_GRAVITY = 242;
-const float STAT_MOVEVARS_MAXSPEED = 244;
// Sound Constants
//const float CHAN_AUTO = 0;
-//include "main.qh"
+#ifdef CTF_EXAMPLE
+
// NOTE: This file contains lots of debugging stuff
// it is not really used... can be seen as another sample...
color = getplayerkey(player_localentnum-1, "topcolor");
if(getstati(STAT_CTF_STATE) == CTF_STATE_COMMANDER) {
- drawstring(ps, "\x1D\x1E\x1E\x1E\x1E Order Menu \x1E\x1E\x1E\x1E\x1F", '8 8 0', '1 1 0', 1, 0); ps += po;
- drawstring(ps, strcat("Order: ", ctf_temp_1), '8 8 0', '1 1 0', 1, 0); ps += po;
- drawcolorcodedstring(ps, "1) ^3previous page", '8 8 0', 1, 0); ps += po;
- drawcolorcodedstring(ps, "2) ^3next page", '8 8 0', 1, 0); ps += po;
+ drawstring(ps, _("----- Order Menu -----"), '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, sprintf(_("Order: %s"), ctf_temp_1), '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawcolorcodedstring(ps, _("1) ^3previous page"), '8 8 0', 1, 0); ps += po;
+ drawcolorcodedstring(ps, _("2) ^3next page"), '8 8 0', 1, 0); ps += po;
for((n = 2), (p = i = 0); i < maxclients && n > 0; ++i) {
frags = getplayerkey(i, "frags");
if(!frags || (i+1) == player_localentnum)
drawcolorcodedstring(ps, strcat(ftos(n), ") ", GetPlayerName(i), " : ", ftos(getstatf(STAT_CTF_STATE))), '8 8 0', 1, 0); ps += po;
}
}
- drawstring(ps, "ESC) Exit Menu", '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, _("ESC) Exit Menu"), '8 8 0', '1 1 0', 1, 0); ps += po;
} else {
menu_close();
}
}
}
if(n == 0) {
- //print(strcat("Issuing order to: ", ftos(i+1), "\n"));
+ //print(sprintf(_("Issuing order to: %d\n"), i+1));
//print(strcat("cmd order #", ftos(i+1), " ", ctf_temp_1, ";\n"));
localcmd(strcat("\ncmd order #", ftos(i+1), " ", ctf_temp_1, ";"));
} else {
- print(strcat("Couldn't find player ", ftos(chose), "\n"));
+ print(sprintf(_("Couldn't find player %d\n"), chose));
}
return TRUE;
} else if(nSecondary == K_ESCAPE) {
strunzone(ctf_temp_1);
menu_close();
} else {
- //print(strcat("Menu action ", arg, " does not exist.\n"));
+ //print(sprintf(_("Menu action %s does not exist.\n"), arg));
return FALSE;
}
return TRUE;
po = '0 8 0';
if(getstati(STAT_CTF_STATE) == CTF_STATE_COMMANDER) {
- drawstring(ps, "\x1D\x1E\x1E\x1E\x1E Command Menu \x1E\x1E\x1E\x1E\x1F", '8 8 0', '1 1 0', 1, 0); ps += po;
- drawstring(ps, "Issue orders:", '8 8 0', '1 1 0', 1, 0); ps += po;
- drawstring(ps, " 1) Attack ", '8 8 0', '1 1 0', 1, 0);
+ drawstring(ps, _("----- Command Menu -----"), '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, _("Issue orders:"), '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, _(" 1) Attack"), '8 8 0', '1 1 0', 1, 0);
drawstring(ps + '80 0 0', " \x0F", '8 8 0', '1 1 1', 1, 0); ps += po;
- drawstring(ps, " 2) Defend \x0E", '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, strcat(_(" 2) Defend"), " \x0E"), '8 8 0', '1 1 0', 1, 0); ps += po;
ps += po;
- drawstring(ps, "3) Resign from command.", '8 8 0', '1 1 0', 1, 0); ps += po;
- drawstring(ps, "ESC) Exit Menu", '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, _("3) Resign from command."), '8 8 0', '1 1 0', 1, 0); ps += po;
+ drawstring(ps, _("ESC) Exit Menu"), '8 8 0', '1 1 0', 1, 0); ps += po;
} else {
menu_close();
}
} else if(stat == CTF_STATE_DEFEND) {
drawpic('0 0 0', "gfx/ctf_ic_def.tga", '64 64 0', '1 1 1', 1, 0);
} else if(stat == CTF_STATE_COMMANDER) {
- drawstring('0 0 0', "You're commander!", '8 8 0', '1 1 1', 1, 0);
+ drawstring('0 0 0', _("You're commander!"), '8 8 0', '1 1 1', 1, 0);
} else if(stat < 0) {
} else {
- drawstring('0 0 0', "Awaiting orders...", '8 8 0', '1 1 1', 0.5, 0);
+ drawstring('0 0 0', _("Awaiting orders..."), '8 8 0', '1 1 1', 0.5, 0);
}
};
+
+#endif
thisforce = forcemul * force;
}
- //print("check ", ftos(num_for_edict(self)), " ", self.classname, "\n");
- //print(ftos(self.damageforcescale), "\n");
- //print(vtos(thisforce), "\n");
if(self.damageforcescale)
if(vlen(thisforce))
{
self.move_velocity = self.move_velocity + self.damageforcescale * thisforce;
self.move_flags &~= FL_ONGROUND;
- //print("pushed ", ftos(num_for_edict(self)), " loose\n");
}
if(w_issilent)
dirnew = normalize(direction * (1 - drift) + randomvec() * drift);
pos = pos_l + dirnew * steplength;
te_lightning1(world,pos_l,pos);
- //b_make(pos_l, pos,"particles/lightning2",0.25,64);
if(random() < branchfactor)
cl_effetcs_lightningarc(pos, pos + (dirnew * length * 0.25),seglength,drifts,drifte,min(branchfactor + branchfactor_add,1),branchfactor_add);
pos_l = pos;
}
te_lightning1(world,pos_l,to);
- //b_make(pos_l, to,"particles/lightning2",0.25,64);
}
else
te_lightning1(world,from,to);
- //b_make(from, to,"particles/lightning2",0.25,64);
}
from_x = ReadCoord(); from_y = ReadCoord(); from_z = ReadCoord();
to_x = ReadCoord(); to_y = ReadCoord(); to_z = ReadCoord();
- if(cvar("cl_effects_lightningarc_simple"))
+ if(autocvar_cl_effects_lightningarc_simple)
{
te_lightning1(world,from,to);
}
{
float seglength, drifts, drifte, branchfactor, branchfactor_add;
- seglength = cvar("cl_effects_lightningarc_segmentlength");
- drifts = cvar("cl_effects_lightningarc_drift_start");
- drifte = cvar("cl_effects_lightningarc_drift_end");
- branchfactor = cvar("cl_effects_lightningarc_branchfactor_start");
- branchfactor = cvar("cl_effects_lightningarc_branchfactor_add");
+ seglength = autocvar_cl_effects_lightningarc_segmentlength;
+ drifts = autocvar_cl_effects_lightningarc_drift_start;
+ drifte = autocvar_cl_effects_lightningarc_drift_end;
+ branchfactor = autocvar_cl_effects_lightningarc_branchfactor_start;
+ branchfactor = autocvar_cl_effects_lightningarc_branchfactor_add;
cl_effetcs_lightningarc(from,to,seglength,drifts,drifte,branchfactor,branchfactor_add);
}
void new_te_bloodshower (float ef, vector org, float explosionspeed, float howmany)
{
float i, pmod;
- pmod = cvar("cl_particles_quality");
+ pmod = autocvar_cl_particles_quality;
for (i = 0; i < 250 * pmod; ++i)
pointparticles(ef, org, randomvec() * explosionspeed, howmany / 250);
}
gib.move_touch = SUB_RemoveOnNoImpact;
gib.move_origin = gib.origin = org;
- gib.move_velocity = vconst * cvar_or("cl_gibs_velocity_scale", 1) + vrand * cvar_or("cl_gibs_velocity_random", 1) + '0 0 1' * cvar("cl_gibs_velocity_up");
+ gib.move_velocity = vconst * autocvar_cl_gibs_velocity_scale + vrand * autocvar_cl_gibs_velocity_random + '0 0 1' * autocvar_cl_gibs_velocity_up;
gib.move_avelocity = prandomvec() * vlen(gib.move_velocity);
gib.move_time = time;
- gib.damageforcescale = cvar_or("cl_gibs_damageforcescale", 3.5);
+ gib.damageforcescale = autocvar_cl_gibs_damageforcescale;
- gib.nextthink = time + cvar_or("cl_gibs_lifetime", 14) * (1 + prandom() * 0.15);
+ gib.nextthink = time + autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15);
gib.drawmask = MASK_NORMAL;
- RubbleLimit("gib", cvar_or("cl_gibs_maxcount",100), Gib_Delete);
+ RubbleLimit("gib", autocvar_cl_gibs_maxcount, Gib_Delete);
}
void Ent_GibSplash(float isNew)
org_z = ReadShort() * 4 + 2;
vel = decompressShortVector(ReadShort());
- if(autocvar_cl_gentle_gibs || cvar("cl_gentle"))
+ float cl_gentle_gibs = autocvar_cl_gentle_gibs;
+ if(cl_gentle_gibs || autocvar_cl_gentle)
type |= 0x80; // set gentle bit
if(type & 0x80)
{
- if(autocvar_cl_gentle_gibs == 2)
+ if(cl_gentle_gibs == 2)
gentle_prefix = "";
- else if(autocvar_cl_gentle_gibs == 3)
+ else if(cl_gentle_gibs == 3)
gentle_prefix = "happy_";
else
gentle_prefix = "morphed_";
}
- else if(cvar("cl_particlegibs"))
+ else if(autocvar_cl_particlegibs)
{
type |= 0x80;
gentle_prefix = "particlegibs_";
}
- if not(autocvar_cl_gentle_gibs || cvar("cl_gentle"))
- amount *= 1 - cvar("cl_nogibs");
+ if not(cl_gentle_gibs || autocvar_cl_gentle)
+ amount *= 1 - autocvar_cl_nogibs;
- if(cvar("ekg"))
+ if(autocvar_ekg)
amount *= 5;
if(amount <= 0 || !isNew)
// direction is perpendicular to the view normal, and perpendicular to the axis
thickdir = normalize(cross(axis, vieworg - from));
-/*
- print("from ", vtos(from), "\n");
- print("to ", vtos(to), "\n");
- print("org ", vtos(view_origin), "\n");
- print("dir ", vtos(thickdir), "\n");
-*/
-
A = from - thickdir * (thickness / 2);
B = from + thickdir * (thickness / 2);
C = to + thickdir * (thickness / 2);
InterpolateOrigin_Do();
- s = cvar("cl_gunalign");
+ s = autocvar_cl_gunalign;
if(s != 1 && s != 2 && s != 4)
s = 3; // default value
--s;
// 1/4 height: bottom part
void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
{
- if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border
+ if (theBorderSize_x < 0 && theBorderSize_y < 0) // draw whole image as it is
+ {
+ drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0);
+ return;
+ }
+ if (theBorderSize_x == 0 && theBorderSize_y == 0) // no border
{
// draw only the central part
drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0);
centerprint_expire = min(centerprint_expire, time); // if any of the returns happens, this message will fade out
- if(cvar("scr_centertime") <= 0)
+ if(autocvar_scr_centertime <= 0)
return;
if(strMessage == "")
h = centerprint_fontsize_y*hcount;
havail = vid_conheight;
- if(cvar("con_chatpos") < 0)
- havail -= (-cvar("con_chatpos") + cvar("con_chat")) * cvar("con_chatsize"); // avoid overlapping chat
+ if(autocvar_con_chatpos < 0)
+ havail -= (-autocvar_con_chatpos + autocvar_con_chat) * autocvar_con_chatsize; // avoid overlapping chat
if(havail > vid_conheight - 70)
havail = vid_conheight - 70; // avoid overlapping HUD
centerprint_num = i;
- centerprint_expire = time + cvar("scr_centertime");
+ centerprint_expire = time + autocvar_scr_centertime;
}
void HUD_DrawCenterPrint (void)
sz = 0.8 + (a / 5);
- if(centerprint_num * cvar("scr_centersize") > 24 && scoreboard_active) // 24 = height of Scoreboard text
+ if(centerprint_num * autocvar_scr_centersize > 24 && scoreboard_active) // 24 = height of Scoreboard text
centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y;
pos = centerprint_start;
{
ts = centerprint_messages[i];
drawfontscale = sz * '1 1 0';
- drawfont = hud_bigfont;
pos_x = (vid_conwidth - stringwidth(ts, TRUE, centerprint_fontsize)) * 0.5;
if (ts != "")
{
// half height for empty lines looks better
pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
drawfontscale = '1 1 0';
- drawfont = hud_font;
}
}
// return the string of the given race place
string race_PlaceName(float pos) {
if(pos == 1)
- return "1st";
+ return _("1st");
else if(pos == 2)
- return "2nd";
+ return _("2nd");
else if(pos == 3)
- return "3rd";
+ return _("3rd");
else
- return strcat(ftos(pos), "th");
+ return sprintf(_("%dth"), pos);
}
// return the string of the onscreen race timer
if(lapdelta > 0)
{
- lapstr = strcat(" (-", ftos(lapdelta), "L)");
+ lapstr = sprintf(_(" (-%dL)"), lapdelta);
col = "^2";
}
else if(lapdelta < 0)
{
- lapstr = strcat(" (+", ftos(-lapdelta), "L)");
+ lapstr = sprintf(_(" (+%dL)"), -lapdelta);
col = "^1";
}
}
col = "^7";
if(cp == 254)
- cpname = "Start line";
+ cpname = _("Start line");
else if(cp == 255)
- cpname = "Finish line";
+ cpname = _("Finish line");
else if(cp)
- cpname = strcat("Intermediate ", ftos(cp));
+ cpname = sprintf(_("Intermediate %d"), cp);
else
- cpname = "Finish line";
+ cpname = _("Finish line");
if(histime < 0)
return strcat(col, cpname);
else if(hisname == "")
- return strcat(col, cpname, " (", timestr, ")");
+ return strcat(col, sprintf(_("%s (%s)"), cpname, timestr));
else
- return strcat(col, cpname, " (", timestr, " ", strcat(hisname, col, lapstr), ")");
+ return strcat(col, sprintf(_("%s (%s %s)"), cpname, timestr, strcat(hisname, col, lapstr)));
}
// Check if the given name already exist in race rankings? In that case, where? (otherwise return 0)
==================
*/
+#define HUD_Write(s) fputs(fh, s)
+// q: quoted, n: not quoted
+#define HUD_Write_Cvar_n(cvar) HUD_Write(strcat("seta ", cvar, " ", cvar_string(cvar), "\n"))
+#define HUD_Write_Cvar_q(cvar) HUD_Write(strcat("seta ", cvar, " \"", cvar_string(cvar), "\"\n"))
+#define HUD_Write_PanelCvar_n(cvar_suf) HUD_Write_Cvar_n(strcat("hud_panel_", panel_name, cvar_suf))
+#define HUD_Write_PanelCvar_q(cvar_suf) HUD_Write_Cvar_q(strcat("hud_panel_", panel_name, cvar_suf))
// Save the config
void HUD_Panel_ExportCfg(string cfgname)
{
float fh;
- fh = fopen(strcat("hud_", autocvar_hud_skin, "_", cfgname, ".cfg"), FILE_WRITE);
+ string filename = strcat("hud_", autocvar_hud_skin, "_", cfgname, ".cfg");
+ fh = fopen(filename, FILE_WRITE);
if(fh >= 0)
{
- fputs(fh, strcat("seta hud_skin \"", cvar_string("hud_skin"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg \"", cvar_string("hud_panel_bg"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg_color \"", cvar_string("hud_panel_bg_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg_color_team \"", cvar_string("hud_panel_bg_color_team"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg_alpha \"", cvar_string("hud_panel_bg_alpha"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg_border \"", cvar_string("hud_panel_bg_border"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_bg_padding \"", cvar_string("hud_panel_bg_padding"), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_fg_alpha \"", cvar_string("hud_panel_fg_alpha"), "\"", "\n"));
- fputs(fh, "\n");
-
- fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n"));
- fputs(fh, strcat("seta hud_dock_color \"", cvar_string("hud_dock_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_dock_color_team \"", cvar_string("hud_dock_color_team"), "\"", "\n"));
- fputs(fh, strcat("seta hud_dock_alpha \"", cvar_string("hud_dock_alpha"), "\"", "\n"));
- fputs(fh, "\n");
-
- fputs(fh, strcat("seta hud_progressbar_alpha \"", cvar_string("hud_progressbar_alpha"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_strength_color \"", cvar_string("hud_progressbar_strength_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_shield_color \"", cvar_string("hud_progressbar_shield_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_health_color \"", cvar_string("hud_progressbar_health_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_armor_color \"", cvar_string("hud_progressbar_armor_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_fuel_color \"", cvar_string("hud_progressbar_fuel_color"), "\"", "\n"));
- fputs(fh, strcat("seta hud_progressbar_nexball_color \"", cvar_string("hud_progressbar_nexball_color"), "\"", "\n"));
- fputs(fh, "\n");
-
- fputs(fh, strcat("seta _hud_panelorder \"", cvar_string("_hud_panelorder"), "\"", "\n"));
- fputs(fh, "\n");
-
- fputs(fh, strcat("seta hud_configure_grid \"", cvar_string("hud_configure_grid"), "\"", "\n"));
- fputs(fh, strcat("seta hud_configure_grid_xsize \"", cvar_string("hud_configure_grid_xsize"), "\"", "\n"));
- fputs(fh, strcat("seta hud_configure_grid_ysize \"", cvar_string("hud_configure_grid_ysize"), "\"", "\n"));
- fputs(fh, "\n");
-
- fputs(fh, strcat("seta scr_centerpos \"", cvar_string("scr_centerpos"), "\"", "\n"));
- fputs(fh, "\n");
+ HUD_Write_Cvar_q("hud_skin");
+ HUD_Write_Cvar_q("hud_panel_bg");
+ HUD_Write_Cvar_q("hud_panel_bg_color");
+ HUD_Write_Cvar_q("hud_panel_bg_color_team");
+ HUD_Write_Cvar_q("hud_panel_bg_alpha");
+ HUD_Write_Cvar_q("hud_panel_bg_border");
+ HUD_Write_Cvar_q("hud_panel_bg_padding");
+ HUD_Write_Cvar_q("hud_panel_fg_alpha");
+ HUD_Write("\n");
+
+ HUD_Write_Cvar_q("hud_dock");
+ HUD_Write_Cvar_q("hud_dock_color");
+ HUD_Write_Cvar_q("hud_dock_color_team");
+ HUD_Write_Cvar_q("hud_dock_alpha");
+ HUD_Write("\n");
+
+ HUD_Write_Cvar_q("hud_progressbar_alpha");
+ HUD_Write_Cvar_q("hud_progressbar_strength_color");
+ HUD_Write_Cvar_q("hud_progressbar_shield_color");
+ HUD_Write_Cvar_q("hud_progressbar_health_color");
+ HUD_Write_Cvar_q("hud_progressbar_armor_color");
+ HUD_Write_Cvar_q("hud_progressbar_fuel_color");
+ HUD_Write_Cvar_q("hud_progressbar_nexball_color");
+ HUD_Write("\n");
+
+ HUD_Write_Cvar_q("_hud_panelorder");
+ HUD_Write("\n");
+
+ HUD_Write_Cvar_q("hud_configure_grid");
+ HUD_Write_Cvar_q("hud_configure_grid_xsize");
+ HUD_Write_Cvar_q("hud_configure_grid_ysize");
+ HUD_Write("\n");
+
+ HUD_Write_Cvar_q("scr_centerpos");
+ HUD_Write("\n");
// common cvars for all panels
float i;
{
HUD_Panel_GetName(i);
- fputs(fh, strcat("seta hud_panel_", panel_name, " ", cvar_string(strcat("hud_panel_", panel_name)), "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_pos \"", cvar_string(strcat("hud_panel_", panel_name, "_pos")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_size \"", cvar_string(strcat("hud_panel_", panel_name, "_size")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg \"", cvar_string(strcat("hud_panel_", panel_name, "_bg")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_color \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_color")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_color_team \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_color_team")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_alpha")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_border \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_border")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_padding \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_padding")), "\"", "\n"));
+ HUD_Write_PanelCvar_n("");
+ HUD_Write_PanelCvar_q("_pos");
+ HUD_Write_PanelCvar_q("_size");
+ HUD_Write_PanelCvar_q("_bg");
+ HUD_Write_PanelCvar_q("_bg_color");
+ HUD_Write_PanelCvar_q("_bg_color_team");
+ HUD_Write_PanelCvar_q("_bg_alpha");
+ HUD_Write_PanelCvar_q("_bg_border");
+ HUD_Write_PanelCvar_q("_bg_padding");
switch(i) {
case HUD_PANEL_WEAPONS:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_padding \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_padding")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_outofammo \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_outofammo")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_donthave \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_donthave")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_unavailable \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_unavailable")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_ammo_color \"", cvar_string(strcat("hud_panel_", panel_name, "_ammo_color")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_ammo_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_ammo_alpha")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_complainbubble");
+ HUD_Write_PanelCvar_q("_complainbubble_padding");
+ HUD_Write_PanelCvar_q("_complainbubble_color_outofammo");
+ HUD_Write_PanelCvar_q("_complainbubble_color_donthave");
+ HUD_Write_PanelCvar_q("_complainbubble_color_unavailable");
+ HUD_Write_PanelCvar_q("_ammo_color");
+ HUD_Write_PanelCvar_q("_ammo_alpha");
+ HUD_Write_PanelCvar_q("_aspect");
+ HUD_Write_PanelCvar_q("_timeout");
+ HUD_Write_PanelCvar_q("_timeout_effect");
break;
case HUD_PANEL_AMMO:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_onlycurrent \"", cvar_string(strcat("hud_panel_", panel_name, "_onlycurrent")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_onlycurrent");
+ HUD_Write_PanelCvar_q("_iconalign");
+ HUD_Write_PanelCvar_q("_progressbar");
+ HUD_Write_PanelCvar_q("_progressbar_name");
+ HUD_Write_PanelCvar_q("_progressbar_xoffset");
+ HUD_Write_PanelCvar_q("_text");
break;
case HUD_PANEL_POWERUPS:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_baralign \"", cvar_string(strcat("hud_panel_", panel_name, "_baralign")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_progressbar \"", cvar_string(strcat("hud_panel_", panel_name, "_progressbar")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_flip");
+ HUD_Write_PanelCvar_q("_iconalign");
+ HUD_Write_PanelCvar_q("_baralign");
+ HUD_Write_PanelCvar_q("_progressbar");
+ HUD_Write_PanelCvar_q("_progressbar_strength");
+ HUD_Write_PanelCvar_q("_progressbar_shield");
break;
case HUD_PANEL_HEALTHARMOR:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_baralign \"", cvar_string(strcat("hud_panel_", panel_name, "_baralign")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_progressbar \"", cvar_string(strcat("hud_panel_", panel_name, "_progressbar")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_flip");
+ HUD_Write_PanelCvar_q("_iconalign");
+ HUD_Write_PanelCvar_q("_baralign");
+ HUD_Write_PanelCvar_q("_progressbar");
+ HUD_Write_PanelCvar_q("_progressbar_health");
+ HUD_Write_PanelCvar_q("_progressbar_armor");
+ HUD_Write_PanelCvar_q("_text");
break;
case HUD_PANEL_NOTIFY:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n"));
- fputs(fh, strcat("seta hud_panel_", panel_name, "_print \"", cvar_string(strcat("hud_panel_", panel_name, "_print")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_flip");
+ HUD_Write_PanelCvar_q("_print");
break;
case HUD_PANEL_RADAR:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_foreground_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_foreground_alpha")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_foreground_alpha");
break;
case HUD_PANEL_VOTE:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_alreadyvoted_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_alreadyvoted_alpha")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_alreadyvoted_alpha");
break;
case HUD_PANEL_PRESSEDKEYS:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_aspect");
break;
case HUD_PANEL_INFOMESSAGES:
- fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n"));
+ HUD_Write_PanelCvar_q("_flip");
break;
}
- fputs(fh, "\n");
+ HUD_Write("\n");
}
- fputs(fh, strcat("menu_sync", "\n")); // force the menu to reread the cvars, so that the dialogs are updated
+ HUD_Write("menu_sync\n"); // force the menu to reread the cvars, so that the dialogs are updated
- print("^2Successfully exported to hud_", autocvar_hud_skin, "_", cfgname, ".cfg! (Note: It's saved in data/data/)\n");
+ print(sprintf(_("^2Successfully exported to %s! (Note: It's saved in data/data/)\n"), filename));
+ fclose(fh);
}
- fclose(fh);
+ else
+ print(sprintf(_("^1Couldn't write to %s\n"), filename));
}
const float hlBorderSize = 4;
HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\
} ENDS_WITH_CURLY_BRACE
-void HUD_Panel_DrawProgressBar(vector pos, float vertical, vector mySize, vector color, float alpha, float drawflag)
+void HUD_Panel_DrawProgressBar(vector pos, vector mySize, string pic, float vertical, float barflip, float x, vector color, float alpha, float drawflag)
{
- if(!alpha)
+ if(!alpha || x == 0)
return;
- string pic;
+ x = bound(0, x, 1);
+
if(vertical) {
- pic = strcat(hud_skin_path, "/statusbar_vertical");
+ pic = strcat(hud_skin_path, "/", pic, "_vertical");
if(precache_pic(pic) == "") {
pic = "gfx/hud/default/statusbar_vertical";
}
- drawsubpic(pos, eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0 0', '1 0.25 0', color, alpha, drawflag);
- if(mySize_y/mySize_x > 2)
- drawsubpic(pos + eY * mySize_x, eY * (mySize_y - 2 * mySize_x) + eX * mySize_x, pic, '0 0.25 0', '1 0.5 0', color, alpha, drawflag);
- drawsubpic(pos + eY * mySize_y - eY * min(mySize_y * 0.5, mySize_x), eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0.75 0', '1 0.25 0', color, alpha, drawflag);
+
+ if(barflip)
+ drawsetcliparea(pos_x, pos_y + mySize_y * (1 - x), mySize_x, mySize_y * x);
+ else
+ drawsetcliparea(pos_x, pos_y, mySize_x, mySize_y * x);
} else {
- pic = strcat(hud_skin_path, "/statusbar");
+ pic = strcat(hud_skin_path, "/", pic);
if(precache_pic(pic) == "") {
pic = "gfx/hud/default/statusbar";
}
- drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag);
- if(mySize_x/mySize_y > 2)
- drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
- drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
+
+ if(barflip)
+ drawsetcliparea(pos_x + mySize_x * (1 - x), pos_y, mySize_x * x, mySize_y);
+ else
+ drawsetcliparea(pos_x, pos_y, mySize_x * x, mySize_y);
}
+
+ drawpic(pos, pic, mySize, color, alpha, drawflag);
+ drawresetcliparea();
}
void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float alpha, float drawflag)
else // push it downwards
myTarget_y = panel_pos_y + panel_size_y;
}
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL);
+ //if(cvar("hud_configure_checkcollisions_debug"))
+ //drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL);
}
return myTarget;
vector mySize;
mySize = panel_size;
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
+ //if(cvar("hud_configure_checkcollisions_debug"))
+ //drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
if(autocvar_hud_configure_grid)
{
else
mySize_y = min(mySize_y, dist_y);
}
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL);
+ //if(cvar("hud_configure_checkcollisions_debug"))
+ //drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL);
}
return mySize;
if(highlightedPanel == HUD_PANEL_CHAT) // some panels have their own restrictions, like the chat panel (which actually only moves the engine chat print around). Looks bad if it's too small.
{
- mySize_x = max(17 * cvar("con_chatsize"), mySize_x);
- mySize_y = max(2 * cvar("con_chatsize") + 2 * panel_bg_padding, mySize_y);
+ mySize_x = max(17 * autocvar_con_chatsize, mySize_x);
+ mySize_y = max(2 * autocvar_con_chatsize + 2 * panel_bg_padding, mySize_y);
}
// collision testing|
if(myPos_y + mySize_y > vid_conheight)
mySize_y = vid_conheight - myPos_y;
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
+ //if(cvar("hud_configure_checkcollisions_debug"))
+ //drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
// before checkresize, otherwise panel can be snapped partially inside another panel or panel aspect ratio can be broken
if(autocvar_hud_configure_grid)
myPos_y = resizeorigin_y;
}
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL);
+ //if(cvar("hud_configure_checkcollisions_debug"))
+ //drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL);
HUD_Panel_GetName(highlightedPanel);
string s;
if (highlightedPanel_prev == -1 || mouseClicked)
return;
- hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
+ hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
float step;
if(autocvar_hud_configure_grid)
/*
print("menu_enabled: ", ftos(menu_enabled), "\n");
print("Highlighted: ", ftos(highlightedPanel), "\n");
- print("Menu alpha: ", cvar_string("_menu_alpha"), "\n");
+ print("Menu alpha: ", ftos(autocvar__menu_alpha), "\n");
*/
// instantly hide the editor cursor if we open the HUDExit dialog
if(highlightedPanel != -1)
highlightedPanel_prev = highlightedPanel;
- mousepos = mousepos + getmousepos() * cvar("menu_mouse_speed");
+ mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed;
mousepos_x = bound(0, mousepos_x, vid_conwidth);
mousepos_y = bound(0, mousepos_y, vid_conheight);
cursorsize = '32 32 0';
if(highlightcheck == 0)
- drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
+ drawpic(mousepos, strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else if(highlightcheck == 1)
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else if(highlightcheck == 2)
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
prevMouseClicked = mouseClicked;
}
case WEP_HLAC: return 3;
case WEP_MINSTANEX: return 3;
case WEP_NEX: return 3;
- case WEP_CAMPINGRIFLE: return 1;
+ case WEP_SNIPERRIFLE: return 1;
case WEP_HAGAR: return 2;
case WEP_ROCKET_LAUNCHER: return 2;
case WEP_SEEKER: return 2;
if(!autocvar_hud_panel_weapons && !autocvar__hud_configure)
return;
- float timeout = cvar("hud_panel_weapons_timeout");
+ float timeout = autocvar_hud_panel_weapons_timeout;
float timeout_effect_length, timein_effect_length;
- if (cvar("hud_panel_weapons_timeout_effect") == 0)
+ if (autocvar_hud_panel_weapons_timeout_effect == 0)
{
timeout_effect_length = 0;
timein_effect_length = 0;
if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
{
f = (time - (weapontime + timeout)) / timeout_effect_length;
- if (cvar("hud_panel_weapons_timeout_effect"))
+ if (autocvar_hud_panel_weapons_timeout_effect)
{
panel_bg_alpha *= (1 - f);
panel_fg_alpha *= (1 - f);
}
- if (cvar("hud_panel_weapons_timeout_effect") == 1)
+ if (autocvar_hud_panel_weapons_timeout_effect == 1)
{
f *= f; // for a cooler movement
center_x = panel_pos_x + panel_size_x/2;
else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure)
{
f = (time - weaponprevtime) / timein_effect_length;
- if (cvar("hud_panel_weapons_timeout_effect"))
+ if (autocvar_hud_panel_weapons_timeout_effect)
{
panel_bg_alpha *= (f);
panel_fg_alpha *= (f);
}
- if (cvar("hud_panel_weapons_timeout_effect") == 1)
+ if (autocvar_hud_panel_weapons_timeout_effect == 1)
{
f *= f; // for a cooler movement
f = 1 - f;
}
}
- float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt;
+ float i, weapid, wpnalpha, weapon_cnt;
weapon_cnt = 0;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
{
}
// TODO make this configurable
- if(weaponorder_bypriority != cvar_string("cl_weaponpriority"))
+ if(weaponorder_bypriority != autocvar_cl_weaponpriority)
{
if(weaponorder_bypriority)
strunzone(weaponorder_bypriority);
if(weaponorder_byimpulse)
strunzone(weaponorder_byimpulse);
- weaponorder_bypriority = strzone(cvar_string("cl_weaponpriority"));
+ weaponorder_bypriority = strzone(autocvar_cl_weaponpriority);
weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority))));
weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
panel_size -= '2 2 0' * panel_bg_padding;
}
- // hits
- weapon_stats = getstati(STAT_DAMAGE_HITS);
- weapon_number = weapon_stats & 63;
- weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
- // fired
- weapon_stats = getstati(STAT_DAMAGE_FIRED);
- weapon_number = weapon_stats & 63;
- weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
-
- if(cvar_or("hud_panel_weapons_fade", 1))
+ if(autocvar_hud_panel_weapons_fade)
{
- fade = 3.2 - 2 * (time - weapontime);
- fade = bound(0.7, fade, 1);
+ wpnalpha = 3.2 - 2 * (time - weapontime);
+ wpnalpha = bound(0.7, wpnalpha, 1) * panel_fg_alpha;
}
else
- fade = 1;
+ wpnalpha = panel_fg_alpha;
HUD_Weapons_Clear();
float rows, columns;
+ float aspect = autocvar_hud_panel_weapons_aspect;
rows = panel_size_y/panel_size_x;
- rows = bound(1, floor((sqrt(4 * autocvar_hud_panel_weapons_aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT);
+ rows = bound(1, floor((sqrt(4 * aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT);
columns = ceil(WEP_COUNT/rows);
float row, column;
vector color;
vector wpnpos;
vector wpnsize;
+
+ float fullammo_shells, fullammo_nails, fullammo_rockets, fullammo_cells, fullammo_fuel;
+ vector ammo_color;
+ float ammo_alpha;
+ wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
+ float barsize_x, barsize_y, baroffset_x, baroffset_y;
+ float show_ammo = autocvar_hud_panel_weapons_ammo;
+ if (show_ammo)
+ {
+ fullammo_shells = autocvar_hud_panel_weapons_ammo_full_shells;
+ fullammo_nails = autocvar_hud_panel_weapons_ammo_full_nails;
+ fullammo_rockets = autocvar_hud_panel_weapons_ammo_full_rockets;
+ fullammo_cells = autocvar_hud_panel_weapons_ammo_full_cells;
+ fullammo_fuel = autocvar_hud_panel_weapons_ammo_full_fuel;
+ ammo_color = stov(autocvar_hud_panel_weapons_ammo_color);
+ ammo_alpha = panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha;
+
+
+ if(wpnsize_x/wpnsize_y > aspect)
+ {
+ barsize_x = aspect * wpnsize_y;
+ barsize_y = wpnsize_y;
+ baroffset_x = (wpnsize_x - barsize_x) / 2;
+ }
+ else
+ {
+ barsize_y = 1/aspect * wpnsize_x;
+ barsize_x = wpnsize_x;
+ baroffset_y = (wpnsize_y - barsize_y) / 2;
+ }
+ }
float show_accuracy;
+ float weapon_stats;
if(autocvar_hud_panel_weapons_accuracy && acc_levels)
+ {
show_accuracy = true;
+ if (acc_col_x[0] == -1)
+ for (i = 0; i < acc_levels; ++i)
+ acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i))));
+ }
+
+ float weapons_st = getstati(STAT_WEAPONS);
+ float label = autocvar_hud_panel_weapons_label;
for(i = 0; i < weapon_cnt; ++i)
{
- wpnpos = panel_pos + eX * column * panel_size_x*(1/columns) + eY * row * panel_size_y*(1/rows);
- wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
+ wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y;
self = weaponorder[i];
weapid = self.impulse;
// draw background behind currently selected weapon
if(self.weapon == activeweapon)
- drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
// draw the weapon accuracy
if(show_accuracy)
{
- float weapon_hit, weapon_damage;
- weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
- if(weapon_damage)
+ weapon_stats = weapon_accuracy[self.weapon-WEP_FIRST];
+ if(weapon_stats >= 0)
{
- weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
- weapon_stats = floor(100 * weapon_hit / weapon_damage);
- }
+ // find the max level lower than weapon_stats
+ float j;
+ j = acc_levels-1;
+ while ( j && weapon_stats < acc_lev[j] )
+ --j;
+
+ // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
+ float factor;
+ factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
+ color = acc_col[j];
+ color = color + factor * (acc_col[j+1] - color);
- // find the max level lower than weapon_stats
- float j;
- j = acc_levels-1;
- while ( j && weapon_stats < acc_lev[j] )
- --j;
-
- // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
- float factor;
- factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
- color = acc_color(j);
- color = color + factor * (acc_color(j+1) - color);
-
- if(weapon_damage)
drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
}
// draw the weapon icon
- if((self.impulse >= 0) && (getstati(STAT_WEAPONS) & self.weapons))
+ if((weapid >= 0) && (weapons_st & self.weapons))
{
- drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
- if(autocvar_hud_panel_weapons_label == 1) // weapon number
- drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- else if(autocvar_hud_panel_weapons_label == 2) // bind
- drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ if(label == 1) // weapon number
+ drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ else if(label == 2) // bind
+ drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
// draw ammo status bar
- if(autocvar_hud_panel_weapons_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO)
+ if(show_ammo && self.weapon != WEP_TUBA && self.weapon != WEP_LASER && self.weapon != WEP_PORTO)
{
a = 0;
- type = GetAmmoTypeForWep(weapid);
+ type = GetAmmoTypeForWep(self.weapon);
if(type != -1)
a = getstati(GetAmmoStat(type)); // how much ammo do we have?
if(a > 0)
{
switch(type) {
- case 0: fullammo = autocvar_hud_panel_weapons_ammo_full_shells; break;
- case 1: fullammo = autocvar_hud_panel_weapons_ammo_full_nails; break;
- case 2: fullammo = autocvar_hud_panel_weapons_ammo_full_rockets; break;
- case 3: fullammo = autocvar_hud_panel_weapons_ammo_full_cells; break;
- case 4: fullammo = autocvar_hud_panel_weapons_ammo_full_fuel; break;
+ case 0: fullammo = fullammo_shells; break;
+ case 1: fullammo = fullammo_nails; break;
+ case 2: fullammo = fullammo_rockets; break;
+ case 3: fullammo = fullammo_cells; break;
+ case 4: fullammo = fullammo_fuel; break;
default: fullammo = 60;
}
- float barsize_x, barsize_y, barpos_x, barpos_y;
- if(wpnsize_x/wpnsize_y > autocvar_hud_panel_weapons_aspect)
- {
- barsize_x = autocvar_hud_panel_weapons_aspect * wpnsize_y;
- barsize_y = wpnsize_y;
-
- barpos_x = wpnpos_x + (wpnsize_x - barsize_x) / 2;
- barpos_y = wpnpos_y;
- }
- else
- {
- barsize_y = 1/autocvar_hud_panel_weapons_aspect * wpnsize_x;
- barsize_x = wpnsize_x;
-
- barpos_y = wpnpos_y + (wpnsize_y - barsize_y) / 2;
- barpos_x = wpnpos_x;
- }
-
drawsetcliparea(
- barpos_x,
- barpos_y,
+ wpnpos_x + baroffset_x,
+ wpnpos_y + baroffset_y,
barsize_x * bound(0, a/fullammo, 1),
barsize_y);
- drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, autocvar_hud_panel_weapons_ammo_color, panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, ammo_color, ammo_alpha, DRAWFLAG_NORMAL);
drawresetcliparea();
}
}
string s;
if(complain_weapon_type == 0) {
- s = "Out of ammo";
- color = autocvar_hud_panel_weapons_complainbubble_color_outofammo;
+ s = _("Out of ammo");
+ color = stov(autocvar_hud_panel_weapons_complainbubble_color_outofammo);
}
else if(complain_weapon_type == 1) {
- s = "Don't have";
- color = autocvar_hud_panel_weapons_complainbubble_color_donthave;
+ s = _("Don't have");
+ color = stov(autocvar_hud_panel_weapons_complainbubble_color_donthave);
}
else {
- s = "Unavailable";
- color = autocvar_hud_panel_weapons_complainbubble_color_unavailable;
+ s = _("Unavailable");
+ color = stov(autocvar_hud_panel_weapons_complainbubble_color_unavailable);
}
- drawpic_aspect_skin(wpnpos + '1 1 0' * autocvar_hud_panel_weapons_complainbubble_padding, "weapon_complainbubble", wpnsize - '2 2 0' * autocvar_hud_panel_weapons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(wpnpos + '1 1 0' * autocvar_hud_panel_weapons_complainbubble_padding, s, wpnsize - '2 2 0' * autocvar_hud_panel_weapons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+ float padding = autocvar_hud_panel_weapons_complainbubble_padding;
+ drawpic_aspect_skin(wpnpos + '1 1 0' * padding, "weapon_complainbubble", wpnsize - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(wpnpos + '1 1 0' * padding, s, wpnsize - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
++row;
void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected)
{
float a;
- a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode?
if(autocvar__hud_configure)
+ {
+ currently_selected = (itemcode == 2); //rockets always selected
a = 100;
+ }
+ else
+ a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode?
vector color;
if(a < 10)
else
alpha = 0.7;
- vector newSize, newPos;
- if(mySize_x/mySize_y > 3)
- {
- newSize_x = 3 * mySize_y;
- newSize_y = mySize_y;
-
- newPos_x = myPos_x + (mySize_x - newSize_x) / 2;
- newPos_y = myPos_y;
- }
- else
- {
- newSize_y = 1/3 * mySize_x;
- newSize_x = mySize_x;
-
- newPos_y = myPos_y + (mySize_y - newSize_y) / 2;
- newPos_x = myPos_x;
- }
-
vector picpos, numpos;
if(autocvar_hud_panel_ammo_iconalign)
{
- numpos = newPos;
- picpos = newPos + eX * 2 * newSize_y;
+ numpos = myPos;
+ picpos = myPos + eX * 2 * mySize_y;
}
else
{
- numpos = newPos + eX * newSize_y;
- picpos = newPos;
+ numpos = myPos + eX * mySize_y;
+ picpos = myPos;
}
if (currently_selected)
- drawpic_aspect_skin(newPos, "ammo_current_bg", newSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-
- drawfont = hud_bigfont;
- if(a > 0)
- drawstring_aspect(numpos, ftos(a), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
- else // "ghost" ammo count
- drawstring_aspect(numpos, ftos(a), eX * (2/3) * newSize_x + eY * newSize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
- drawfont = hud_font;
+ drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+
+ if(a > 0 && autocvar_hud_panel_ammo_progressbar)
+ HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, 0, 0, min(1, a/autocvar_hud_panel_ammo_maxammo), color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+
+ if(autocvar_hud_panel_ammo_text)
+ {
+ if(a > 0)
+ drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+ else // "ghost" ammo count
+ drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+ }
if(a > 0)
- drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
else // "ghost" ammo icon
- drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * newSize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
}
void HUD_Ammo(void)
active_panel = HUD_PANEL_AMMO;
HUD_Panel_UpdateCvars(ammo);
- float i, currently_selected;
-
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
mySize -= '2 2 0' * panel_bg_padding;
}
- float rows, columns;
- rows = mySize_y/mySize_x;
- rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT);
- // ^^^ ammo item aspect goes here
+ float rows, columns, row, column;
+ vector ammo_size;
+ if (autocvar_hud_panel_ammo_onlycurrent)
+ ammo_size = mySize;
+ else
+ {
+ rows = mySize_y/mySize_x;
+ rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT);
+ // ^^^ ammo item aspect goes here
- columns = ceil(AMMO_COUNT/rows);
+ columns = ceil(AMMO_COUNT/rows);
- float row, column;
- // ammo
- for (i = 0; i < AMMO_COUNT; ++i) {
- currently_selected = getstati(STAT_ITEMS) & GetAmmoItemCode(i);
- if(autocvar_hud_panel_ammo_onlycurrent) {
- if(autocvar__hud_configure)
- i = 2;
- if (currently_selected || autocvar__hud_configure)
- {
- DrawAmmoItem(pos, mySize, i, currently_selected);
- break;
- }
- } else {
- DrawAmmoItem(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), i, currently_selected);
- ++row;
- if(row >= rows)
+ ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+ }
+
+ vector offset;
+ float newSize;
+ if(ammo_size_x/ammo_size_y > 3)
+ {
+ newSize = 3 * ammo_size_y;
+ offset_x = ammo_size_x - newSize;
+ pos_x += offset_x/2;
+ ammo_size_x = newSize;
+ }
+ else
+ {
+ newSize = 1/3 * ammo_size_x;
+ offset_y = ammo_size_y - newSize;
+ pos_y += offset_y/2;
+ ammo_size_y = newSize;
+ }
+
+ float i, stat_items, currently_selected;
+ if (autocvar_hud_panel_ammo_onlycurrent)
+ {
+ if(autocvar__hud_configure)
+ {
+ DrawAmmoItem(pos, ammo_size, 2, true); //show rockets
+ return;
+ }
+ stat_items = getstati(STAT_ITEMS);
+ for (i = 0; i < AMMO_COUNT; ++i) {
+ currently_selected = stat_items & GetAmmoItemCode(i);
+ if (currently_selected)
{
- row = 0;
- column = column + 1;
+ DrawAmmoItem(pos, ammo_size, i, true);
+ return;
}
}
+ return; // nothing to display
+ }
+
+ stat_items = getstati(STAT_ITEMS);
+ for (i = 0; i < AMMO_COUNT; ++i) {
+ currently_selected = stat_items & GetAmmoItemCode(i);
+ DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected);
+ ++row;
+ if(row >= rows)
+ {
+ row = 0;
+ column = column + 1;
+ }
}
}
}
}
- drawfont = hud_bigfont;
drawstring_aspect(numpos, ftos(x), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
drawpic_aspect_skin(picpos, icon, '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
}
if(!autocvar_hud_panel_powerups && !autocvar__hud_configure)
return;
- active_panel = HUD_PANEL_POWERUPS;
- HUD_Panel_UpdateCvars(powerups);
- float stat_items;
- stat_items = getstati(STAT_ITEMS);
-
if(!autocvar__hud_configure)
{
- if not(stat_items & IT_STRENGTH)
- if not(stat_items & IT_INVINCIBLE)
- return;
+ if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE))
+ return;
if (getstati(STAT_HEALTH) <= 0)
return;
}
+ active_panel = HUD_PANEL_POWERUPS;
+ HUD_Panel_UpdateCvars(powerups);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
vector numpos;
string leftname, rightname;
+ string leftprogressname, rightprogressname;
float leftcnt, rightcnt;
float leftexact, rightexact;
- if (autocvar_hud_panel_powerups_flip) {
+ float flip = autocvar_hud_panel_powerups_flip;
+ if (flip) {
leftname = "strength";
+ leftprogressname = autocvar_hud_panel_powerups_progressbar_strength;
leftcnt = ceil(strength_time);
leftexact = strength_time;
rightname = "shield";
+ rightprogressname = autocvar_hud_panel_powerups_progressbar_shield;
rightcnt = ceil(shield_time);
rightexact = shield_time;
} else {
leftname = "shield";
+ leftprogressname = autocvar_hud_panel_powerups_progressbar_shield;
leftcnt = ceil(shield_time);
leftexact = shield_time;
rightname = "strength";
+ rightprogressname = autocvar_hud_panel_powerups_progressbar_strength;
rightcnt = ceil(strength_time);
rightexact = strength_time;
}
- drawfont = hud_bigfont;
+ float baralign = autocvar_hud_panel_powerups_baralign;
+ float barflip;
+ float iconalign = autocvar_hud_panel_powerups_iconalign;
+ float progressbar = autocvar_hud_panel_powerups_progressbar;
if (mySize_x/mySize_y > 4)
{
+ barsize = eX * 0.5 * mySize_x + eY * mySize_y;
if(leftcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // right align
- barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/30);
- barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
+ if(baralign == 1 || baralign == 3) { // right align
+ barpos = pos + eX * 0.5 * mySize_x;
+ barflip = 1;
} else { // left align
- barpos = pos;
- barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y;
+ barpos = pos;
+ barflip = 0;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(leftcnt > 1)
- DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
- if(leftcnt <= 5)
- DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(leftcnt > 1)
+ DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
+ if(leftcnt <= 5)
+ DrawNumIcon_expanding(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
+ }
}
if(rightcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // left align
- barpos = pos + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y;
+ if(baralign == 0 || baralign == 3) { // left align
+ barpos = pos;
+ barflip = 0;
} else { // right align
- barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30);
- barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y;
+ barpos = pos + eX * 0.5 * mySize_x;
+ barflip = 1;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(rightcnt > 1)
- DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
- if(rightcnt <= 5)
- DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(rightcnt > 1)
+ DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
+ if(rightcnt <= 5)
+ DrawNumIcon_expanding(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
+ }
}
}
else if (mySize_x/mySize_y > 1.5)
{
+ barsize = eX * mySize_x + eY * 0.5 * mySize_y;
if(leftcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // right align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/30);
- barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y;
- } else { // left align
- barpos = pos;
- barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y;
+ barpos = pos;
+ if(baralign == 1 || baralign == 3) { // right/down align
+ barflip = 1;
+ } else { // left/up align
+ barflip = 0;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(leftcnt > 1)
- DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
- if(leftcnt <= 5)
- DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(leftcnt > 1)
+ DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1);
+ if(leftcnt <= 5)
+ DrawNumIcon_expanding(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1));
+ }
}
if(rightcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // left align
- barpos = pos + eY * 0.5 * mySize_y;
- barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
+ barpos = pos + eY * 0.5 * mySize_y;
+ if(baralign == 0 || baralign == 3) { // left align
+ barflip = 0;
} else { // right align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
- barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y;
+ barflip = 1;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(rightcnt > 1)
- DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
- if(rightcnt <= 5)
- DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(rightcnt > 1)
+ DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1);
+ if(rightcnt <= 5)
+ DrawNumIcon_expanding(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1));
+ }
}
}
else
{
+ barsize = eX * 0.5 * mySize_x + eY * mySize_y;
if(leftcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // down align
- barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30);
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
+ barpos = pos;
+ if(baralign == 1 || baralign == 3) { // down align
+ barflip = 1;
} else { // up align
- barpos = pos;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30);
+ barflip = 0;
}
- if(autocvar_hud_panel_powerups_iconalign == 1 || autocvar_hud_panel_powerups_iconalign == 3) { // down align
+ if(iconalign == 1 || iconalign == 3) { // down align
picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x);
numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x;
} else { // up align
numpos = pos + eY * 0.4 * mySize_x;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 1, barflip, min(1, leftcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(leftcnt <= 5)
- drawpic_aspect_skin_expanding(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (leftcnt - leftexact) / 0.5, 1));
- if(leftcnt > 1)
- drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(leftcnt <= 5)
+ drawpic_aspect_skin_expanding(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (leftcnt - leftexact) / 0.5, 1));
+ if(leftcnt > 1)
+ drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
}
if(rightcnt)
{
- if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // up align
- barpos = pos + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30);
- } else { // down align
- barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30) + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30);
+ barpos = pos + eX * 0.5 * mySize_x;
+ if(baralign == 0 || baralign == 3) { // down align
+ barflip = 1;
+ } else { // up align
+ barflip = 0;
}
- if(autocvar_hud_panel_powerups_iconalign == 0 || autocvar_hud_panel_powerups_iconalign == 3) { // up align
+ if(iconalign == 0 || iconalign == 3) { // up align
picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
} else { // down align
numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x;
}
- if(autocvar_hud_panel_powerups_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 1, barflip, min(1, rightcnt/30), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL);
}
- if(rightcnt <= 5)
- drawpic_aspect_skin_expanding(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (rightcnt - rightexact) / 0.5, 1));
- if(rightcnt > 1)
- drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ if(autocvar_hud_panel_powerups_text)
+ {
+ if(rightcnt <= 5)
+ drawpic_aspect_skin_expanding(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (rightcnt - rightexact) / 0.5, 1));
+ if(rightcnt > 1)
+ drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
}
}
- drawfont = hud_font;
}
// Health/armor (#3)
if(autocvar__hud_configure)
{
- armor = 150;
- health = 100;
- fuel = 70;
+ armor = 75;
+ health = 150;
+ fuel = 20;
}
if(health <= 0)
vector picpos;
vector numpos;
- drawfont = hud_bigfont;
+ float baralign = autocvar_hud_panel_healtharmor_baralign;
+ float iconalign = autocvar_hud_panel_healtharmor_iconalign;
+ float progressbar = autocvar_hud_panel_healtharmor_progressbar;
+
+ float maxhealth = autocvar_hud_panel_healtharmor_maxhealth;
+ float maxarmor = autocvar_hud_panel_healtharmor_maxarmor;
if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display
{
vector v;
float x;
x = floor(v_x + 1);
- if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, x/400);
- barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y;
- } else { // left align
- barpos = pos;
- barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y;
- }
+ float maxtotal = maxhealth + maxarmor;
+
+ barpos = pos;
+ barsize = mySize;
string biggercount;
if(v_z) // NOT fully armored
{
biggercount = "health";
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColor(health);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, autocvar_hud_panel_healtharmor_progressbar_health, 0, mod(baralign, 2), x/maxtotal, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
if(armor)
+ if(autocvar_hud_panel_healtharmor_text)
drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "armor", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL);
}
else
{
biggercount = "armor";
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColor(armor);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, autocvar_hud_panel_healtharmor_progressbar_armor, 0, mod(baralign, 2), x/maxtotal, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
if(health)
+ if(autocvar_hud_panel_healtharmor_text)
drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "health", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
}
- DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, 2 * 200), 1);
+ if(autocvar_hud_panel_healtharmor_text)
+ DrawNumIcon(iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, maxtotal), 1);
// fuel
if(fuel)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
- } else {
- barpos = pos;
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
- }
+ barpos = pos;
+ barsize = eX * mySize_x + eY * 0.2 * mySize_y;
HUD_Panel_GetProgressBarColor(fuel);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
}
}
else
{
string leftname, rightname;
+ string leftprogressname, rightprogressname;
float leftcnt, rightcnt;
+ float leftmax, rightmax;
float leftactive, rightactive;
float leftalpha, rightalpha;
- if (autocvar_hud_panel_healtharmor_flip) { // old style layout with armor left/top of health
+ float flip = autocvar_hud_panel_healtharmor_flip;
+ float barflip;
+ if (flip) { // old style layout with armor left/top of health
leftname = "armor";
+ leftprogressname = autocvar_hud_panel_healtharmor_progressbar_armor;
leftcnt = armor;
if(leftcnt)
leftactive = 1;
leftalpha = min((armor+10)/55, 1);
+ leftmax = maxarmor;
rightname = "health";
+ rightprogressname = autocvar_hud_panel_healtharmor_progressbar_health;
rightcnt = health;
rightactive = 1;
rightalpha = 1;
+ rightmax = maxhealth;
} else {
leftname = "health";
+ leftprogressname = autocvar_hud_panel_healtharmor_progressbar_health;
leftcnt = health;
leftactive = 1;
leftalpha = 1;
+ leftmax = maxhealth;
rightname = "armor";
+ rightprogressname = autocvar_hud_panel_healtharmor_progressbar_armor;
rightcnt = armor;
if(rightcnt)
rightactive = 1;
rightalpha = min((armor+10)/55, 1);
+ rightmax = maxarmor;
}
if (mySize_x/mySize_y > 4)
{
+ barsize = eX * 0.5 * mySize_x + eY * mySize_y;
if(leftactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align
- barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/200);
- barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
+ barpos = pos;
+ if(baralign == 1 || baralign == 3) { // right align
+ barflip = 1;
} else { // left align
- barpos = pos;
- barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y;
+ barflip = 0;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/leftmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1);
+ if(autocvar_hud_panel_healtharmor_text)
+ DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, leftmax), 1);
}
if(rightactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y;
+ barpos = pos + eX * 0.5 * mySize_x;
+ if(baralign == 0 || baralign == 3) { // left align
+ barflip = 0;
} else { // right align
- barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200);
- barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y;
+ barflip = 1;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/rightmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1);
+ if(autocvar_hud_panel_healtharmor_text)
+ DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, rightmax), 1);
}
if(fuel)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
- } else {
- barpos = pos;
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y;
- }
- HUD_Panel_GetProgressBarColor(fuel);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+ barpos = pos;
+ barsize = eX * mySize_x + eY * 0.2 * mySize_y;
+ HUD_Panel_GetProgressBarColor(fuel);
+ HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
}
}
else if (mySize_x/mySize_y > 1.5)
{
+ barsize = eX * mySize_x + eY * 0.5 * mySize_y;
if(leftactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200);
- barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
+ barpos = pos;
+ if(baralign == 1 || baralign == 3) { // right align
+ barflip = 1;
} else { // left align
- barpos = pos;
- barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
+ barflip = 0;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 0, barflip, min(1, leftcnt/leftmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1);
+ if(autocvar_hud_panel_healtharmor_text)
+ DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, leftmax), 1);
}
if(rightactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos + eY * 0.5 * mySize_y;
- barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+ barpos = pos + eY * 0.5 * mySize_y;
+ if(baralign == 0 || baralign == 3) { // left align
+ barflip = 0;
} else { // right align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
- barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+ barflip = 1;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 0, barflip, min(1, rightcnt/rightmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1);
+ if(autocvar_hud_panel_healtharmor_text)
+ DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, rightmax), 1);
}
if(fuel)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100);
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y;
- } else {
- barpos = pos;
- barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y;
- }
- HUD_Panel_GetProgressBarColor(fuel);
- HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+ barpos = pos;
+ barsize = eX * mySize_x + eY * 0.2 * mySize_y;
+ HUD_Panel_GetProgressBarColor(fuel);
+ HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 0, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
}
}
else
{
+ barsize = eX * 0.5 * mySize_x + eY * mySize_y;
if(leftactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // down align
- barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200);
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200);
- } else { // up align
- barpos = pos;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200);
+ barpos = pos;
+ if(baralign == 1 || baralign == 3) { // right align
+ barflip = 1;
+ } else { // left align
+ barflip = 0;
}
- if(autocvar_hud_panel_healtharmor_iconalign == 1 || autocvar_hud_panel_healtharmor_iconalign == 3) { // down align
+ if(iconalign == 1 || iconalign == 3) { // down align
picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x);
numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x;
} else { // up align
numpos = pos + eY * 0.4 * mySize_x;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(leftname);
- HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, leftprogressname, 1, barflip, min(1, leftcnt/leftmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(leftcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL);
+ if(autocvar_hud_panel_healtharmor_text)
+ {
+ drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(leftcnt, leftmax), panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
}
if(rightactive)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // up align
- barpos = pos + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200);
- } else { // down align
- barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200) + eX * 0.5 * mySize_x;
- barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200);
+ barpos = pos + eX * 0.5 * mySize_x;
+ if(baralign == 0 || baralign == 3) { // left align
+ barflip = 0;
+ } else { // right align
+ barflip = 1;
}
- if(autocvar_hud_panel_healtharmor_iconalign == 0 || autocvar_hud_panel_healtharmor_iconalign == 3) { // up align
+ if(iconalign == 0 || iconalign == 3) { // up align
picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x;
numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x;
} else { // down align
numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x;
}
- if(autocvar_hud_panel_healtharmor_progressbar)
+ if(progressbar)
{
HUD_Panel_GetProgressBarColorForString(rightname);
- HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(barpos, barsize, rightprogressname, 1, barflip, min(1, rightcnt/rightmax), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
- drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(rightcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL);
+ if(autocvar_hud_panel_healtharmor_text)
+ {
+ drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(rightcnt, rightmax), panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
}
if(fuel)
{
- if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align
- barpos = pos;
- barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100);
- } else {
- barpos = pos + eY * mySize_y - eY * mySize_y * min(1, fuel/100);
- barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100);
- }
- HUD_Panel_GetProgressBarColor(fuel);
- HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
+ barpos = pos;
+ barsize = eX * 0.05 * mySize_x + eY * mySize_y;
+ HUD_Panel_GetProgressBarColor(fuel);
+ HUD_Panel_DrawProgressBar(barpos, barsize, "progressbar", 1, mod(baralign, 2), min(1, fuel/100), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * 0.8, DRAWFLAG_NORMAL);
}
}
}
- drawfont = hud_font;
}
// Notification area (#4)
return w_deathtypestring;
}
-float killnotify_times[10];
-float killnotify_deathtype[10];
-float killnotify_actiontype[10]; // 0 = "Y [used by] X", 1 = "X [did action to] Y"
-string killnotify_attackers[10];
-string killnotify_victims[10];
+#define KN_MAX_ENTRIES 10
+float kn_index;
+float killnotify_times[KN_MAX_ENTRIES];
+float killnotify_deathtype[KN_MAX_ENTRIES];
+float killnotify_actiontype[KN_MAX_ENTRIES]; // 0 = "Y [used by] X", 1 = "X [did action to] Y"
+string killnotify_attackers[KN_MAX_ENTRIES];
+string killnotify_victims[KN_MAX_ENTRIES];
void HUD_KillNotify_Push(string attacker, string victim, float actiontype, float wpn)
{
- float i;
- for (i = 9; i > 0; --i) {
- killnotify_times[i] = killnotify_times[i-1];
- killnotify_deathtype[i] = killnotify_deathtype[i-1];
- killnotify_actiontype[i] = killnotify_actiontype[i-1];
- if(killnotify_attackers[i])
- strunzone(killnotify_attackers[i]);
- killnotify_attackers[i] = strzone(killnotify_attackers[i-1]);
- if(killnotify_victims[i])
- strunzone(killnotify_victims[i]);
- killnotify_victims[i] = strzone(killnotify_victims[i-1]);
- }
- killnotify_times[0] = time;
- killnotify_deathtype[0] = wpn;
- killnotify_actiontype[0] = actiontype;
- if(killnotify_attackers[0])
- strunzone(killnotify_attackers[0]);
- killnotify_attackers[0] = strzone(attacker);
- if(killnotify_victims[0])
- strunzone(killnotify_victims[0]);
- killnotify_victims[0] = strzone(victim);
+ --kn_index;
+ if (kn_index == -1)
+ kn_index = KN_MAX_ENTRIES-1;
+ killnotify_times[kn_index] = time;
+ killnotify_deathtype[kn_index] = wpn;
+ killnotify_actiontype[kn_index] = actiontype;
+ if(killnotify_attackers[kn_index])
+ strunzone(killnotify_attackers[kn_index]);
+ killnotify_attackers[kn_index] = strzone(attacker);
+ if(killnotify_victims[kn_index])
+ strunzone(killnotify_victims[kn_index]);
+ killnotify_victims[kn_index] = strzone(victim);
}
void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim
} else if (type == DEATH_KILL) {
HUD_KillNotify_Push(s1, "", 0, DEATH_KILL);
if (alsoprint)
- print ("^1",s1, "^1 couldn't take it anymore\n");
+ print (sprintf(_("^1%s^1 couldn't take it anymore\n"), s1));
} else if (type == DEATH_ROT) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if (alsoprint)
- print ("^1",s1, "^1 died\n");
+ print (sprintf(_("^1%s^1 died\n"), s1));
} else if (type == DEATH_NOAMMO) {
HUD_KillNotify_Push(s1, "", 0, DEATH_NOAMMO);
if (alsoprint)
- print ("^7",s1, "^7 committed suicide. What's the point of living without ammo?\n");
+ print (sprintf(_("^7%s^7 committed suicide. What's the point of living without ammo?\n"), s1));
} else if (type == DEATH_CAMP) {
HUD_KillNotify_Push(s1, "", 0, DEATH_CAMP);
if (alsoprint)
- print ("^1",s1, "^1 thought they found a nice camping ground\n");
+ print (sprintf(_("^1%s^1 thought they found a nice camping ground\n"), s1));
} else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
HUD_KillNotify_Push(s1, "", 0, type);
if (alsoprint)
- print ("^1",s1, "^1 didn't become friends with the Lord of Teamplay\n");
+ print (sprintf(_("^1%s^1 didn't become friends with the Lord of Teamplay\n"), s1));
} else if (type == DEATH_CHEAT) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if (alsoprint)
- print ("^1",s1, "^1 unfairly eliminated themself\n");
+ print (sprintf(_("^1%s^1 unfairly eliminated themself\n"), s1));
} else if (type == DEATH_FIRE) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if (alsoprint)
- print ("^1",s1, "^1 burned to death\n");
+ print (sprintf(_("^1%s^1 burned to death\n"), s1));
} else if (type != DEATH_TEAMCHANGE && type != DEATH_QUIET) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if (alsoprint)
- print ("^1",s1, "^1 couldn't resist the urge to self-destruct\n");
+ print (sprintf(_("^1%s^1 couldn't resist the urge to self-destruct\n"), s1));
}
if (stof(s2) > 2) // killcount > 2
- print ("^1",s1,"^1 ended it all after a ",s2," kill spree\n");
+ print (sprintf(_("^1%s^1 ended it all after a %d kill spree\n"), s1, stof(s2)));
} else if(msg == MSG_KILL) {
w = DEATH_WEAPONOF(type);
if(WEP_VALID(w)) {
- if(type & HITTYPE_HEADSHOT)
+ if((w == WEP_SNIPERRIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here
HUD_KillNotify_Push(s1, s2, 1, DEATH_HEADSHOT);
else
- {
HUD_KillNotify_Push(s1, s2, 1, type);
- if (alsoprint)
- print("^1", sprintf(Weapon_KillMessage(type), strcat(s2, "^1"), strcat(s1, "^1")), "\n"); // default order: victim, killer
- }
+
+ if (alsoprint)
+ print("^1", sprintf(Weapon_KillMessage(type), strcat(s2, "^1"), strcat(s1, "^1")), "\n"); // default order: victim, killer
}
else if(type == KILL_TEAM_RED || type == KILL_TEAM_BLUE || type == KILL_TEAM_SPREE) {
HUD_KillNotify_Push(s1, s2, 1, type);
if(alsoprint)
{
if(gentle) {
- print ("^1", s1, "^1 took action against a team mate\n");
+ print (sprintf(_("^1%s^1 took action against a team mate\n"), s1));
} else {
- print ("^1", s1, "^1 mows down a team mate\n");
+ print (sprintf(_("^1%s^1 mows down a team mate\n"), s1));
}
}
if (stof(s2) > 2 && type == KILL_TEAM_SPREE) {
if(gentle)
- print ("^1",s1,"^1 ended a ",s3," scoring spree by going against a team mate\n");
+ print (sprintf(_("^1%s^1 ended a %d scoring spree by going against a team mate\n"), s1, stof(s3)));
else
- print ("^1",s1,"^1 ended a ",s3," kill spree by killing a team mate\n");
+ print (sprintf(_("^1%s^1 ended a %d kill spree by killing a team mate\n"), s1, stof(s3)));
}
else if (stof(s2) > 2) {
if(gentle)
- print ("^1",s1,"'s ^1",s3," scoring spree was ended by a team mate!\n");
+ print (sprintf(_("^1%s^1's %s scoring spree was ended by a team mate!\n"), s1, stof(s3)));
else
- print ("^1",s1,"'s ^1",s3," kill spree was ended by a team mate!\n");
+ print (sprintf(_("^1%s^1's %s kill spree was ended by a team mate!\n"), s1, stof(s3)));
}
}
else if(type == KILL_FIRST_BLOOD)
- print("^1",s1, "^1 drew first blood", "\n");
+ print(sprintf(_("^1%s^1 drew first blood\n"), s1));
else if (type == DEATH_TELEFRAG) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG);
if(gentle)
- print ("^1",s2, "^1 tried to occupy ", s1, "^1's teleport destination space\n");
+ print (sprintf(_("^1%s^1 tried to occupy %s^1's teleport destination space\n"), s2, s1));
else
- print ("^1",s2, "^1 was telefragged by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was telefragged by %s\n"), s2, s1));
}
else if (type == DEATH_DROWN) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_DROWN);
if(alsoprint)
- print ("^1",s2, "^1 was drowned by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was drowned by %s\n"), s2, s1));
}
else if (type == DEATH_SLIME) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_SLIME);
if(alsoprint)
- print ("^1",s2, "^1 was slimed by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was slimed by %s\n"), s2, s1));
}
else if (type == DEATH_LAVA) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_LAVA);
if(alsoprint)
- print ("^1",s2, "^1 was cooked by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was cooked by %s\n"), s2, s1));
}
else if (type == DEATH_FALL) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_FALL);
if(alsoprint)
- print ("^1",s2, "^1 was grounded by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was grounded by %s\n"), s2, s1));
}
else if (type == DEATH_SHOOTING_STAR) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_SHOOTING_STAR);
if(alsoprint)
- print ("^1",s2, "^1 was shot into space by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was shot into space by %s\n"), s2, s1));
}
else if (type == DEATH_SWAMP) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was conserved by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was conserved by %s\n"), s2, s1));
}
else if (type == DEATH_HURTTRIGGER)
{
HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
if(alsoprint)
- print("^1",s2, "^1 was thrown into a world of hurt by ", s1, "\n");
+ print(sprintf(_("^1%s^1 was thrown into a world of hurt by %s\n"), s2, s1));
} else if(type == DEATH_SBCRUSH) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was crushed by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was crushed by %s\n"), s2, s1));
} else if(type == DEATH_SBMINIGUN) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 got shredded by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 got shredded by %s\n"), s2, s1));
} else if(type == DEATH_SBROCKET) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was blased to bits by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was blasted to bits by %s\n"), s2, s1));
} else if(type == DEATH_SBBLOWUP) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 got caught in the destruction of ^1", s1, "'s vehicle\n");
+ print (sprintf(_("^1%s^1 got caught in the destruction of %s^1's vehicle\n"), s2, s1));
} else if(type == DEATH_WAKIGUN) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was bolted down by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was bolted down by %s\n"), s2, s1));
} else if(type == DEATH_WAKIROCKET) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 could find no shelter from ^1", s1, "'s rockets\n");
+ print (sprintf(_("^1%s^1 could find no shelter from %s^1's rockets\n"), s2, s1));
} else if(type == DEATH_WAKIBLOWUP) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 dies when ^1", s1, "'s wakizashi dies.\n");
+ print (sprintf(_("^1%s^1 dies when %s^1's wakizashi dies.\n"), s2, s1));
} else if(type == DEATH_TURRET) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was pushed into the line of fire by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was pushed into the line of fire by %s\n"), s2, s1));
} else if(type == DEATH_TOUCHEXPLODE) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was pushed into an accident by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was pushed into an accident by %s\n"), s2, s1));
} else if(type == DEATH_CHEAT) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was unfairly eliminated by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was unfairly eliminated by %s\n"), s2, s1));
} else if (type == DEATH_FIRE) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was burnt to death by ^1", s1, "\n");
+ print (sprintf(_("^1%s^1 was burnt to death by %s\n"), s2, s1));
} else if (type == DEATH_CUSTOM) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_CUSTOM);
if(alsoprint)
} else {
HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s2, "^1 was fragged by ", s1, "\n");
+ print (sprintf(_("^1%s^1 was fragged by %s\n"), s2, s1));
}
} else if(msg == MSG_SPREE) {
if(type == KILL_END_SPREE) {
if(gentle)
- print ("^1",s1,"'s ^1", s2, " scoring spree was ended by ", s3, "\n");
+ print (sprintf(_("^1%s^1's %s scoring spree was ended by %s\n"), s1, s2, s3));
else
- print ("^1",s1,"'s ^1", s2, " kill spree was ended by ", s3, "\n");
+ print (sprintf(_("^1%s^1's %s kill spree was ended by %s\n"), s1, s2, s3));
} else if(type == KILL_SPREE) {
if(gentle)
- print ("^1",s1,"^1 made ",s2," scores in a row\n");
+ print (sprintf(_("^1%s^1 made %s scores in a row\n"), s1, s2));
else
- print ("^1",s1,"^1 has ",s2," frags in a row\n");
+ print (sprintf(_("^1%s^1 has %s frags in a row\n"), s1, s2));
} else if(type == KILL_SPREE_3) {
if(gentle)
- print (s1,"^7 made a ^1TRIPLE SCORE\n");
+ print (sprintf(_("%s^7 made a ^1TRIPLE SCORE\n"), s1));
else
- print (s1,"^7 made a ^1TRIPLE FRAG\n");
+ print (sprintf(_("%s^7 made a ^1TRIPLE FRAG\n"), s1));
} else if(type == KILL_SPREE_5) {
if(gentle)
- print (s1,"^7 unleashes ^1SCORING RAGE\n");
+ print (sprintf(_("%s^7 unleashes ^1SCORING RAGE\n"), s1));
else
- print (s1,"^7 unleashes ^1RAGE\n");
+ print (sprintf(_("%s^7 unleashes ^1RAGE\n"), s1));
} else if(type == KILL_SPREE_10) {
if(gentle)
- print (s1,"^7 made ^1TEN SCORES IN A ROW!\n");
+ print (sprintf(_("%s^7 made ^1TEN SCORES IN A ROW!\n"), s1));
else
- print (s1,"^7 starts the ^1MASSACRE!\n");
+ print (sprintf(_("%s^7 starts the ^1MASSACRE!\n"), s1));
} else if(type == KILL_SPREE_15) {
if(gentle)
- print (s1,"^7 made ^1FIFTEEN SCORES IN A ROW!\n");
+ print (sprintf(_("%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"), s1));
else
- print (s1,"^7 executes ^1MAYHEM!\n");
+ print (sprintf(_("%s^7 executes ^1MAYHEM!\n"), s1));
} else if(type == KILL_SPREE_20) {
if(gentle)
- print (s1,"^7 made ^1TWENTY SCORES IN A ROW!\n");
+ print (sprintf(_("%s^7 made ^1TWENTY SCORES IN A ROW!\n"), s1));
else
- print (s1,"^7 is a ^1BERSERKER!\n");
+ print (sprintf(_("%s^7 is a ^1BERSERKER!\n"), s1));
} else if(type == KILL_SPREE_25) {
if(gentle)
- print (s1,"^7 made ^1TWENTY FIFE SCORES IN A ROW!\n");
+ print (sprintf(_("%s^7 made ^1TWENTY FIFE SCORES IN A ROW!\n"), s1));
else
- print (s1,"^7 inflicts ^1CARNAGE!\n");
+ print (sprintf(_("%s^7 inflicts ^1CARNAGE!\n"), s1));
} else if(type == KILL_SPREE_30) {
if(gentle)
- print (s1,"^7 made ^1THIRTY SCORES IN A ROW!\n");
+ print (sprintf(_("%s^7 made ^1THIRTY SCORES IN A ROW!\n"), s1));
else
- print (s1,"^7 unleashes ^1ARMAGEDDON!\n");
+ print (sprintf(_("%s^7 unleashes ^1ARMAGEDDON!\n"), s1));
}
} else if(msg == MSG_KILL_ACTION) { // wtf is this? isnt it basically the same as MSG_SUICIDE?
if (type == DEATH_DROWN) {
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 was in the water for too long\n");
+ print (sprintf(_("^1%s^1 was in the water for too long\n"), s1));
else
- print ("^1",s1, "^1 drowned\n");
+ print (sprintf(_("^1%s^1 drowned\n"), s1));
}
} else if (type == DEATH_SLIME) {
HUD_KillNotify_Push(s1, "", 0, DEATH_SLIME);
if(alsoprint)
- print ("^1",s1, "^1 was slimed\n");
+ print (sprintf(_("^1%s^1 was slimed\n"), s1));
} else if (type == DEATH_LAVA) {
HUD_KillNotify_Push(s1, "", 0, DEATH_LAVA);
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 found a hot place\n");
+ print (sprintf(_("^1%s^1 found a hot place\n"), s1));
else
- print ("^1",s1, "^1 turned into hot slag\n");
+ print (sprintf(_("^1%s^1 turned into hot slag\n"), s1));
}
} else if (type == DEATH_FALL) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 tested gravity (and it worked)\n");
+ print (sprintf(_("^1%s^1 tested gravity (and it worked)\n"), s1));
else
- print ("^1",s1, "^1 hit the ground with a crunch\n");
+ print (sprintf(_("^1%s^1 hit the ground with a crunch\n"), s1));
}
} else if (type == DEATH_SHOOTING_STAR) {
HUD_KillNotify_Push(s1, "", 0, DEATH_SHOOTING_STAR);
if(alsoprint)
- print ("^1",s1, "^1 became a shooting star\n");
+ print (sprintf(_("^1%s^1 became a shooting star\n"), s1));
} else if (type == DEATH_SWAMP) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 discovered a swamp\n");
+ print (sprintf(_("^1%s^1 discovered a swamp\n"), s1));
else
- print ("^1",s1, "^1 is now conserved for centuries to come\n");
+ print (sprintf(_("^1%s^1 is now conserved for centuries to come\n"), s1));
}
} else if(type == DEATH_TURRET) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was mowed down by a turret \n");
+ print (sprintf(_("^1%s^1 was mowed down by a turret \n"), s1));
} else if (type == DEATH_CUSTOM) {
HUD_KillNotify_Push(s1, "", 0, DEATH_CUSTOM);
if(alsoprint)
} else if(type == DEATH_TOUCHEXPLODE) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 died in an accident\n");
+ print (sprintf(_("^1%s^1 died in an accident\n"), s1));
} else if(type == DEATH_CHEAT) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was unfairly eliminated\n");
+ print (sprintf(_("^1%s^1 was unfairly eliminated\n"), s1));
} else if(type == DEATH_FIRE) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 felt a little hot\n");
+ print (sprintf(_("^1%s^1 felt a little hot\n"), s1));
else
- print ("^1",s1, "^1 burnt to death\n");
+ print (sprintf(_("^1%s^1 burnt to death\n"), s1));
}
} else {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
{
if(gentle)
- print ("^1",s1, "^1 needs a restart\n");
+ print (sprintf(_("^1%s^1 needs a restart\n"), s1));
else
- print ("^1",s1, "^1 died\n");
+ print (sprintf(_("^1%s^1 died\n"), s1));
}
}
} else if(msg == MSG_KILL_ACTION_SPREE) {
if(gentle)
- print ("^1",s1,"^1 needs a restart after a ",s2," scoring spree\n");
+ print (sprintf(_("^1%s^1 needs a restart after a %d scoring spree\n"), s1, stof(s2)));
else
- print ("^1",s1,"^1 died with a ",s2," kill spree\n");
+ print (sprintf(_("^1%s^1 died with a %d kill spree\n"), s1, stof(s2)));
} else if(msg == MSG_INFO) {
if(type == INFO_GOTFLAG) { // here, s2 is the flag name
HUD_KillNotify_Push(s1, s2, 0, INFO_GOTFLAG);
- print(s1, "^7 got the ", s2, "\n");
+ print(sprintf(_("%s^7 got the %s\n"), s1, s2));
} else if(type == INFO_LOSTFLAG) {
HUD_KillNotify_Push(s1, s2, 0, INFO_LOSTFLAG);
- print(s1, "^7 lost the ", s2, "\n");
+ print(sprintf(_("%s^7 lost the %s\n"), s1, s2));
} else if(type == INFO_PICKUPFLAG) {
HUD_KillNotify_Push(s1, s2, 0, INFO_GOTFLAG);
- print(s1, "^7 picked up the ", s2, "\n");
+ print(sprintf(_("%s^7 picked up the %s\n"), s1, s2));
} else if(type == INFO_RETURNFLAG) {
HUD_KillNotify_Push(s1, s2, 0, INFO_RETURNFLAG);
- print(s1, "^7 returned the ", s2, "\n");
+ print(sprintf(_("%s^7 returned the %s\n"), s1, s2));
} else if(type == INFO_CAPTUREFLAG) {
HUD_KillNotify_Push(s1, s2, 0, INFO_CAPTUREFLAG);
- print(s1, "^7 captured the ", s2, s3, "\n");
+ print(sprintf(_("%1^7 captured the %s%s\n"), s1, s2, s3));
}
} else if(msg == MSG_RACE) {
if(type == RACE_SERVER_RECORD) {
else if(type == RACE_FAIL) {
HUD_KillNotify_Push(s1, s2, 1, RACE_FAIL);
}
+ } else if(msg == MSG_KA) {
+ if(type == KA_PICKUPBALL) {
+ HUD_KillNotify_Push(s1, s2, 0, KA_PICKUPBALL);
+ if(alsoprint)
+ print (sprintf(_("%s^7 has picked up the ball!\n"), s1));
+ }
+ else if(type == KA_DROPBALL) {
+ HUD_KillNotify_Push(s1, s2, 0, KA_DROPBALL);
+ if(alsoprint)
+ print(sprintf(_("%s^7 has dropped the ball!\n"), s1));
+ }
}
}
gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
if(msg == MSG_SUICIDE) {
if (type == DEATH_TEAMCHANGE) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "You are now on: ", s1));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You are now on: %s"), s1)));
} else if (type == DEATH_AUTOTEAMCHANGE) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "You have been moved into a different team to improve team balance\nYou are now on: ", s1));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1)));
} else if (type == DEATH_CAMP) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Reconsider your tactics, camper!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Reconsider your tactics, camper!")));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Die camper!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Die camper!")));
} else if (type == DEATH_NOAMMO) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You are reinserted into the game for running out of ammo..."));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You are reinserted into the game for running out of ammo...")));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were killed for running out of ammo..."));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You were killed for running out of ammo...")));
} else if (type == DEATH_ROT) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to preserve your health"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to preserve your health")));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You grew too old without taking your medicine"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You grew too old without taking your medicine")));
} else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't go against team mates!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't go against team mates!")));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't shoot your team mates!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't shoot your team mates!")));
} else if (type == DEATH_QUIET) {
// do nothing
} else { // generic message
if(gentle)
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to be more careful!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to be more careful!")));
else
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You killed your own dumb self!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You killed your own dumb self!")));
}
} else if(msg == MSG_KILL) {
if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You went against", s1, ",a team mate!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You went against %s, a team mate!"), s1)));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You fragged ", s1, ", a team mate!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You fragged %s, a team mate!"), s1)));
}
} else if (type == KILL_FIRST_BLOOD) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1First score"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First score")));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1First blood"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First blood")));
}
} else if (type == KILL_FIRST_VICTIM) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1First casualty"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First casualty")));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1First victim"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First victim")));
}
} else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap...
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You scored against ^7", s1, "^1 who was typing!", s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You typefragged ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You typefragged ^7%s"), s1), s2));
}
} else if (type == KILL_TYPEFRAGGED) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, "^1 while you were typing!", s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were typefragged by ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
}
} else if (type == KILL_FRAG) {
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You scored against ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You scored against ^7%s"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You fragged ^7%s"), s1), s2));
}
} else { // generic message
if(gentle) {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s"), s1), s2));
} else {
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were fragged by ^7", s1, s2));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were fragged by ^7%s"), s1), s2));
}
}
} else if(msg == MSG_KILL_ACTION) {
// TODO: invent more centerprints here?
- centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Watch your step!"));
+ centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Watch your step!")));
}
}
}
float entries, height;
- entries = bound(1, floor(10 * mySize_y/mySize_x), 10);
+ entries = bound(1, floor(KN_MAX_ENTRIES * mySize_y/mySize_x), KN_MAX_ENTRIES);
height = mySize_y/entries;
vector fontsize;
- fontsize = '0.5 0.5 0' * height;
+ float fontheight = height * autocvar_hud_panel_notify_fontsize;
+ fontsize = '0.5 0.5 0' * fontheight;
float a;
float when;
float width_attacker;
string attacker, victim;
- float i, j, w;
- for(j = 0; j < entries; ++j)
+ float i, j, w, step, limit;
+ if(autocvar_hud_panel_notify_flip) //order items from the top down
{
- s = "";
- if(autocvar_hud_panel_notify_flip)
- i = j;
- else // rather nasty hack for ordering items from the bottom up
- i = entries - j - 1;
+ i = 0;
+ step = +1;
+ limit = entries;
+ }
+ else //order items from the bottom up
+ {
+ i = entries - 1;
+ step = -1;
+ limit = -1;
+ }
- if(fadetime)
+ for(j = kn_index; i != limit; i += step, ++j)
+ {
+ if(autocvar__hud_configure)
{
- if(killnotify_times[j] + when > time)
- a = 1;
- else
- a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1);
+ if (step == +1)
+ a = i;
+ else // inverse order
+ a = entries - 1 - i;
+ attacker = textShortenToWidth(sprintf(_("Player %d"), a+1), 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+ victim = textShortenToWidth(sprintf(_("Player %d"), a+2), 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+ s = strcat("weapon", get_weaponinfo(WEP_FIRST + mod(floor(a*2.4), WEP_LAST)).netname);
+ a = bound(0, (when - a) / 4, 1);
+ goto hud_config_notifyprint;
+ }
+
+ if (j == KN_MAX_ENTRIES)
+ j = 0;
+
+ if(killnotify_times[j] + when > time)
+ a = 1;
+ else if(fadetime)
+ {
+ a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1);
+ if(!a)
+ {
+ break;
+ }
}
else
{
- if(killnotify_times[j] + when > time)
- a = 1;
- else
- a = 0;
+ break;
}
+ s = "";
+
w = -1;
w = DEATH_WEAPONOF(killnotify_deathtype[j]);
// TODO: maybe print in team colors?
//
// Y [used by] X
- if(killnotify_actiontype[j] == 0 && !autocvar__hud_configure)
+ if(killnotify_actiontype[j] == 0)
{
- attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
- pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height);
- weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
-
if(killnotify_deathtype[j] == DEATH_GENERIC)
{
s = "notify_death";
s = "notify_blue_captured";
}
}
- if(s != "" && a)
- {
- drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
- drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
- }
- }
- // X [did action to] Y
- else
- {
- if(autocvar__hud_configure)
+ else if(killnotify_deathtype[j] == KA_DROPBALL)
{
- attacker = textShortenToWidth("Player1", 0.48 * mySize_x - height, fontsize, stringwidth_colors);
- victim = textShortenToWidth("Player2", 0.48 * mySize_x - height, fontsize, stringwidth_colors);
- a = bound(0, (when - j) / 4, 1);
+ s = "notify_balldropped";
}
- else
+ else if(killnotify_deathtype[j] == KA_PICKUPBALL)
{
- attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
- victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+ s = "notify_ballpickedup";
}
- width_attacker = stringwidth(attacker, TRUE, fontsize);
- pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * (0.5 * fontsize_y + i * height);
- pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height);
+
+ attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+ pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
- if(autocvar__hud_configure) // example actions for config mode
+ if(s != "")
{
- s = "weaponelectro";
+ drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+ drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
- else if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_LASER)
+ }
+ // X [did action to] Y
+ else
+ {
+ if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_LASER)
{
s = "notify_melee_laser";
}
{
s = "race_newfail";
}
- if(s != "" && a)
+
+ attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+ victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
+:hud_config_notifyprint
+ width_attacker = stringwidth(attacker, TRUE, fontsize);
+ pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
+ pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
+ weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
+
+ if(s != "")
{
drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
minutes = floor(sec / 60);
sec -= minutes * 60;
-
- string s;
- s = ftos(100 + sec);
-
- return strcat(ftos(minutes), ":", substring(s, 1, 3));
+ return sprintf("%d:%02d", minutes, sec);
}
void HUD_Timer(void)
timer = seconds_tostring(timeleft);
}
- drawfont = hud_bigfont;
drawstring_aspect(pos, timer, mySize, timer_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
}
// Radar (#6)
if(hud_panel_radar_rotation == 0)
{
// max-min distance must fit the radar in any rotation
- bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_max - mi_min));
+ bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_scale));
}
else
{
f * bigsize
+ (1 - f) * normalsize;
teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord(
- f * (mi_min + mi_max) * 0.5
+ f * mi_center
+ (1 - f) * view_origin);
color1 = GetPlayerColor(player_localentnum-1);
// race record display
if (distribution <= 0)
HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_bigfont;
drawstring_aspect(pos, timer, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
} else if (!teamplay) { // non-teamgames
// me vector := [team/connected frags id]
pl = players.sort_next;
drawstring_aspect(pos + eX * 0.75 * mySize_x, ftos(distribution), eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
if (leader)
HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_bigfont;
drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
} else { // teamgames
float max_fragcount;
max_fragcount = -99;
leader = 1;
if (leader)
HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_bigfont;
drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
} else {
if (max_fragcount == score)
leader = 1;
}
mySize = newSize;
- drawfont = hud_bigfont;
float a, t;
string s, forcetime;
{
s = "0:13:37";
drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.60 0.60 0' * mySize_y), s, '0.60 0.60 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- s = "^1Intermediate 1 (+15.42)";
+ s = _("^1Intermediate 1 (+15.42)");
drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.20 * mySize_y) + eY * 0.60 * mySize_y, s, '1 1 0' * 0.20 * mySize_y, panel_fg_alpha, DRAWFLAG_NORMAL);
- s = strcat("^1PENALTY: ", ftos_decimals(20 * 0.1, 1), " (missing a checkpoint)");
+ s = sprintf(_("^1PENALTY: %.1f (%s)"), 2, "missing a checkpoint");
drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.20 * mySize_y) + eY * 0.80 * mySize_y, s, '1 1 0' * 0.20 * mySize_y, panel_fg_alpha, DRAWFLAG_NORMAL);
}
else if(race_checkpointtime)
a = bound(0, 2 - (time - race_penaltyeventtime), 1);
if(a > 0)
{
- s = strcat("^1PENALTY: ", ftos_decimals(race_penaltytime * 0.1, 1), " (", race_penaltyreason, ")");
+ s = sprintf(_("^1PENALTY: %.1f (%s)"), race_penaltytime * 0.1, race_penaltyreason);
drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.2 * mySize_y) + eY * 0.8 * mySize_y, s, '1 1 0' * 0.2 * mySize_y, panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
}
if(a > 0)
{
if(time < t)
- s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")");
+ s = sprintf(_("^1PENALTY: %.1f (%s)"), (t - time) * 0.1, race_penaltyreason);
else
- s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")");
+ s = sprintf(_("^2PENALTY: %.1f (%s)"), 0, race_penaltyreason);
drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.2 * mySize_y) + eY * 0.6 * mySize_y, s, '1 1 0' * 0.2 * mySize_y, panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
}
}
-
- drawfont = hud_font;
}
// Vote window (#9)
void HUD_VoteWindow(void)
{
+ uid2name_dialog = 0;
if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
{
vote_active = 1;
- vote_called_vote = strzone(strcat("^2Name ^7instead of \"^1Unregistered player\"", " ^7in stats"));
+ vote_called_vote = strzone(_("^2Name ^7instead of \"^1Unregistered player^7\" in stats"));
+ uid2name_dialog = 1;
}
if(!autocvar_hud_panel_vote && !autocvar__hud_configure)
return;
- active_panel = HUD_PANEL_VOTE;
- HUD_Panel_UpdateCvars(vote);
- if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
- {
- panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight;
- panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight;
- }
- vector pos, mySize;
- pos = panel_pos;
- mySize = panel_size;
-
if(!autocvar__hud_configure)
{
panel_fg_alpha = autocvar_hud_panel_fg_alpha;
if(!vote_alpha)
return;
- a = panel_bg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
+ active_panel = HUD_PANEL_VOTE;
+ HUD_Panel_UpdateCvars(vote);
+
+ if(uid2name_dialog)
+ {
+ panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight;
+ panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight;
+ }
+
+ // these must be below above block
+ vector pos, mySize;
+ pos = panel_pos;
+ mySize = panel_size;
+
+ a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
HUD_Panel_DrawBg(a);
- a = panel_fg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
+ a = panel_fg_alpha * a;
+
if(panel_bg_padding)
{
pos += '1 1 0' * panel_bg_padding;
}
mySize = newSize;
- s = "A vote has been called for:";
- if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
- s = "Allow servers to store and display your name?";
+ s = _("A vote has been called for:");
+ if(uid2name_dialog)
+ s = _("Allow servers to store and display your name?");
drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1/8), stringwidth_colors);
if(autocvar__hud_configure)
- s = "^1Configure the HUD";
+ s = _("^1Configure the HUD");
drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL);
// print the yes/no counts
- s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount));
- if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
- s = strcat("Yes: (press y)");
+ s = sprintf(_("Yes (%s): %d"), getcommandkey("vyes", "vyes"), ftos(vote_yescount));
drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL);
- s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount));
- if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
- s = strcat("No: (press n)");
+ s = sprintf(_("No (%s): %d"), getcommandkey("vno", "vno"), ftos(vote_nocount));
drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL);
// draw the progress bar backgrounds
redalive = getstati(STAT_REDALIVE);
bluealive = getstati(STAT_BLUEALIVE);
- drawfont = hud_bigfont;
vector redpos, bluepos;
if(mySize_x > mySize_y)
{
drawpic_aspect_skin(bluepos, "player_blue.tga", eX * mySize_x + eY * 0.3 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(bluepos + eY * 0.3 * mySize_y, ftos(bluealive), eX * mySize_x + eY * 0.2 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
}
- drawfont = hud_font;
}
// CTF HUD modicon section
}
}
+// Keepaway HUD mod icon
+float kaball_prevstatus; // last remembered status
+float kaball_statuschange_time; // time when the status changed
+
+// we don't need to reset for keepaway since it immediately
+// autocorrects prevstatus as to if the player has the ball or not
+
+void HUD_Mod_Keepaway(vector pos, vector mySize)
+{
+ mod_active = 1; // keepaway should always show the mod HUD
+
+ float BLINK_FACTOR = 0.15;
+ float BLINK_BASE = 0.85;
+ float BLINK_FREQ = 5;
+ float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
+
+ float stat_items = getstati(STAT_ITEMS);
+ float kaball = (stat_items/IT_KEY1) & 1;
+
+ if(kaball != kaball_prevstatus)
+ {
+ kaball_statuschange_time = time;
+ kaball_prevstatus = kaball;
+ }
+
+ vector kaball_pos, kaball_size;
+
+ if(mySize_x > mySize_y) {
+ kaball_pos = pos + eX * 0.25 * mySize_x;
+ kaball_size = eX * 0.5 * mySize_x + eY * mySize_y;
+ } else {
+ kaball_pos = pos + eY * 0.25 * mySize_y;
+ kaball_size = eY * 0.5 * mySize_y + eX * mySize_x;
+ }
+
+ float kaball_statuschange_elapsedtime = time - kaball_statuschange_time;
+ float f = bound(0, kaball_statuschange_elapsedtime*2, 1);
+
+ if(kaball_prevstatus && f < 1)
+ drawpic_aspect_skin_expanding(kaball_pos, "keepawayball_carrying", kaball_size, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f);
+
+ if(kaball)
+ drawpic_aspect_skin(pos, "keepawayball_carrying", eX * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL);
+}
+
+
// Nexball HUD mod icon
void HUD_Mod_NexBall(vector pos, vector mySize)
{
p = 2 - p;
//Draw the filling
- vector barsize;
float vertical;
if(mySize_x > mySize_y)
{
- barsize = eX * p * mySize_x + eY * mySize_y;
vertical = 0;
}
else
{
- barsize = eX * mySize_x + eY * p * mySize_y;
vertical = 1;
}
HUD_Panel_GetProgressBarColor(nexball);
- HUD_Panel_DrawProgressBar(pos, vertical, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(pos, mySize, "statusbar", vertical, 0, p, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
if (stat_items & IT_KEY1)
if not((scores_flags[ps_primary] & SFL_TIME) && !teamplay) // race/cts record display on HUD
return; // no records in the actual race
- drawfont = hud_bigfont;
-
// clientside personal record
string rr;
if(gametype == GAME_CTS)
if(score && (score < t || !t)) {
db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
- if(cvar("cl_autodemo_delete_keeprecords"))
+ if(autocvar_cl_autodemo_delete_keeprecords)
{
- f = cvar("cl_autodemo_delete");
+ f = autocvar_cl_autodemo_delete;
f &~= 1;
cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
}
f = time - crecordtime_change_time;
if (f > 1) {
- drawstring_aspect(textPos, "Personal best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(textPos, _("Personal best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(textPos + eY * 0.25 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
} else {
- drawstring_aspect(textPos, "Personal best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(textPos, _("Personal best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(textPos + eY * 0.25 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect_expanding(pos, "Personal best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
+ drawstring_aspect_expanding(pos, _("Personal best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
drawstring_aspect_expanding(pos + eY * 0.25 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
}
f = time - srecordtime_change_time;
if (f > 1) {
- drawstring_aspect(textPos + eY * 0.5 * squareSize, "Server best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(textPos + eY * 0.5 * squareSize, _("Server best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(textPos + eY * 0.75 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
} else {
- drawstring_aspect(textPos + eY * 0.5 * squareSize, "Server best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(textPos + eY * 0.5 * squareSize, _("Server best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(textPos + eY * 0.75 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect_expanding(textPos + eY * 0.5 * squareSize, "Server best", eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
+ drawstring_aspect_expanding(textPos + eY * 0.5 * squareSize, _("Server best"), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
drawstring_aspect_expanding(textPos + eY * 0.75 * squareSize, TIME_ENCODED_TOSTRING(t), eX * squareSize + eY * 0.25 * squareSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
}
strunzone(race_status_name_prev);
race_status_name_prev = string_null;
}
- drawfont = hud_font;
}
float mod_prev; // previous state of mod_active to check for a change
if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
return;
- if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && !autocvar__hud_configure)
+ if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && !autocvar__hud_configure)
return;
active_panel = HUD_PANEL_MODICONS;
HUD_Mod_NexBall(pos, mySize);
else if(gametype == GAME_CTS || gametype == GAME_RACE)
HUD_Mod_Race(pos, mySize);
- else if(gametype == GAME_CA)
+ else if(gametype == GAME_CA || gametype == GAME_FREEZETAG)
HUD_Mod_CA(pos, mySize);
+ else if(gametype == GAME_KEEPAWAY)
+ HUD_Mod_Keepaway(pos, mySize);
}
// Draw pressed keys (#11)
}
// force custom aspect
- if(autocvar_hud_panel_pressedkeys_aspect)
+ float aspect = autocvar_hud_panel_pressedkeys_aspect;
+ if(aspect)
{
vector newSize;
- if(mySize_x/mySize_y > autocvar_hud_panel_pressedkeys_aspect)
+ if(mySize_x/mySize_y > aspect)
{
- newSize_x = autocvar_hud_panel_pressedkeys_aspect * mySize_y;
+ newSize_x = aspect * mySize_y;
newSize_y = mySize_y;
pos_x = pos_x + (mySize_x - newSize_x) / 2;
}
else
{
- newSize_y = 1/autocvar_hud_panel_pressedkeys_aspect * mySize_x;
+ newSize_y = 1/aspect * mySize_x;
newSize_x = mySize_x;
pos_y = pos_y + (mySize_y - newSize_y) / 2;
cvar_set("con_chatrect_y", ftos(pos_y/vid_conheight));
cvar_set("con_chatwidth", ftos(mySize_x/vid_conwidth));
- cvar_set("con_chat", ftos(floor(mySize_y/cvar("con_chatsize") - 0.5)));
+ cvar_set("con_chat", ftos(floor(mySize_y/autocvar_con_chatsize - 0.5)));
if(autocvar__hud_configure)
{
float chatsize;
- chatsize = cvar("con_chatsize");
+ chatsize = autocvar_con_chatsize;
cvar_set("con_chatrect_x", "9001"); // over 9000, we'll fake it instead for more control over alpha and such
float i, a;
- for(i = 0; i < cvar("con_chat"); ++i)
+ for(i = 0; i < autocvar_con_chat; ++i)
{
- if(i == cvar("con_chat") - 1)
+ if(i == autocvar_con_chat - 1)
a = panel_fg_alpha;
else
- a = panel_fg_alpha * floor(((i + 1) * 7 + cvar("con_chattime"))/45);
- drawcolorcodedstring(pos + eY * i * chatsize, textShortenToWidth("^3Player^7: This is the chat area.", mySize_x, '1 1 0' * chatsize, stringwidth_colors), '1 1 0' * chatsize, a, DRAWFLAG_NORMAL);
+ a = panel_fg_alpha * floor(((i + 1) * 7 + autocvar_con_chattime)/45);
+ drawcolorcodedstring(pos + eY * i * chatsize, textShortenToWidth(_("^3Player^7: This is the chat area."), mySize_x, '1 1 0' * chatsize, stringwidth_colors), '1 1 0' * chatsize, a, DRAWFLAG_NORMAL);
}
}
}
else
{
framecounter += 1;
- if(currentTime - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time"))
+ if(currentTime - prevfps_time > autocvar_hud_panel_engineinfo_framecounter_time)
{
prevfps = framecounter/(currentTime - prevfps_time);
framecounter = 0;
vector color;
color = HUD_Get_Num_Color (prevfps, 100);
- drawfont = hud_bigfont;
- drawstring_aspect(pos, strcat("FPS: ", ftos_decimals(prevfps, cvar("hud_panel_engineinfo_framecounter_decimals"))), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawfont = hud_font;
+ drawstring_aspect(pos, sprintf(_("FPS: %.*f"), autocvar_hud_panel_engineinfo_framecounter_decimals, prevfps), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
}
// Info messages panel (#14)
if(spectatee_status && !intermission)
{
if(spectatee_status == -1)
- s = "^1Observing";
+ s = _("^1Observing");
else
- s = strcat("^1Spectating: ^7", GetPlayerName(spectatee_status - 1));
+ s = sprintf(_("^1Spectating: ^7%s"), GetPlayerName(spectatee_status - 1));
drawInfoMessage(s)
if(spectatee_status == -1)
- s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 to spectate");
+ s = sprintf(_("^1Press ^3%s^1 to spectate"), getcommandkey("primary fire", "+fire"));
else
- s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 for another player");
+ s = sprintf(_("^1Press ^3%s^1 for another player"), getcommandkey("primary fire", "+fire"));
drawInfoMessage(s)
if(spectatee_status == -1)
- s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
+ s = sprintf(_("^1Use ^3%s^1 or ^3%s^1 to change the speed"), getcommandkey("next weapon", "weapnext"), getcommandkey("previous weapon", "weapprev"));
else
- s = strcat("^1Press ^3", getcommandkey("secondary fire", "+fire2"), "^1 to observe");
+ s = sprintf(_("^1Press ^3%s^1 to observe"), getcommandkey("secondary fire", "+fire2"));
drawInfoMessage(s)
- s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
+ s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey("server info", "+show_info"));
drawInfoMessage(s)
if(gametype == GAME_ARENA)
- s = "^1Wait for your turn to join";
+ s = _("^1Wait for your turn to join");
else if(gametype == GAME_LMS)
{
entity sk;
sk = playerslots[player_localentnum - 1];
if(sk.(scores[ps_primary]) >= 666)
- s = "^1Match has already begun";
+ s = _("^1Match has already begun");
else if(sk.(scores[ps_primary]) > 0)
- s = "^1You have no more lives left";
+ s = _("^1You have no more lives left");
else
- s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+ s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey("jump", "+jump"));
}
else
- s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+ s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey("jump", "+jump"));
drawInfoMessage(s)
//show restart countdown:
float countdown;
//we need to ceil, otherwise the countdown would be off by .5 when using round()
countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
- s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+ s = sprintf(_("^1Game starts in ^3%d^1 seconds"), countdown);
drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);
o_y += fontsize_y;
}
}
if(warmup_stage && !intermission)
{
- s = "^2Currently in ^1warmup^2 stage!";
+ s = _("^2Currently in ^1warmup^2 stage!");
drawInfoMessage(s)
}
if(ready_waiting_for_me)
{
if(warmup_stage)
- s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
+ s = sprintf(_("%sPress ^3%s%s to end warmup"), blinkcolor, getcommandkey("ready", "ready"), blinkcolor);
else
- s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+ s = sprintf(_("%sPress ^3%s%s once you are ready"), blinkcolor, getcommandkey("ready", "ready"), blinkcolor);
}
else
{
if(warmup_stage)
- s = strcat("^2Waiting for others to ready up to end warmup...");
+ s = _("^2Waiting for others to ready up to end warmup...");
else
- s = strcat("^2Waiting for others to ready up...");
+ s = _("^2Waiting for others to ready up...");
}
drawInfoMessage(s)
}
else if(warmup_stage && !intermission && !spectatee_status)
{
- s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
+ s = strcat("^2Press ^3%s^2 to end warmup", getcommandkey("ready", "ready"));
drawInfoMessage(s)
}
}
if ((ts_max - ts_min) > 1)
{
- s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
+ s = strcat(blinkcolor, _("Teamnumbers are unbalanced!"));
tm = GetTeam(myteam, false);
if (tm)
if (tm.team != COLOR_SPECTATOR)
if (tm.team_size == ts_max)
- s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
+ s = strcat(s, sprintf(_(" Press ^3%s%s to adjust"), getcommandkey("team menu", "menu_showteamselect"), blinkcolor));
drawInfoMessage(s)
}
}
}
else
{
- s = "^7Press ^3ESC ^7to show HUD options.";
+ s = _("^7Press ^3ESC ^7to show HUD options.");
drawInfoMessage(s)
- s = "^3Doubleclick ^7a panel for panel-specific options.";
+ s = _("^3Doubleclick ^7a panel for panel-specific options.");
drawInfoMessage(s)
- s = "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and";
+ s = _("^3CTRL ^7to disable collision testing, ^3SHIFT ^7and");
drawInfoMessage(s)
- s = "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments.";
+ s = _("^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments.");
drawInfoMessage(s)
}
}
float pos, conversion_factor;
string speed, zspeed, unit;
- switch(cvar("cl_showspeed_unit"))
+ switch(autocvar_cl_showspeed_unit)
{
default:
case 0:
conversion_factor = 1.0;
break;
case 1:
- unit = " qu/s";
+ unit = _(" qu/s");
conversion_factor = 1.0;
break;
case 2:
- unit = " m/s";
+ unit = _(" m/s");
conversion_factor = 0.0254;
break;
case 3:
- unit = " km/h";
+ unit = _(" km/h");
conversion_factor = 0.0254 * 3.6;
break;
case 4:
- unit = " mph";
+ unit = _(" mph");
conversion_factor = 0.0254 * 3.6 * 0.6213711922;
break;
case 5:
- unit = " knots";
+ unit = _(" knots");
conversion_factor = 0.0254 * 1.943844492; // 1 m/s = 1.943844492 knots, because 1 knot = 1.852 km/h
break;
}
speed = strcat(ftos(floor( vlen(pmove_vel - pmove_vel_z * '0 0 1') * conversion_factor + 0.5 )), unit);
- numsize_x = numsize_y = cvar("cl_showspeed_size");
- pos = (vid_conheight - numsize_y) * cvar("cl_showspeed_position");
+ numsize_x = numsize_y = autocvar_cl_showspeed_size;
+ pos = (vid_conheight - numsize_y) * autocvar_cl_showspeed_position;
- drawfont = hud_bigfont;
drawstringcenter(eX + pos * eY, speed, numsize, '1 1 1', autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
- if (cvar("cl_showspeed_z") == 1) {
+ if (autocvar_cl_showspeed_z == 1) {
zspeed = strcat(ftos(fabs(floor( pmove_vel_z * conversion_factor + 0.5 ))), unit);
drawstringcenter(eX + pos * eY + numsize_y * eY, zspeed, numsize * 0.5, '1 1 1', autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
}
-
- drawfont = hud_font;
}
vector acc_prevspeed;
top_y = 0;
f = time - acc_prevtime;
- if(cvar("cl_showacceleration_z"))
+ if(autocvar_cl_showacceleration_z)
acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed)) * (1 / f);
else
acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)) * (1 / f);
if (acceleration == 0)
return;
- pos = top - sz/2 * eY + (cvar("cl_showacceleration_position") * vid_conheight) * eY;
+ pos = top - sz/2 * eY + (autocvar_cl_showacceleration_position * vid_conheight) * eY;
- sz = cvar("cl_showacceleration_size");
- scale = cvar("cl_showacceleration_scale");
- alpha = cvar("cl_showacceleration_alpha");
- if (cvar("cl_showacceleration_color_custom"))
- rgb = stov(cvar_string("cl_showacceleration_color"));
+ sz = autocvar_cl_showacceleration_size;
+ scale = autocvar_cl_showacceleration_scale;
+ alpha = autocvar_cl_showacceleration_alpha;
+ if (autocvar_cl_showacceleration_color_custom)
+ rgb = stov(autocvar_cl_showacceleration_color);
else {
if (acceleration < 0)
rgb = '1 .5 .5' - '0 .5 .5' * bound(0, -acceleration * 0.2, 1);
}
if (acceleration > 0)
- HUD_Panel_DrawProgressBar(pos, 0, acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(pos, eX * (vid_conwidth - pos_x) + eY * sz, "statusbar", 0, 0, acceleration * scale, rgb, alpha * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
else
- HUD_Panel_DrawProgressBar(pos + acceleration * scale * '40 0 0', 0, -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL);
+ HUD_Panel_DrawProgressBar(eY * pos_y, eX * pos_x + eY * sz, "statusbar", 0, 1, -acceleration * scale, rgb, alpha * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
}
void HUD_Reset (void)
void HUD_Main (void)
{
float i;
-
- hud_skin_path = strcat("gfx/hud/", autocvar_hud_skin);
-
// global hud alpha fade
if(menu_enabled == 1)
hud_fade_alpha = 1;
return;
// Drawing stuff
+ if (hud_skin_path != autocvar_hud_skin)
+ {
+ if (hud_skin_path)
+ strunzone(hud_skin_path);
+ hud_skin_path = strzone(strcat("gfx/hud/", autocvar_hud_skin));
+ }
// HUD configure visible grid
if(autocvar__hud_configure && autocvar_hud_configure_grid && autocvar_hud_configure_grid_alpha)
}
}
+ current_player = (spectatee_status > 0) ? spectatee_status : player_localentnum;
+
// draw the dock
if(autocvar_hud_dock != "" && autocvar_hud_dock != "0")
{
float f;
vector color;
- if((teamplay) && autocvar_hud_dock_color_team) {
- f = stof(getplayerkey(player_localentnum - 1, "colors"));
- color = colormapPaletteColor(mod(f, 16), 1) * autocvar_hud_dock_color_team;
+ float hud_dock_color_team = autocvar_hud_dock_color_team;
+ if((teamplay) && hud_dock_color_team) {
+ f = stof(getplayerkey(current_player - 1, "colors"));
+ color = colormapPaletteColor(mod(f, 16), 1) * hud_dock_color_team;
}
- else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && autocvar_hud_dock_color_team) {
- color = '1 0 0' * autocvar_hud_dock_color_team;
- }
- else if(autocvar_hud_dock_color == "shirt") {
- f = stof(getplayerkey(player_localentnum - 1, "colors"));
- color = colormapPaletteColor(floor(f / 16), 0);
- }
- else if(autocvar_hud_dock_color == "pants") {
- f = stof(getplayerkey(player_localentnum - 1, "colors"));
- color = colormapPaletteColor(mod(f, 16), 1);
+ else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && hud_dock_color_team) {
+ color = '1 0 0' * hud_dock_color_team;
}
else
- color = stov(autocvar_hud_dock_color);
+ {
+ string hud_dock_color = autocvar_hud_dock_color;
+ if(hud_dock_color == "shirt") {
+ f = stof(getplayerkey(current_player - 1, "colors"));
+ color = colormapPaletteColor(floor(f / 16), 0);
+ }
+ else if(hud_dock_color == "pants") {
+ f = stof(getplayerkey(current_player - 1, "colors"));
+ color = colormapPaletteColor(mod(f, 16), 1);
+ }
+ else
+ color = stov(hud_dock_color);
+ }
string pic;
pic = strcat(hud_skin_path, "/", autocvar_hud_dock);
HUD_Chat(); // HUD_DrawPanel(HUD_PANEL_CHAT);
// TODO hud_'ify these
- if (cvar("cl_showspeed"))
+ if (autocvar_cl_showspeed)
HUD_ShowSpeed();
- if (cvar("cl_showacceleration"))
+ if (autocvar_cl_showacceleration)
HUD_ShowAcceleration();
if (autocvar__hud_configure && spectatee_status && hud_configure_prev == -1) // try to join if we are in hud_configure mode, but still spectating, and in the first frame (in order to get rid of motd when launching a server via the menu "HUD Setup" button)
const float BORDER_MULTIPLIER = 0.25;
float scoreboard_bottom;
-float weapon_hits[WEP_MAXCOUNT];
-float weapon_fired[WEP_MAXCOUNT];
+float weapon_accuracy[WEP_MAXCOUNT];
-#define acc_color(i) stov(cvar_string(strcat("hud_panel_weapons_accuracy_color", ftos(i))))
#define MAX_ACCURACY_LEVELS 10
float acc_lev[MAX_ACCURACY_LEVELS];
+vector acc_col[MAX_ACCURACY_LEVELS];
float acc_levels;
string acc_color_levels;
var float panel_bg_padding;
var string panel_bg_padding_str;
+float current_player;
+
// Because calling lots of functions in QC apparently cuts fps in half on many machines:
// ----------------------
// MACRO HELL STARTS HERE
// Little help for the poor people who have to make sense of this: Start from the bottom ;)
#define HUD_Panel_GetProgressBarColor(item) \
- progressbar_color = autocvar_hud_progressbar_##item##_color
+ progressbar_color = stov(cvar_string("hud_progressbar_" #item "_color"))
#define HUD_Panel_GetProgressBarColorForString(item) \
switch(item) {\
case "strength": HUD_Panel_GetProgressBarColor(strength); break;\
// Get value for panel_bg_color: if "" fetch default, else use panel_bg_color. Convert pants, shirt or teamcolor into a vector.
#define HUD_Panel_GetColor()\
if((teamplay) && panel_bg_color_team) {\
- panel_bg_color = colormapPaletteColor(mod(stof(getplayerkey(player_localentnum - 1, "colors")), 16), 1) * panel_bg_color_team;\
+ panel_bg_color = colormapPaletteColor(mod(stof(getplayerkey(current_player - 1, "colors")), 16), 1) * panel_bg_color_team;\
} else if (autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && panel_bg_color_team) {\
panel_bg_color = '1 0 0' * panel_bg_color_team;\
} else {\
panel_bg_color = autocvar_hud_panel_bg_color;\
} else {\
if(panel_bg_color_str == "shirt") {\
- panel_bg_color = colormapPaletteColor(floor(stof(getplayerkey(player_localentnum - 1, "colors")) / 16), 0);\
+ panel_bg_color = colormapPaletteColor(floor(stof(getplayerkey(current_player - 1, "colors")) / 16), 0);\
} else if(panel_bg_color_str == "pants") {\
- panel_bg_color = colormapPaletteColor(mod(stof(getplayerkey(player_localentnum - 1, "colors")), 16), 1);\
+ panel_bg_color = colormapPaletteColor(mod(stof(getplayerkey(current_player - 1, "colors")), 16), 1);\
} else {\
panel_bg_color = stov(panel_bg_color_str);\
}\
// Update all common cvars of given panel name
#define HUD_Panel_UpdateCvars(name) \
panel_enabled = autocvar_hud_panel_##name; \
-panel_pos = autocvar_hud_panel_##name##_pos; \
-panel_size = autocvar_hud_panel_##name##_size; \
-panel_bg_str = autocvar_hud_panel_##name##_bg; \
-panel_bg_color_str = autocvar_hud_panel_##name##_bg_color; \
-panel_bg_color_team_str = autocvar_hud_panel_##name##_bg_color_team; \
-panel_bg_alpha_str = autocvar_hud_panel_##name##_bg_alpha; \
-panel_bg_border_str = autocvar_hud_panel_##name##_bg_border; \
-panel_bg_padding_str = autocvar_hud_panel_##name##_bg_padding; \
+panel_pos = stov(cvar_string("hud_panel_" #name "_pos")); \
+panel_size = stov(cvar_string("hud_panel_" #name "_size")); \
+panel_bg_str = cvar_string("hud_panel_" #name "_bg"); \
+panel_bg_color_str = cvar_string("hud_panel_" #name "_bg_color"); \
+panel_bg_color_team_str = cvar_string("hud_panel_" #name "_bg_color_team"); \
+panel_bg_alpha_str = cvar_string("hud_panel_" #name "_bg_alpha"); \
+panel_bg_border_str = cvar_string("hud_panel_" #name "_bg_border"); \
+panel_bg_padding_str = cvar_string("hud_panel_" #name "_bg_padding"); \
HUD_Panel_StringVars()\
if(menu_enabled == 2 && active_panel == highlightedPanel) {\
HUD_Panel_GetMenuSize()\
}
#define HUD_Panel_UpdatePosSize(name) \
-panel_pos = autocvar_hud_panel_##name##_pos; \
-panel_size = autocvar_hud_panel_##name##_size; \
+panel_pos = stov(cvar_string("hud_panel_" #name "_pos")); \
+panel_size = stov(cvar_string("hud_panel_" #name "_size")); \
HUD_Panel_GetScaledVectors()\
if(menu_enabled == 2 && active_panel == highlightedPanel) {\
HUD_Panel_GetMenuSize()\
HUD_Panel_GetMenuPos()\
}\
-panel_bg_border_str = autocvar_hud_panel_##name##_bg_border; \
+panel_bg_border_str = cvar_string("hud_panel_" #name "_bg_border"); \
HUD_Panel_GetBorder()
// Update pos and size of given panel id
// --------------------------------------------------------------------------
// CTF
+#ifdef CTF_EXAMPLE
void() ctf_menu_show;
string ctf_temp_1;
+#endif
// --------------------------------------------------------------------------
// Onslaught
string hud_title[MAX_HUD_FIELDS + 1];
float hud_num_fields;
-float hud_font;
-float hud_bigfont;
-
string scores_label[MAX_SCORE];
float scores_flags[MAX_SCORE];
string teamscores_label[MAX_SCORE];
.float ping, ping_packetloss, ping_movementloss;
-float g_balance_grenadelauncher_secondary_bouncefactor;
-float g_balance_grenadelauncher_secondary_bouncestop;
+float g_balance_grenadelauncher_bouncefactor;
+float g_balance_grenadelauncher_bouncestop;
+float g_balance_electro_secondary_bouncefactor;
+float g_balance_electro_secondary_bouncestop;
+float g_trueaim_minrange;
float mv_detail;
float mv_timeout;
float mv_maps_mask;
+float mv_top2_time;
+float mv_top2_alpha;
vector mv_mousepos;
float mv_selection;
string MapVote_FormatMapItem(float id, string map, float count, float maxwidth, vector fontsize)
{
string pre, post;
- pre = strcat(ftos(id+1), ". ");
+ pre = sprintf("%d. ", id+1);
if(mv_detail)
{
if(count == 1)
- post = strcat(" (1 vote)");
+ post = _(" (1 vote)");
else
- post = strcat(" (", ftos(count), " votes)");
+ post = sprintf(_(" (%d votes)"), count);
}
else
post = "";
return strcat(pre, map, post);
}
-vector MapVote_RGB(float id)
+vector MapVote_RGB(float id, float count)
{
+ if(count < 0)
+ return '1 1 1';
if(id == mv_ownvote)
return '0 1 0';
else if (id == mv_selection)
isize -= hud_fontsize_y; // respect the text when calculating the image size
- rgb = MapVote_RGB(id);
+ rgb = MapVote_RGB(id, count);
img_size_y = isize;
img_size_x = isize / 0.75; // 4:3 x can be stretched easily, height is defined in isize
- drawfont = hud_font;
pos_y = pos_y + img_size_y;
label = MapVote_FormatMapItem(id, map, count, tsize, hud_fontsize);
text_size = stringwidth(label, false, hud_fontsize);
-
+
+ float alpha;
+ if (count < 0 && mv_top2_alpha)
+ alpha = mv_top2_alpha;
+ else
+ alpha = 1;
+
pos_x -= text_size*0.5;
- drawstring(pos, label, hud_fontsize, rgb, 1, DRAWFLAG_NORMAL);
+ drawstring(pos, label, hud_fontsize, rgb, alpha, DRAWFLAG_NORMAL);
pos_x = pos_x + text_size*0.5 - img_size_x*0.5;
pos_y = pos_y - img_size_y;
img_size -= (autocvar_scoreboard_border_thickness * 2) * '1 1 0';
if(pic == "")
{
- drawfill(pos, img_size, '.5 .5 .5', .7, DRAWFLAG_NORMAL);
+ drawfill(pos, img_size, '.5 .5 .5', .7 * alpha, DRAWFLAG_NORMAL);
}
else
{
- drawpic(pos, pic, img_size, '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawpic(pos, pic, img_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
}
if(id == mv_ownvote)
- drawborderlines(autocvar_scoreboard_border_thickness, pos, img_size, rgb, 1, DRAWFLAG_NORMAL);
+ drawborderlines(autocvar_scoreboard_border_thickness, pos, img_size, rgb, alpha, DRAWFLAG_NORMAL);
else
- drawborderlines(autocvar_scoreboard_border_thickness, pos, img_size, '0 0 0', 1, DRAWFLAG_NORMAL);
+ drawborderlines(autocvar_scoreboard_border_thickness, pos, img_size, '0 0 0', alpha, DRAWFLAG_NORMAL);
- if(id == mv_selection)
+ if(id == mv_selection && count >= 0)
drawfill(pos, img_size, '1 1 1', 0.1, DRAWFLAG_NORMAL);
}
float text_size;
string label;
- rgb = MapVote_RGB(id);
+ rgb = MapVote_RGB(id, count);
- drawfont = hud_font;
pos_y = pos_y + hud_fontsize_y;
- label = MapVote_FormatMapItem(id, "Don't care", count, tsize, hud_fontsize);
+ label = MapVote_FormatMapItem(id, _("Don't care"), count, tsize, hud_fontsize);
text_size = stringwidth(label, false, hud_fontsize);
xmin = vid_conwidth*0.05; // 5% border must suffice
xmax = vid_conwidth - xmin;
ymin = 20;
- i = cvar("con_chatpos"); //*cvar("con_chatsize");
+ i = autocvar_con_chatpos; //*autocvar_con_chatsize;
if(i < 0)
- ymax = vid_conheight + (i - cvar("con_chat")) * cvar("con_chatsize");
+ ymax = vid_conheight + (i - autocvar_con_chat) * autocvar_con_chatsize;
if(i >= 0 || ymax < (vid_conheight*0.5))
ymax = vid_conheight - ymin;
- drawfont = hud_bigfont;
hud_fontsize = HUD_GetFontsize("hud_fontsize");
pos_y = ymin;
pos_z = 0;
//pos_x = center - stringwidth("Vote for a map", false) * 0.5 * 24;
- pos_x = center - stringwidth("Vote for a map", false, '12 0 0');
+ pos_x = center - stringwidth(_("Vote for a map"), false, '12 0 0');
drawstring(pos, "Vote for a map", '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
pos_y += 26;
i = ceil(max(0, mv_timeout - time));
- map = strcat(ftos(i), " seconds left");
+ map = sprintf(_("%d seconds left"), i);
//pos_x = center - stringwidth(map, false) * 0.5 * 16;
pos_x = center - stringwidth(map, false, '8 0 0');
drawstring(pos, map, '16 16 0', '0 1 0', 1, DRAWFLAG_NORMAL);
pos_y += 22;
pos_x = xmin;
- drawfont = hud_font;
-
// base for multi-column stuff...
ymin = pos_y;
if(mv_abstain)
pos_y += (dist_y - isize) / 2;
ymax -= isize;
+ if (mv_top2_time)
+ mv_top2_alpha = max(0.2, 1 - (time - mv_top2_time)*(time - mv_top2_time));
+
for(i = 0; i < mv_num_maps; ++i)
{
tmp = mv_votes[i]; // FTEQCC bug: too many array accesses in the function call screw it up
- if(tmp < 0)
- continue;
map = mv_maps[i];
if(mv_preview[i])
MapVote_DrawMapItem(pos + MapVote_GridVec(dist, i, columns), isize, tsize, map, mv_pics[i], tmp, i);
MapVote_DrawAbstain(pos, isize, xmax - xmin, tmp, i);
}
- drawpic(mv_mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', autocvar_hud_panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(mv_mousepos, strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), '32 32 0', '1 1 1', autocvar_hud_panel_fg_alpha, DRAWFLAG_NORMAL);
}
void Cmd_MapVote_MapDownload(float argc)
if(argc != 2 || !mv_pk3list)
{
- print("mv_mapdownload: ^3You're not supposed to use this command on your own!\n");
+ print(_("mv_mapdownload: ^3You're not supposed to use this command on your own!\n"));
return;
}
break;
if(!pak || pak.sv_entnum != id) {
- print("^1Error:^7 Couldn't find pak index.\n");
+ print(_("^1Error:^7 Couldn't find pak index.\n"));
return;
}
- //print(strcat("^3Adding: ", ftos(id), " - ", pak.message, " - "));
-
if(PreviewExists(pak.message))
{
mv_preview[id] = true;
- //print("^2Found...\n");
return;
} else {
- print("Requesting preview...\n");
+ print(_("Requesting preview...\n"));
localcmd(strcat("\ncmd mv_getpic ", ftos(id), "\n"));
}
}
mv_preview[i] = false;
- //print(strcat("RECV: ", map, " in ", pk3, "\n"));
MapVote_CheckPic(map, pk3, i);
}
else
for(i = 0, power = 1; i < mv_num_maps; ++i, power *= 2)
if not(mv_maps_mask & power)
mv_votes[i] = -1;
+
+ mv_top2_time = time;
}
void MapVote_UpdateVotes()
// check for pending announcement, play it and remove it
if(announce_snd != "")
{
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
strunzone(announce_snd);
announce_snd = "";
}
countdown_rounded = floor(0.5 + countdown);
if(countdown <= 0) {
if (!spectatee_status) //do cprint only for players
- centerprint("^1Begin!");
+ centerprint(_("^1Begin!"));
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
//reset maptime announcers now as well
announcer_5min = announcer_1min = FALSE;
}
else {
if (!spectatee_status) //do cprint only for players
- centerprint(strcat("^1Game starts in ", ftos(countdown_rounded), " seconds"));
+ centerprint(sprintf(_("^1Game starts in %d seconds"), countdown_rounded));
if(countdown_rounded <= 3 && countdown_rounded >= 1) {
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
}
self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
float warmuplimit;
float warmuptimeleft;
if(warmup_stage) {
- warmuplimit = cvar("g_warmup_limit");
+ warmuplimit = autocvar_g_warmup_limit;
if(warmuplimit > 0) {
warmuptimeleft = max(0, warmuplimit + getstatf(STAT_GAMESTARTTIME) - time);
}
}
//5 minute check
- if (cvar("cl_sound_maptime_warning") >= 2) {
+ if (autocvar_cl_sound_maptime_warning >= 2) {
//make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
if(announcer_5min)
{
//if we're in warmup mode, check whether there's a warmup timelimit
if not (warmuplimit == -1 && warmup_stage) {
announcer_5min = TRUE;
- //dprint("i will play the sound, I promise!\n");
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
}
}
//1 minute check
- if (cvar("cl_sound_maptime_warning") == 1 || cvar("cl_sound_maptime_warning") == 3) {
+ if (autocvar_cl_sound_maptime_warning == 1 || autocvar_cl_sound_maptime_warning == 3) {
if (announcer_1min)
{
if(((!warmup_stage || warmuplimit == 0) && timeleft > 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 60))
//if we're in warmup mode, check whether there's a warmup timelimit
if not (warmuplimit == -1 && warmup_stage) {
announcer_1min = TRUE;
- sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
+ sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
}
}
}
float pickup;
string item;
- if not(cvar("cl_notify_carried_items"))
+ if not(autocvar_cl_notify_carried_items)
return;
stat_items = getstati(STAT_ITEMS);
blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
if (redflag == 3 && redflag != redflag_prev) {
- item = "^1RED^7 flag";
+ item = _("^1RED^7 flag");
pickup = (redflag_prev == 2);
}
if (blueflag == 3 && blueflag != blueflag_prev) {
- item = "^4BLUE^7 flag";
+ item = _("^4BLUE^7 flag");
pickup = (blueflag_prev == 2);
}
if (item)
{
if (pickup) {
- if (cvar("cl_notify_carried_items") & 2)
- centerprint(strcat("You picked up the ", item, "!"));
+ if (autocvar_cl_notify_carried_items & 2)
+ centerprint(sprintf(_("You picked up the %s!"), item));
}
else {
- if (cvar("cl_notify_carried_items") & 1)
- centerprint(strcat("You got the ", item, "!"));
+ if (autocvar_cl_notify_carried_items & 1)
+ centerprint(sprintf(_("You got the %s!"), item));
}
}
* TODO: announcer queues
*/
void Announcer_Precache () {
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/1minuteremains.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/5minutesremain.wav"));
-
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/electrobitch.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/airshot.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/03kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/05kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/10kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/15kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/20kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/25kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/30kills.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/botlike.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/yoda.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/amazing.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/awesome.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/headshot.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/impressive.wav"));
-
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/prepareforbattle.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/begin.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/timeoutcalled.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/1fragleft.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/2fragsleft.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/3fragsleft.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/terminated.wav"));
-
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/1.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/2.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/3.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/4.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/5.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/6.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/7.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/8.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/9.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/10.wav"));
-
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/lastsecond.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/narrowly.wav"));
-
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/voteaccept.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/votecall.wav"));
- precache_sound (strcat("announcer/", cvar_string("cl_announcer"), "/votefail.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/electrobitch.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/airshot.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/03kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/05kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/15kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/20kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/25kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/30kills.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/botlike.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/yoda.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/amazing.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/awesome.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/headshot.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/impressive.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/begin.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/timeoutcalled.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1fragleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2fragsleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3fragsleft.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/terminated.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/4.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/6.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/7.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/8.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/9.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/lastsecond.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/narrowly.wav"));
+
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
+ precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
}
void AuditLists()
if(!tm)
{
- print("Trying to remove a team which is not in the teamlist!");
+ print(_("Trying to remove a team which is not in the teamlist!"));
return;
}
parent.sort_next = Team.sort_next;
return tm;
}
-void CSQC_CheckEngine()
-{
- hud_font = FONT_USER+1;
- hud_bigfont = FONT_USER+2;
-}
-
vector HUD_GetFontsize(string cvarname)
{
vector v;
float f;
string file;
- if(cvar("cl_readpicture_force"))
+ if(autocvar_cl_readpicture_force)
return false;
file = strcat(name, ".tga");
//draw either the old v2.3 beam or the new beam
charge = sqrt(charge); // divide evenly among trail spacing and alpha
particles_alphamin = particles_alphamax = charge;
- if (cvar("cl_particles_oldnexbeam") && (getstati(STAT_ALLOW_OLDNEXBEAM) || isdemo()))
+ if (autocvar_cl_particles_oldnexbeam && (getstati(STAT_ALLOW_OLDNEXBEAM) || isdemo()))
WarpZone_TrailParticles_WithMultiplier(world, particleeffectnum("TE_TEI_G3"), shotorg, endpos, charge, 1);
else
WarpZone_TrailParticles_WithMultiplier(world, particleeffectnum("nex_beam"), shotorg, endpos, charge, 1);
prandom_seed = c;
#ifdef USE_PRANDOM_DEBUG
- print("RANDOM -> ", ftos(c), "\n");
+ dprint("RANDOM -> ", ftos(c), "\n");
#endif
return c / 65536; // in [0..1[
{
prandom_seed = seed;
#ifdef USE_PRANDOM_DEBUG
- print("SRANDOM ", ftos(seed), "\n");
+ dprint("SRANDOM ", ftos(seed), "\n");
#endif
}
#ifdef USE_PRANDOM_DEBUG
void prandom_debug()
{
- print("Current random seed = ", ftos(prandom_seed), "\n");
+ dprint("Current random seed = ", ftos(prandom_seed), "\n");
}
#endif
#endif
case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3");self.traileffect = particleeffectnum("TR_ROCKET"); self.scale = 2; break;
case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_bullet"); break;
- case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_bullet"); break;
+ case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_rifle_weak"); break;
case PROJECTILE_BULLET_GLOWING_TRACER: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_rifle"); break;
case PROJECTILE_CRYLINK: setmodel(self, "models/plasmatrail.mdl");self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
case PROJECTILE_CRYLINK_BOUNCING: setmodel(self, "models/plasmatrail.mdl");self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
self.maxs = '0 0 -4';
self.move_movetype = MOVETYPE_BOUNCE;
self.move_touch = SUB_Null;
+ self.move_bounce_factor = g_balance_electro_secondary_bouncefactor;
+ self.move_bounce_stopspeed = g_balance_electro_secondary_bouncestop;
break;
case PROJECTILE_ROCKET:
loopsound(self, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
self.maxs = '3 3 3';
self.move_movetype = MOVETYPE_BOUNCE;
self.move_touch = SUB_Null;
- self.move_bounce_factor = g_balance_grenadelauncher_secondary_bouncefactor;
- self.move_bounce_stopspeed = g_balance_grenadelauncher_secondary_bouncestop;
+ self.move_bounce_factor = g_balance_grenadelauncher_bouncefactor;
+ self.move_bounce_stopspeed = g_balance_grenadelauncher_bouncestop;
break;
case PROJECTILE_MINE:
self.mins = '-4 -4 -4';
float SCOREBOARD_OFFSET = 50;
+// wrapper to put all possible scores titles through gettext
+string TranslateScoresLabel(string l)
+{
+ switch(l)
+ {
+ case "bckills": return CTX(_("SCO^bckills"));
+ case "bctime": return CTX(_("SCO^bctime"));
+ case "caps": return CTX(_("SCO^caps"));
+ case "deaths": return CTX(_("SCO^deaths"));
+ case "destroyed": return CTX(_("SCO^destroyed"));
+ case "drops": return CTX(_("SCO^drops"));
+ case "faults": return CTX(_("SCO^faults"));
+ case "fckills": return CTX(_("SCO^fckills"));
+ case "goals": return CTX(_("SCO^goals"));
+ case "kckills": return CTX(_("SCO^kckills"));
+ case "kdratio": return CTX(_("SCO^kdratio"));
+ case "k/d": return CTX(_("SCO^k/d"));
+ case "kd": return CTX(_("SCO^kd"));
+ case "kdr": return CTX(_("SCO^kdr"));
+ case "kills": return CTX(_("SCO^kills"));
+ case "laps": return CTX(_("SCO^laps"));
+ case "lives": return CTX(_("SCO^lives"));
+ case "losses": return CTX(_("SCO^losses"));
+ case "name": return CTX(_("SCO^name"));
+ case "nick": return CTX(_("SCO^nick"));
+ case "objectives": return CTX(_("SCO^objectives"));
+ case "pickups": return CTX(_("SCO^pickups"));
+ case "ping": return CTX(_("SCO^ping"));
+ case "pl": return CTX(_("SCO^pl"));
+ case "pushes": return CTX(_("SCO^pushes"));
+ case "rank": return CTX(_("SCO^rank"));
+ case "returns": return CTX(_("SCO^returns"));
+ case "revivals": return CTX(_("SCO^revivals"));
+ case "score": return CTX(_("SCO^score"));
+ case "suicides": return CTX(_("SCO^suicides"));
+ case "takes": return CTX(_("SCO^takes"));
+ case "ticks": return CTX(_("SCO^ticks"));
+ default: return l;
+ }
+}
+
void MapVote_Draw();
void HUD_FinaleOverlay()
{
void Cmd_HUD_Help(float argc)
{
- print("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n");
- print("^3|---------------------------------------------------------------|\n");
- print("Usage:\n");
- print("^2scoreboard_columns_set default\n");
- print("^2scoreboard_columns_set ^7filed1 field2 ...\n");
- print("The following field names are recognized (case insensitive):\n");
- print("You can use a ^3|^7 to start the right-aligned fields.\n\n");
-
- print("^3name^7 or ^3nick^7 Name of a player\n");
- print("^3ping^7 Ping time\n");
- print("^3pl^7 Packet loss\n");
- print("^3kills^7 Number of kills\n");
- print("^3deaths^7 Number of deaths\n");
- print("^3suicides^7 Number of suicides\n");
- print("^3frags^7 kills - suicides\n");
- print("^3kd^7 The kill-death ratio\n");
- print("^3caps^7 How often a flag (CTF) or a key (KeyHunt) was captured\n");
- print("^3pickups^7 How often a flag (CTF) or a key (KeyHunt) was picked up\n");
- print("^3fckills^7 Number of flag carrier kills\n");
- print("^3returns^7 Number of flag returns\n");
- print("^3drops^7 Number of flag drops\n");
- print("^3lives^7 Number of lives (LMS)\n");
- print("^3rank^7 Player rank\n");
- print("^3pushes^7 Number of players pushed into void\n");
- print("^3destroyed^7 Number of keys destroyed by pushing them into void\n");
- print("^3kckills^7 Number of keys carrier kills\n");
- print("^3losses^7 Number of times a key was lost\n");
- print("^3laps^7 Number of laps finished (race/cts)\n");
- print("^3time^7 Total time raced (race/cts)\n");
- print("^3fastest^7 Time of fastest lap (race/cts)\n");
- print("^3ticks^7 Number of ticks (DOM)\n");
- print("^3takes^7 Number of domination points taken (DOM)\n");
- print("^3score^7 Total score\n\n");
-
- print("Before a field you can put a + or - sign, then a comma separated list\n");
- print("of game types, then a slash, to make the field show up only in these\n");
- print("or in all but these game types. You can also specify 'all' as a\n");
- print("field to show all fields available for the current game mode.\n\n");
-
- print("The special game type names 'teams' and 'noteams' can be used to\n");
- print("include/exclude ALL teams/noteams game modes.\n\n");
-
- print("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n");
- print("will display name, ping and pl aligned to the left, and the fields\n");
- print("right of the vertical bar aligned to the right.\n");
- print("'field3' will only be shown in CTF, and 'field4' will be shown in all\n");
- print("other gamemodes except DM.\n");
+ print(_("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"));
+ print(_("^3|---------------------------------------------------------------|\n"));
+ print(_("Usage:\n"));
+ print(_("^2scoreboard_columns_set default\n"));
+ print(_("^2scoreboard_columns_set ^7filed1 field2 ...\n"));
+ print(_("The following field names are recognized (case insensitive):\n"));
+ print(_("You can use a ^3|^7 to start the right-aligned fields.\n\n"));
+
+ print(_("^3name^7 or ^3nick^7 Name of a player\n"));
+ print(_("^3ping^7 Ping time\n"));
+ print(_("^3pl^7 Packet loss\n"));
+ print(_("^3kills^7 Number of kills\n"));
+ print(_("^3deaths^7 Number of deaths\n"));
+ print(_("^3suicides^7 Number of suicides\n"));
+ print(_("^3frags^7 kills - suicides\n"));
+ print(_("^3kd^7 The kill-death ratio\n"));
+ print(_("^3caps^7 How often a flag (CTF) or a key (KeyHunt) was captured\n"));
+ print(_("^3pickups^7 How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up\n"));
+ print(_("^3fckills^7 Number of flag carrier kills\n"));
+ print(_("^3returns^7 Number of flag returns\n"));
+ print(_("^3drops^7 Number of flag drops\n"));
+ print(_("^3lives^7 Number of lives (LMS)\n"));
+ print(_("^3rank^7 Player rank\n"));
+ print(_("^3pushes^7 Number of players pushed into void\n"));
+ print(_("^3destroyed^7 Number of keys destroyed by pushing them into void\n"));
+ print(_("^3kckills^7 Number of keys carrier kills\n"));
+ print(_("^3losses^7 Number of times a key was lost\n"));
+ print(_("^3laps^7 Number of laps finished (race/cts)\n"));
+ print(_("^3time^7 Total time raced (race/cts)\n"));
+ print(_("^3fastest^7 Time of fastest lap (race/cts)\n"));
+ print(_("^3ticks^7 Number of ticks (DOM)\n"));
+ print(_("^3takes^7 Number of domination points taken (DOM)\n"));
+ print(_("^3bckills^7 Number of ball carrier kills\n"));
+ print(_("^3bctime^7 Total amount of time holding the ball in Keepaway\n"));
+ print(_("^3score^7 Total score\n\n"));
+
+ print(_("Before a field you can put a + or - sign, then a comma separated list\n"
+ "of game types, then a slash, to make the field show up only in these\n"
+ "or in all but these game types. You can also specify 'all' as a\n"
+ "field to show all fields available for the current game mode.\n\n"));
+
+ print(_("The special game type names 'teams' and 'noteams' can be used to\n"
+ "include/exclude ALL teams/noteams game modes.\n\n"));
+
+ print(_("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"));
+ print(_("will display name, ping and pl aligned to the left, and the fields\n"
+ "right of the vertical bar aligned to the right.\n"));
+ print(_("'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+ "other gamemodes except DM.\n"));
}
string HUD_DefaultColumnLayout()
{
return strcat( // fteqcc sucks
"ping pl name | ",
- "-teams,race,lms/kills -teams,lms/deaths -teams,lms,race/suicides -race,dm,tdm/frags ", // tdm already has this in "score"
+ "-teams,race,lms/kills +freezetag/kills -teams,lms/deaths +freezetag/deaths -teams,lms,race,ka/suicides +freezetag/suicides -race,dm,tdm,ka,freezetag/frags ", // tdm already has this in "score"
"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ",
"+lms/lives +lms/rank ",
"+kh/caps +kh/pushes +kh/destroyed ",
"?+race/laps ?+race/time ?+race/fastest ",
- "+as/objectives +nexball/faults +nexball/goals ",
+ "+as/objectives +nexball/faults +nexball/goals +ka/pickups +ka/bckills +ka/bctime +freezetag/revivals ",
"-lms,race,nexball/score");
}
// TODO: re enable with gametype dependant cvars?
if(argc < 2) // no arguments provided
- argc = tokenizebyseparator(strcat("x ", cvar_string("scoreboard_columns")), " ");
+ argc = tokenizebyseparator(strcat("x ", autocvar_scoreboard_columns), " ");
if(argc < 2)
argc = tokenizebyseparator(strcat("x ", HUD_DefaultColumnLayout()), " ");
hud_num_fields = 0;
- drawfont = hud_font;
hud_fontsize = HUD_GetFontsize("hud_fontsize");
for(i = 0; i < argc - 1; ++i)
pattern = substring(str, 0, slash);
str = substring(str, slash + 1, strlen(str) - (slash + 1));
- if not(isGametypeInFilter(gametype, teamplay, pattern))
+ if not(isGametypeInFilter(gametype, teamplay, FALSE, pattern))
continue;
}
strunzone(hud_title[hud_num_fields]);
- hud_title[hud_num_fields] = strzone(str);
+ hud_title[hud_num_fields] = strzone(TranslateScoresLabel(str));
hud_size[hud_num_fields] = stringwidth(str, FALSE, hud_fontsize);
str = strtolower(str);
else
{
if not(nocomplain)
- print(strcat("^1Error:^7 Unknown score field: '", str, "'\n"));
+ print(sprintf("^1Error:^7 Unknown score field: '%s'\n", str));
continue;
}
:found
hud_size[i] = hud_size[i-1];
hud_field[i] = hud_field[i-1];
}
- hud_title[0] = strzone("name");
+ hud_title[0] = strzone(TranslateScoresLabel("name"));
hud_field[0] = SP_NAME;
++hud_num_fields;
- print("fixed missing field 'name'\n");
+ print(sprintf(_("fixed missing field '%s'\n"), "name"));
if(!have_separator)
{
hud_field[1] = SP_SEPARATOR;
hud_size[1] = stringwidth("|", FALSE, hud_fontsize);
++hud_num_fields;
- print("fixed missing field '|'\n");
+ print(sprintf(_("fixed missing field '%s'\n"), "|"));
}
}
else if(!have_separator)
hud_size[hud_num_fields] = stringwidth("|", FALSE, hud_fontsize);
hud_field[hud_num_fields] = SP_SEPARATOR;
++hud_num_fields;
- print("fixed missing field '|'\n");
+ print(sprintf(_("fixed missing field '%s'\n"), "|"));
}
if(!have_secondary)
{
strunzone(hud_title[hud_num_fields]);
- hud_title[hud_num_fields] = strzone(scores_label[ps_secondary]);
+ hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_secondary]));
hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize);
hud_field[hud_num_fields] = ps_secondary;
++hud_num_fields;
- print("fixed missing field '", scores_label[ps_secondary], "'\n");
+ print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_secondary]));
}
if(!have_primary)
{
strunzone(hud_title[hud_num_fields]);
- hud_title[hud_num_fields] = strzone(scores_label[ps_primary]);
+ hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_primary]));
hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize);
hud_field[hud_num_fields] = ps_primary;
++hud_num_fields;
- print("fixed missing field '", scores_label[ps_primary], "'\n");
+ print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_primary]));
}
}
{
case SP_PING:
if not(pl.gotscores)
- return "\x8D\x8D\x8D"; // >>> sign
+ return "\xEE\x82\x8D\xEE\x82\x8D\xEE\x82\x8D"; // >>> sign
//str = getplayerkey(pl.sv_entnum, "ping");
f = pl.ping;
if(f == 0)
- return "N/A";
+ return _("N/A");
tmp = max(0, min(220, f-80)) / 220;
hud_field_rgb = '1 1 1' - '0 1 1'*tmp;
return ftos(f);
case SP_PL:
if not(pl.gotscores)
- return "N/A";
+ return _("N/A");
f = pl.ping_packetloss;
tmp = pl.ping_movementloss;
if(f == 0 && tmp == 0)
if(denom == 0) {
hud_field_rgb = '0 1 0';
- str = ftos(num);
+ str = sprintf("%d", num);
} else if(num <= 0) {
hud_field_rgb = '1 0 0';
- str = ftos(num/denom);
+ str = sprintf("%.1f", num/denom);
} else
- str = ftos(num/denom);
-
- tmp = strstrofs(str, ".", 0);
- if(tmp > 0)
- str = substring(str, 0, tmp+2);
+ str = sprintf("%.1f", num/denom);
return str;
default:
is_spec = (GetPlayerColor(pl.sv_entnum) == COLOR_SPECTATOR);
if((rgb == '1 1 1') && (!is_spec)) {
- rgb_x = cvar("scoreboard_color_bg_r") + 0.5;
- rgb_y = cvar("scoreboard_color_bg_g") + 0.5;
- rgb_z = cvar("scoreboard_color_bg_b") + 0.5; }
+ rgb_x = autocvar_scoreboard_color_bg_r + 0.5;
+ rgb_y = autocvar_scoreboard_color_bg_g + 0.5;
+ rgb_z = autocvar_scoreboard_color_bg_b + 0.5; }
// Layout:
tmp_x = sbwidth;
return 1;
else if (intermission == 1)
return 1;
- else if (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard"))
+ else if (intermission == 2)
+ return 0;
+ else if (getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS)
+ return 1;
+ else if (spectatee_status == -1)
return 1;
else if (scoreboard_showscores_force)
return 1;
vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
{
float i;
- float weapon_hit, weapon_damage, weapon_stats;
float weapon_cnt = WEP_COUNT - 3; // either minstanex/nex are hidden, no port-o-launch, no tuba
float rows;
- if(cvar("scoreboard_accuracy_doublerows"))
+ if(autocvar_scoreboard_accuracy_doublerows)
rows = 2;
else
rows = 1;
float weapon_height = height * 2/3;
float weapon_width = sbwidth / weapon_cnt;
- drawstring(pos, strcat("Accuracy stats (average ", ftos(average_accuracy), "%)"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y;
vector tmp;
tmp_x = sbwidth;
drawfill(pos + '0 1 0' * weapon_height + '0 1 0' * height * i, '1 0 0' * sbwidth + '0 1 0' * fontsize, '1 1 1', scoreboard_highlight_alpha, DRAWFLAG_NORMAL);
}
- drawfont = hud_bigfont;
average_accuracy = 0;
float weapons_with_stats;
weapons_with_stats = 0;
if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX)
g_minstagib = 1; // TODO: real detection for minstagib?
+ float weapon_stats, weapon_number;
+
if (!acc_levels)
rgb = '1 1 1';
+ else if (acc_col_x[0] == -1)
+ for (i = 0; i < acc_levels; ++i)
+ acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i))));
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
{
continue;
if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA) // skip port-o-launch, nex || minstanex and tuba
continue;
- weapon_hit = weapon_hits[i-WEP_FIRST];
- weapon_damage = weapon_fired[i-WEP_FIRST];
- if(weapon_damage)
- weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
- float weapon_alpha;
+ weapon_stats = weapon_accuracy[i-WEP_FIRST];
- if(weapon_damage)
+ float weapon_alpha;
+ if(weapon_stats >= 0)
weapon_alpha = scoreboard_alpha_fg;
else
weapon_alpha = 0.2 * scoreboard_alpha_fg;
// weapon icon
drawpic_aspect_skin(pos, strcat("weapon", self.netname), '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
// the accuracy
- if(weapon_damage) {
+ if(weapon_stats >= 0) {
weapons_with_stats += 1;
average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy
string s;
- s = strcat(ftos(weapon_stats),"%");
+ s = sprintf(_("%d%%"), weapon_stats*100);
float padding;
padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value
- weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
- if(weapon_damage)
- {
- weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
- weapon_stats = floor(100 * weapon_hit / weapon_damage);
- }
-
if (acc_levels)
{
// find the max level lower than weapon_stats
// inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
float factor;
factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
- rgb = acc_color(j);
- rgb = rgb + factor * (acc_color(j+1) - rgb);
+ rgb = acc_col[j];
+ rgb = rgb + factor * (acc_col[j+1] - rgb);
}
drawstring(pos + '1 0 0' * padding + '0 1 0' * weapon_height, s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += height;
}
}
- drawfont = hud_font;
if(weapons_with_stats)
average_accuracy = floor(average_accuracy / weapons_with_stats);
float is_spec;
is_spec = (GetPlayerColor(pl.sv_entnum) == COLOR_SPECTATOR);
vector hl_rgb;
- hl_rgb_x = cvar("scoreboard_color_bg_r") + 0.5;
- hl_rgb_y = cvar("scoreboard_color_bg_g") + 0.5;
- hl_rgb_z = cvar("scoreboard_color_bg_b") + 0.5;
+ hl_rgb_x = autocvar_scoreboard_color_bg_r + 0.5;
+ hl_rgb_y = autocvar_scoreboard_color_bg_g + 0.5;
+ hl_rgb_z = autocvar_scoreboard_color_bg_b + 0.5;
pos_y += hud_fontsize_y;
- drawstring(pos, strcat("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawstring(pos, _("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += hud_fontsize_y;
vector tmp;
tmp_x = sbwidth;
}
if(hud_woulddrawscoreboard) {
- float scoreboard_fadeinspeed = cvar_or("scoreboard_fadeinspeed", 10);
+ float scoreboard_fadeinspeed = autocvar_scoreboard_fadeinspeed;
if (scoreboard_fadeinspeed)
scoreboard_fade_alpha = bound (0, (time - hud_woulddrawscoreboard_change) * scoreboard_fadeinspeed, 1);
else
scoreboard_fade_alpha = 1;
}
else {
- float scoreboard_fadeoutspeed = cvar_or("scoreboard_fadeoutspeed", 5);
+ float scoreboard_fadeoutspeed = autocvar_scoreboard_fadeoutspeed;
if (scoreboard_fadeoutspeed)
scoreboard_fade_alpha = bound (0, (1/scoreboard_fadeoutspeed - (time - hud_woulddrawscoreboard_change)) * scoreboard_fadeoutspeed, 1);
else
HUD_UpdatePlayerTeams();
- scoreboard_alpha_bg = cvar("scoreboard_alpha_bg") * scoreboard_fade_alpha * (1 - cvar("_menu_alpha"));
- scoreboard_alpha_fg = cvar_or("scoreboard_alpha_fg", 1.0) * scoreboard_fade_alpha * (1 - cvar("_menu_alpha"));
- scoreboard_highlight = cvar("scoreboard_highlight");
- scoreboard_highlight_alpha = cvar_or("scoreboard_highlight_alpha", 0.10) * scoreboard_alpha_fg;
- scoreboard_highlight_alpha_self = cvar_or("scoreboard_highlight_alpha_self", 0.25) * scoreboard_alpha_fg;
- scoreboard_alpha_name = cvar_or("scoreboard_alpha_name", 0.9) * scoreboard_alpha_fg;
- scoreboard_alpha_name_self = cvar_or("scoreboard_alpha_name_self", 1) * scoreboard_alpha_fg;
+ scoreboard_alpha_bg = autocvar_scoreboard_alpha_bg * scoreboard_fade_alpha * (1 - autocvar__menu_alpha);
+ scoreboard_alpha_fg = autocvar_scoreboard_alpha_fg * scoreboard_fade_alpha * (1 - autocvar__menu_alpha);
+ scoreboard_highlight = autocvar_scoreboard_highlight;
+ scoreboard_highlight_alpha = autocvar_scoreboard_highlight_alpha * scoreboard_alpha_fg;
+ scoreboard_highlight_alpha_self = autocvar_scoreboard_highlight_alpha_self * scoreboard_alpha_fg;
+ scoreboard_alpha_name = autocvar_scoreboard_alpha_name * scoreboard_alpha_fg;
+ scoreboard_alpha_name_self = autocvar_scoreboard_alpha_name_self * scoreboard_alpha_fg;
vector rgb, pos, tmp;
entity pl, tm;
- xmin = cvar("scoreboard_offset_left") * vid_conwidth;
- ymin = cvar("con_notify") * cvar("con_notifysize");
+ xmin = autocvar_scoreboard_offset_left * vid_conwidth;
+ ymin = autocvar_con_notify * autocvar_con_notifysize;
- xmax = (1 - cvar("scoreboard_offset_right")) * vid_conwidth;
+ xmax = (1 - autocvar_scoreboard_offset_right) * vid_conwidth;
ymax = vid_conheight - ymin;
sbwidth = xmax - xmin;
pos_z = 0;
// Heading
- drawfont = hud_bigfont;
- drawstring(pos, "Scoreboard", '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawstring(pos, _("Scoreboard"), '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth("Scoreboard", FALSE, '24 24 0'));
+ centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth(_("Scoreboard"), FALSE, '24 24 0'));
centerprint_start_y = pos_y;
pos_y += 24;
- drawfont = hud_font;
-
// Draw the scoreboard
- vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * cvar("scoreboard_bg_scale");
+ vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale;
if(teamplay)
{
}
else
{
- rgb_x = cvar("scoreboard_color_bg_r");
- rgb_y = cvar("scoreboard_color_bg_g");
- rgb_z = cvar("scoreboard_color_bg_b");
+ rgb_x = autocvar_scoreboard_color_bg_r;
+ rgb_y = autocvar_scoreboard_color_bg_g;
+ rgb_z = autocvar_scoreboard_color_bg_b;
for(tm = teams.sort_next; tm; tm = tm.sort_next)
{
if(gametype == GAME_CTS || gametype == GAME_RACE) {
if(race_speedaward) {
- drawcolorcodedstring(pos, strcat("Speed award: ", ftos(race_speedaward), " ^7(", race_speedaward_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawcolorcodedstring(pos, sprintf(_("Speed award: %d ^7(%s^7)"), race_speedaward, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y;
}
if(race_speedaward_alltimebest) {
- drawcolorcodedstring(pos, strcat("All-time fastest: ", ftos(race_speedaward_alltimebest), " ^7(", race_speedaward_alltimebest_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y;
}
pos = HUD_DrawScoreboardRankings(pos, pl, rgb, bg_size);
}
- else if(cvar("scoreboard_accuracy") && spectatee_status != -1 && !warmup_stage) {
+ else if(autocvar_scoreboard_accuracy && spectatee_status != -1 && !warmup_stage) {
if(teamplay)
pos = HUD_DrawScoreboardAccuracyStats(pos, GetTeamRGB(myteam), bg_size);
else
if(specs)
{
- drawstring(tmp, "Spectators", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+ drawstring(tmp, _("Spectators"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y;
}
// Print info string
string str;
float tl, fl, ll;
- str = strcat("playing on ^2", shortmapname, "^7");
+ str = sprintf(_("playing on ^2%s^7"), shortmapname);
tl = getstatf(STAT_TIMELIMIT);
fl = getstatf(STAT_FRAGLIMIT);
ll = getstatf(STAT_LEADLIMIT);
if(gametype == GAME_LMS)
{
if(tl > 0)
- str = strcat(str, " for up to ^1", ftos(tl), " minutes^7");
+ str = strcat(str, sprintf(_(" for up to ^1%.1f minutes^7"), tl));
}
else
{
if(tl > 0)
- str = strcat(str, " for ^1", ftos(tl), " minutes^7");
+ str = strcat(str, sprintf(_(" for up to ^1%.1f minutes^7"), tl));
if(fl > 0)
{
if(tl > 0)
- str = strcat(str, " or");
+ str = strcat(str, _(" or"));
if(teamplay)
{
- str = strcat(str, " until ^3", ScoreString(teamscores_flags[ts_primary], fl));
- if(teamscores_label[ts_primary] == "score")
- str = strcat(str, " points^7");
- else if(teamscores_label[ts_primary] == "fastest")
- str = strcat(str, " is beaten^7");
- else
- str = strcat(str, " ", teamscores_label[ts_primary]);
+ str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], fl),
+ (teamscores_label[ts_primary] == "score") ? CTX(_("SCO^points")) :
+ (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+ TranslateScoresLabel(teamscores_label[ts_primary])));
}
else
{
- str = strcat(str, " until ^3", ScoreString(scores_flags[ps_primary], fl));
- if(scores_label[ps_primary] == "score")
- str = strcat(str, " points^7");
- else if(scores_label[ps_primary] == "fastest")
- str = strcat(str, " is beaten^7");
- else
- str = strcat(str, " ", scores_label[ps_primary]);
+ str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(scores_flags[ps_primary], fl),
+ (scores_label[ps_primary] == "score") ? CTX(_("SCO^points")) :
+ (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+ TranslateScoresLabel(scores_label[ps_primary])));
}
}
if(ll > 0)
{
if(tl > 0 || fl > 0)
- str = strcat(str, " or");
+ str = strcat(str, _(" or"));
if(teamplay)
{
- str = strcat(str, " until a lead of ^3", ScoreString(teamscores_flags[ts_primary], ll));
- if(teamscores_label[ts_primary] == "score")
- str = strcat(str, " points^7");
- else if(teamscores_label[ts_primary] == "fastest")
- str = strcat(str, " is beaten^7");
- else
- str = strcat(str, " ", teamscores_label[ts_primary]);
+ str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], ll),
+ (teamscores_label[ts_primary] == "score") ? CTX(_("SCO^points")) :
+ (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+ TranslateScoresLabel(teamscores_label[ts_primary])));
}
else
{
- str = strcat(str, " until a lead of ^3", ScoreString(scores_flags[ps_primary], ll));
- if(scores_label[ps_primary] == "score")
- str = strcat(str, " points^7");
- else if(scores_label[ps_primary] == "fastest")
- str = strcat(str, " is beaten^7");
- else
- str = strcat(str, " ", scores_label[ps_primary]);
+ str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(scores_flags[ps_primary], ll),
+ (scores_label[ps_primary] == "score") ? CTX(_("SCO^points")) :
+ (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+ TranslateScoresLabel(scores_label[ps_primary])));
}
}
}
scoreboard_bottom = pos_y + 2 * hud_fontsize_y;
}
-
-void HUD_DrawAccuracyStats_Description_Hitscan(vector position)
-{
- drawstring(position + '0 3 0' * hud_fontsize_y, "Shots fired:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 5 0' * hud_fontsize_y, "Shots hit:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 9 0' * hud_fontsize_y, "Shots missed:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-}
-
-void HUD_DrawAccuracyStats_Description_Splash(vector position)
-{
- drawstring(position + '0 3 0' * hud_fontsize_y, "Maximum damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 5 0' * hud_fontsize_y, "Actual damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
- drawstring(position + '0 9 0' * hud_fontsize_y, "Damage wasted:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-}
-
-void HUD_DrawAccuracyStats()
-{
- float i, count_hitscan, count_splash, row; // count is the number of 'colums'
- float weapon_hit, weapon_damage, weapon_stats;
- float left_border; // position where the weapons start, the description is in the border
- vector fill_colour, fill_size;
- vector pos;
- vector border_colour;
-
- float col_margin = 20; // pixels between the columns
- float row_margin = 20; // pixels between the rows
-
- fill_size_x = 5 * hud_fontsize_x; // width of the background
- fill_size_y = 10 * hud_fontsize_y; // height of the background
-
- drawfont = hud_bigfont;
- pos_x = 0;
- pos_y = SCOREBOARD_OFFSET;
- pos_z = 0;
- drawstringcenter(pos, "Weapon Accuracy", 2 * hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- left_border = col_margin + 11 * hud_fontsize_x;
-
- drawfont = hud_font;
-
- if(warmup_stage)
- {
- pos_y += 40;
- if(mod(time, 1) >= 0.4)
- drawstringcenter(pos, "Stats are not tracked during warmup stage", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- return;
- }
-
- if(gametype == GAME_RACE || gametype == GAME_CTS)
- {
- pos_y += 40;
- if(mod(time, 1) >= 0.4)
- drawstringcenter(pos, "Stats are not tracked in Race/CTS", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- return;
- }
-
- float top_border_hitscan = SCOREBOARD_OFFSET + 55; // position where the hitscan row starts: pixels down the screen
- HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * top_border_hitscan);
-
- float top_border_splash = SCOREBOARD_OFFSET + 175; // position where the splash row starts: pixels down the screen
- HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * top_border_splash);
-
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- {
- self = get_weaponinfo(i);
- if not(self.weapons)
- continue;
- weapon_hit = weapon_hits[i-WEP_FIRST];
- weapon_damage = weapon_fired[i-WEP_FIRST];
- border_colour = (i == activeweapon) ? '1 1 1' : '0 0 0'; // white or black border
-
- if (weapon_damage) {
- if (self.spawnflags & WEP_TYPE_SPLASH) {
- weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
-
- fill_colour_x = 1 - 0.015 * weapon_stats;
- fill_colour_y = 1 - 0.015 * (100 - weapon_stats);
-
- // how the background colour is calculated
- // % red green red_2 green_2
- // 0 1 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 10 0.85 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 20 0.70 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 30 0.55 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 40 0.40 0.10 1 - % * 0.015 1 - (100 - %) * 0.015
- // 50 0.25 0.25 1 - % * 0.015 1 - (100 - %) * 0.015
- // 60 0.10 0.40 1 - % * 0.015 1 - (100 - %) * 0.015
- // 70 0 0.55 1 - % * 0.015 1 - (100 - %) * 0.015
- // 80 0 0.70 1 - % * 0.015 1 - (100 - %) * 0.015
- // 90 0 0.85 1 - % * 0.015 1 - (100 - %) * 0.015
- // 100 0 1 1 - % * 0.015 1 - (100 - %) * 0.015
-
- if ((left_border + count_splash * (fill_size_x + col_margin) + fill_size_x) >= vid_conwidth)
- {
- count_splash = 0;
- ++row;
- HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * (top_border_splash + row * (fill_size_y + row_margin)));
- }
-
- pos_x = left_border + count_splash * (fill_size_x + col_margin);
- pos_y = top_border_splash + row * (fill_size_y + row_margin);
-
- // background
- drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
- drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-
- // the weapon
- drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of shots fired or max damage
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of hits or actual damage
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the accuracy
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of shots missed or damage wasted
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- ++count_splash;
- } else if (self.spawnflags & WEP_TYPE_HITSCAN) {
- weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100);
-
- fill_colour_x = 1 - 0.015 * weapon_stats;
- fill_colour_y = 1 - 0.015 * (100 - weapon_stats);
-
- // how the background colour is calculated
- // % red green red_2 green_2
- // 0 1 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 10 0.850 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 20 0.70 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 30 0.55 0 1 - % * 0.015 1 - (100 - %) * 0.015
- // 40 0.40 0.10 1 - % * 0.015 1 - (100 - %) * 0.015
- // 50 0.25 0.25 1 - % * 0.015 1 - (100 - %) * 0.015
- // 60 0.10 0.40 1 - % * 0.015 1 - (100 - %) * 0.015
- // 70 0 0.55 1 - % * 0.015 1 - (100 - %) * 0.015
- // 80 0 0.70 1 - % * 0.015 1 - (100 - %) * 0.015
- // 90 0 0.85 1 - % * 0.015 1 - (100 - %) * 0.015
- // 100 0 1 1 - % * 0.015 1 - (100 - %) * 0.015
-
- if ((left_border + count_hitscan * (fill_size_x + col_margin) + fill_size_x + cvar("stats_right_margin")) >= vid_conwidth)
- {
- count_hitscan = 0;
- ++row;
- HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * (top_border_hitscan + row * (fill_size_y + row_margin)));
- }
-
- pos_x = left_border + count_hitscan * (fill_size_x + col_margin);
- pos_y = top_border_hitscan + row * (fill_size_y + row_margin);
-
- // background
- drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
- drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL);
-
- // the weapon
- drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of shots fired or max damage
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of hits or actual damage
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the accuracy
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- // the amount of shots missed or damage wasted
- drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
- ++count_hitscan;
- }
- }
- }
-}
else
e.state = 0;
}
- vol = e.state * e.volume * cvar("bgmvolume");
+ vol = e.state * e.volume * autocvar_bgmvolume;
if(vol != vol0)
{
if(vol0 < 0)
sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
if(getsoundtime(e, CHAN_VOICE) < 0)
{
- print("Cannot initialize sound ", e.noise, "\n");
+ print(sprintf(_("Cannot initialize sound %s\n"), e.noise));
strunzone(e.noise);
e.noise = string_null;
}
sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
if(getsoundtime(self, CHAN_VOICE) < 0)
{
- print("Cannot initialize sound ", self.noise, "\n");
+ print(sprintf(_("Cannot initialize sound %s\n"), self.noise));
strunzone(self.noise);
self.noise = string_null;
}
{
switch(color)
{
- default: return "Spectators";
- case COLOR_TEAM1: return "Red Team";
- case COLOR_TEAM2: return "Blue Team";
- case COLOR_TEAM3: return "Yellow Team";
- case COLOR_TEAM4: return "Pink Team";
+ default: return _("Spectators");
+ case COLOR_TEAM1: return _("Red Team");
+ case COLOR_TEAM2: return _("Blue Team");
+ case COLOR_TEAM3: return _("Yellow Team");
+ case COLOR_TEAM4: return _("Pink Team");
}
}
void teamradar_loadcvars()
{
- v_flipped = cvar("v_flipped");
- hud_panel_radar_scale = cvar("hud_panel_radar_scale");
- hud_panel_radar_foreground_alpha = cvar("hud_panel_radar_foreground_alpha") * panel_fg_alpha;
- hud_panel_radar_rotation = cvar("hud_panel_radar_rotation");
- hud_panel_radar_zoommode = cvar("hud_panel_radar_zoommode");
+ v_flipped = autocvar_v_flipped;
+ hud_panel_radar_scale = autocvar_hud_panel_radar_scale;
+ hud_panel_radar_foreground_alpha = autocvar_hud_panel_radar_foreground_alpha * panel_fg_alpha;
+ hud_panel_radar_rotation = autocvar_hud_panel_radar_rotation;
+ hud_panel_radar_zoommode = autocvar_hud_panel_radar_zoommode;
// others default to 0
// match this to defaultXonotic.cfg!
void Ent_TubaNote_Think()
{
float f;
- f = cvar("g_balance_tuba_fadetime");
+ f = autocvar_g_balance_tuba_fadetime;
if(f > 0)
self.cnt -= frametime * self.count / f;
else
remove(self);
}
else
- sound(self, CHAN_PROJECTILE, "", self.cnt, self.attenuate * cvar("g_balance_tuba_attenuation"));
+ sound(self, CHAN_PROJECTILE, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
}
void Ent_TubaNote_UpdateSound()
{
- self.enemy.cnt = bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1);
+ self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
self.enemy.count = self.enemy.cnt;
- sound(self.enemy, CHAN_PROJECTILE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * cvar("g_balance_tuba_attenuation"));
+ sound(self.enemy, CHAN_PROJECTILE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
}
void Ent_TubaNote_StopSound()
if(self.lodmodelindex1)
{
- d = cvar("loddebug");
+ d = autocvar_loddebug;
if(d > 0)
{
if(d == 1)
if(self.hideflags & 2)
return; // radar only
- if(cvar("cl_hidewaypoints") >= 2)
+ if(autocvar_cl_hidewaypoints >= 2)
return;
if(self.hideflags & 1)
- if(cvar("cl_hidewaypoints"))
+ if(autocvar_cl_hidewaypoints)
return; // fixed waypoint
InterpolateOrigin_Do();
d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
/*
- if(cvar("v_flipped"))
+ if(autocvar_v_flipped)
d_x = -d_x;
*/
else
self.build_starthealth = 0;
self.build_finished = servertime + t / 32;
- //print("build: ", ftos(self.build_finished - self.build_started), "\n");
}
}
else
void WaypointSprite_Load()
{
- waypointsprite_fadedistance = vlen(mi_max - mi_min);
- waypointsprite_normdistance = cvar("g_waypointsprite_normdistance");
- waypointsprite_minscale = cvar("g_waypointsprite_minscale");
- waypointsprite_minalpha = cvar("g_waypointsprite_minalpha");
- waypointsprite_distancealphaexponent = cvar("g_waypointsprite_distancealphaexponent");
- waypointsprite_timealphaexponent = cvar("g_waypointsprite_timealphaexponent");
- waypointsprite_scale = cvar_or("g_waypointsprite_scale", 1);
- waypointsprite_edgefadealpha = cvar_or("g_waypointsprite_edgefadealpha", 1);
- waypointsprite_edgefadescale = cvar_or("g_waypointsprite_edgefadescale", 1);
- waypointsprite_edgefadedistance = cvar("g_waypointsprite_edgefadedistance");
- waypointsprite_crosshairfadealpha = cvar_or("g_waypointsprite_crosshairfadealpha", 1);
- waypointsprite_crosshairfadescale = cvar_or("g_waypointsprite_crosshairfadescale", 1);
- waypointsprite_crosshairfadedistance = cvar("g_waypointsprite_crosshairfadedistance");
- waypointsprite_distancefadealpha = cvar_or("g_waypointsprite_distancefadealpha", 1);
- waypointsprite_distancefadescale = cvar_or("g_waypointsprite_distancefadescale", 1);
- waypointsprite_distancefadedistance = vlen(mi_max - mi_min) * cvar_or("g_waypointsprite_distancefadedistancemultiplier", 1);
- waypointsprite_alpha = cvar_or("g_waypointsprite_alpha", 1) * (1 - cvar("_menu_alpha"));
+ waypointsprite_fadedistance = vlen(mi_scale);
+ waypointsprite_normdistance = autocvar_g_waypointsprite_normdistance;
+ waypointsprite_minscale = autocvar_g_waypointsprite_minscale;
+ waypointsprite_minalpha = autocvar_g_waypointsprite_minalpha;
+ waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
+ waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
+ waypointsprite_scale = autocvar_g_waypointsprite_scale;
+ waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
+ waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
+ waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
+ waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
+ waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
+ waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
+ waypointsprite_distancefadealpha = autocvar_g_waypointsprite_distancefadealpha;
+ waypointsprite_distancefadescale = autocvar_g_waypointsprite_distancefadescale;
+ waypointsprite_distancefadedistance = waypointsprite_fadedistance * autocvar_g_waypointsprite_distancefadedistancemultiplier;
+ waypointsprite_alpha = autocvar_g_waypointsprite_alpha * (1 - autocvar__menu_alpha);
if(!waypointsprite_initialized)
{
db_put(tempdb, sname, ftos(max(f, stof(db_get(tempdb, sname)))));
}
search_end(dh);
+ waypointsprite_initialized = true;
}
- waypointsprite_initialized = 1;
}
const float GAME_NEXBALL = 12;
const float GAME_CTS = 13;
const float GAME_CA = 14;
+const float GAME_FREEZETAG = 15;
+const float GAME_KEEPAWAY = 16;
const float AS_STRING = 1;
const float AS_INT = 2;
const float TE_CSQC_TARGET_MUSIC = 111;
const float TE_CSQC_NOTIFY = 112;
const float TE_CSQC_WEAPONCOMPLAIN = 113;
-const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115;
const float TE_CSQC_NEX_SCOPE = 116;
const float TE_CSQC_CR_MAXBULLETS = 117;
const float ENT_CLIENT_HOOK = 27;
const float ENT_CLIENT_LGBEAM = 28;
const float ENT_CLIENT_GAUNTLET = 29;
+const float ENT_CLIENT_ACCURACY = 30;
const float ENT_CLIENT_TURRET = 40;
const float STAT_GAMESTARTTIME = 37;
const float STAT_STRENGTH_FINISHED = 38;
const float STAT_INVINCIBLE_FINISHED = 39;
-const float STAT_DAMAGE_HITS = 40; // Used by the weapon stats code, represents the total amount of damage done to other players
-const float STAT_DAMAGE_FIRED = 41;// Used by the weapon stats code, represents the total amount of potential damage fired
const float STAT_PRESSED_KEYS = 42;
const float STAT_ALLOW_OLDNEXBEAM = 43; // this stat could later contain some other bits of info, like, more server-side particle config
const float STAT_FUEL = 44;
const float STAT_LEADLIMIT = 47;
const float STAT_BULLETS_LOADED = 48;
const float STAT_NEX_CHARGE = 49;
-const float STAT_LAST_PICKUP = 50;
+const float STAT_LAST_PICKUP = 50;
const float STAT_HUD = 51;
+const float STAT_NEX_CHARGEPOOL = 52;
+const float STAT_HIT_TIME = 53;
+const float STAT_TYPEHIT_TIME = 54;
// see DP source, quakedef.h
const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
+const float STAT_MOVEVARS_MAXSPEED = 244;
const float STAT_MOVEVARS_AIRACCEL_QW = 254;
const float CTF_STATE_ATTACK = 1;
// mod stats (1xx)
const float STAT_REDALIVE = 100;
const float STAT_BLUEALIVE = 101;
+const float STAT_YELLOWALIVE = 102;
+const float STAT_PINKALIVE = 103;
+
+// freeze tag
+const float STAT_FROZEN = 104;
+const float STAT_REVIVE_PROGRESS = 105;
//const float STAT_SPIDERBOT_AIM 53 // compressShotOrigin
//const float STAT_SPIDERBOT_TARGET 54 // compressShotOrigin
float MSG_KILL_ACTION = 3;
float MSG_KILL_ACTION_SPREE = 4;
float MSG_INFO = 5;
-
+float MSG_KA = 6;
float MSG_RACE = 10;
float KILL_TEAM_RED = 10301;
float INFO_RETURNFLAG = 10322;
float INFO_CAPTUREFLAG = 10323;
+float KA_PICKUPBALL = 10350;
+float KA_DROPBALL = 10351;
+
float RACE_SERVER_RECORD = 10400;
float RACE_NEW_TIME = 10401;
float RACE_NEW_RANK = 10402;
float HUD_MENU_ENABLE = 0;
#define SERVERFLAG_ALLOW_FULLBRIGHT 1
+#define SERVERFLAG_TEAMPLAY 2
return TRUE;
}
- else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55970)
+ else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55790)
{
// test case for terrencehill's color codes
s = strdecolorize(substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)));
// WEAPON PLUGIN SYSTEM
-entity weapon_info[24];
+entity weapon_info[WEP_MAXCOUNT];
entity dummy_weapon_info;
void register_weapon(float id, float(float) func, float ammotype, float i, float weapontype, float pickupbasevalue, string modelname, string shortname, string wname)
e.model2 = strzone(strcat("wpn-", e.mdl));
e.impulse = i;
e.bot_pickupbasevalue = pickupbasevalue;
+ if(ammotype & IT_SHELLS)
+ e.ammo_field = ammo_shells;
+ else if(ammotype & IT_NAILS)
+ e.ammo_field = ammo_nails;
+ else if(ammotype & IT_ROCKETS)
+ e.ammo_field = ammo_rockets;
+ else if(ammotype & IT_CELLS)
+ e.ammo_field = ammo_cells;
+ else if(ammotype & IT_FUEL)
+ e.ammo_field = ammo_fuel;
+ else
+ e.ammo_field = ammo_batteries;
}
float w_null(float dummy)
{
float i;
weaponorder_byid = "";
- for(i = 24; i >= 1; --i)
+ for(i = WEP_MAXCOUNT; i >= 1; --i)
if(weapon_info[i-1])
weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i));
weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1));
string W_NameWeaponOrder(string order);
string W_NumberWeaponOrder(string order);
+// ammo types
+.float ammo_shells;
+.float ammo_nails;
+.float ammo_rockets;
+.float ammo_cells;
+.float ammo_fuel;
+.float ammo_batteries; // dummy
+
// entity properties of weaponinfo:
.float weapon; // WEP_...
.float weapons; // WEPBIT_...
.float impulse; // weapon impulse
.float bot_pickupbasevalue; // bot weapon priority
.string model2; // wpn- sprite name
-
-
+..float ammo_field; // main ammo field
// dynamic weapon adding
float w_null(float dummy);
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_DEATHMATCH; // DM always works
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_RUNEMATCH; // Rune always works
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_LMS; // LMS always works
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_KEEPAWAY; // Keepaway always works
if(spawnpoints >= 8 && diameter > 4096) {
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_TEAM_DEATHMATCH;
+ MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_FREEZETAG;
MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CA;
}
if( diameter < 4096)
case MAPINFO_TYPE_ONSLAUGHT: return "20 0";
case MAPINFO_TYPE_NEXBALL: return "5 20 0";
case MAPINFO_TYPE_CTS: return "20 0 0";
+ case MAPINFO_TYPE_FREEZETAG: return "10 20 0";
+ // NOTE: DO NOT ADD ANY MORE GAME TYPES HERE
+ // THIS IS JUST LEGACY SUPPORT FOR NEXUIZ MAPS
+ // ONLY ADD NEW STUFF TO _MapInfo_GetDefaultEx
+ // THIS FUNCTION WILL EVENTUALLY BE REMOVED
default: return "";
}
}
s = cdr(s);
}
+ /* keepaway wuz here
+ if(pWantedType == MAPINFO_TYPE_KEEPAWAY)
+ {
+ sa = car(s);
+ if(sa != "")
+ cvar_set("fraglimit", sa);
+ s = cdr(s);
+ }
+ */
+
// rc = timelimit timelimit_qualification laps laps_teamplay
if(pWantedType == MAPINFO_TYPE_RACE)
{
case MAPINFO_TYPE_ONSLAUGHT: return "timelimit=20";
case MAPINFO_TYPE_NEXBALL: return "timelimit=20 pointlimit=5 leadlimit=0";
case MAPINFO_TYPE_CTS: return "timelimit=20 skill=-1";
+ case MAPINFO_TYPE_FREEZETAG: return "timelimit=20 pointlimit=10 teams=2 leadlimit=0";
+ case MAPINFO_TYPE_KEEPAWAY: return "timelimit=20 pointlimit=30";
default: return "";
}
}
else if(t == "rc") return MAPINFO_TYPE_RACE;
else if(t == "nexball") return MAPINFO_TYPE_NEXBALL;
else if(t == "cts") return MAPINFO_TYPE_CTS;
+ else if(t == "freezetag") return MAPINFO_TYPE_FREEZETAG;
+ else if(t == "keepaway") return MAPINFO_TYPE_KEEPAWAY;
else if(t == "all") return MAPINFO_TYPE_ALL;
else return 0;
}
else if(t == MAPINFO_TYPE_RACE) return "rc";
else if(t == MAPINFO_TYPE_NEXBALL) return "nexball";
else if(t == MAPINFO_TYPE_CTS) return "cts";
+ else if(t == MAPINFO_TYPE_FREEZETAG) return "freezetag";
+ else if(t == MAPINFO_TYPE_KEEPAWAY) return "keepaway";
else if(t == MAPINFO_TYPE_ALL) return "all";
else return "";
}
{
t = car(s); s = cdr(s);
f = MapInfo_Type_FromString(t);
+ print("Map ", pFilename, " contains the legacy 'type' keyword which is deprecated and will be removed in the future. Please migrate the mapinfo file to 'gametype'.\n");
if(f)
_MapInfo_Map_ApplyGametype (s, pGametypeToSet, f, TRUE);
else
return MAPINFO_TYPE_NEXBALL;
else if(cvar("g_cts"))
return MAPINFO_TYPE_CTS;
+ else if(cvar("g_freezetag"))
+ return MAPINFO_TYPE_FREEZETAG;
+ else if(cvar("g_keepaway"))
+ return MAPINFO_TYPE_KEEPAWAY;
else
return MAPINFO_TYPE_DEATHMATCH;
}
case MAPINFO_TYPE_ONSLAUGHT: return "g_onslaught";
case MAPINFO_TYPE_RACE: return "g_race";
case MAPINFO_TYPE_NEXBALL: return "g_nexball";
+ case MAPINFO_TYPE_FREEZETAG: return "g_freezetag";
case MAPINFO_TYPE_CTS: return "g_cts";
+ case MAPINFO_TYPE_KEEPAWAY: return "g_keepaway";
default: return "";
}
}
cvar_set("g_race", (t == MAPINFO_TYPE_RACE) ? "1" : "0");
cvar_set("g_nexball", (t == MAPINFO_TYPE_NEXBALL) ? "1" : "0");
cvar_set("g_cts", (t == MAPINFO_TYPE_CTS) ? "1" : "0");
+ cvar_set("g_freezetag", (t == MAPINFO_TYPE_FREEZETAG) ? "1" : "0");
+ cvar_set("g_keepaway", (t == MAPINFO_TYPE_KEEPAWAY) ? "1" : "0");
}
void MapInfo_LoadMap(string s)
float MAPINFO_TYPE_ASSAULT = 2048;
float MAPINFO_TYPE_ONSLAUGHT = 4096;
float MAPINFO_TYPE_NEXBALL = 8192;
-float MAPINFO_TYPE_ALL = 16383; // this has to include all above bits
+float MAPINFO_TYPE_FREEZETAG = 16384;
+float MAPINFO_TYPE_KEEPAWAY = 32768;
+float MAPINFO_TYPE_ALL = 65535; // this has to include all above bits
float MAPINFO_FEATURE_WEAPONS = 1; // not defined for minstagib-only maps
#pragma flag enable subscope
#pragma flag enable lo
-
-//float log(float x);
-#define log log_builtin \
- #undef log \
- /* turn the next use of "log" into a declaration of log_builtin */
-
-// checkextension wrapper for log
-float sqrt(float f); // declared later
-float exp(float f); // declared later
-float pow(float f, float e); // declared later
-float checkextension(string s); // declared later
-float log_synth(float f)
-{
- float p, l;
- if(f < 0)
- return sqrt(-1); // nan? -inf?
- if(f == 0)
- return sqrt(-1); // ACTUALLY this should rather be -inf, but we cannot create a +inf in QC
- if(f + f == f)
- return l; // +inf
- if(f < 1)
- {
- f = 1 / f;
- p = -1;
- }
- else
- p = 1;
- while(f > 2)
- {
- f = sqrt(f);
- p *= 2;
- }
- // two steps are good enough
- l = ((6-f) * f - 5) / 4.32808512266689022212;
- l += exp(-l) * f - 1;
- l += exp(-l) * f - 1;
- return l * p;
-}
-float log(float f)
-{
- if(checkextension("DP_QC_LOG"))
- return log_builtin(f);
- else
- return log_synth(f);
-}
-
string wordwrap_buffer;
void wordwrap_buffer_put(string s)
return -1;
fh = fopen(pFilename, FILE_READ);
if(fh < 0)
- return buf;
+ {
+ buf_del(buf);
+ return -1;
+ }
i = 0;
while((l = fgets(fh)))
{
else if (g == GAME_RACE) return "rc";
else if (g == GAME_NEXBALL) return "nexball";
else if (g == GAME_CTS) return "cts";
+ else if (g == GAME_FREEZETAG) return "freezetag";
+ else if (g == GAME_KEEPAWAY) return "ka";
return "dm";
}
return strcat(substring(theText, 0, textLengthUpToLength(theText, maxWidth - tw("..."), tw)), "...");
}
-float isGametypeInFilter(float gt, float tp, string pattern)
+float isGametypeInFilter(float gt, float tp, float ts, string pattern)
{
- string subpattern, subpattern2, subpattern3;
+ string subpattern, subpattern2, subpattern3, subpattern4;
subpattern = strcat(",", GametypeNameFromType(gt), ",");
if(tp)
subpattern2 = ",teams,";
else
subpattern2 = ",noteams,";
+ if(ts)
+ subpattern3 = ",teamspawns,";
+ else
+ subpattern3 = ",noteamspawns,";
if(gt == GAME_RACE || gt == GAME_CTS)
- subpattern3 = ",race,";
+ subpattern4 = ",race,";
else
- subpattern3 = string_null;
+ subpattern4 = string_null;
if(substring(pattern, 0, 1) == "-")
{
return 0;
if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) >= 0)
return 0;
- if(subpattern3 && strstrofs(strcat(",", pattern, ","), subpattern3, 0) >= 0)
+ if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) >= 0)
+ return 0;
+ if(subpattern4 && strstrofs(strcat(",", pattern, ","), subpattern4, 0) >= 0)
return 0;
}
else
pattern = substring(pattern, 1, strlen(pattern) - 1);
if(strstrofs(strcat(",", pattern, ","), subpattern, 0) < 0)
if(strstrofs(strcat(",", pattern, ","), subpattern2, 0) < 0)
- if((!subpattern3) || strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0)
+ if(strstrofs(strcat(",", pattern, ","), subpattern3, 0) < 0)
+ if((!subpattern4) || strstrofs(strcat(",", pattern, ","), subpattern4, 0) < 0)
return 0;
}
return 1;
fn = get_model_datafilename(m, sk, "txt");
fh = fopen(fn, FILE_READ);
if(fh < 0)
- return 0;
+ {
+ sk = 0;
+ fn = get_model_datafilename(m, sk, "txt");
+ fh = fopen(fn, FILE_READ);
+ if(fh < 0)
+ return 0;
+ }
get_model_parameters_modelname = m;
get_model_parameters_modelskin = sk;
return nearest;
}
#endif
+
+float vercmp_recursive(string v1, string v2)
+{
+ float dot1, dot2;
+ string s1, s2;
+ float r;
+
+ dot1 = strstrofs(v1, ".", 0);
+ dot2 = strstrofs(v2, ".", 0);
+ if(dot1 == -1)
+ s1 = v1;
+ else
+ s1 = substring(v1, 0, dot1);
+ if(dot2 == -1)
+ s2 = v2;
+ else
+ s2 = substring(v2, 0, dot2);
+
+ r = stof(s1) - stof(s2);
+ if(r != 0)
+ return r;
+
+ r = strcasecmp(s1, s2);
+ if(r != 0)
+ return r;
+
+ if(dot1 == -1)
+ if(dot2 == -1)
+ return 0;
+ else
+ return -1;
+ else
+ if(dot2 == -1)
+ return 1;
+ else
+ return vercmp_recursive(substring(v1, dot1 + 1, 999), substring(v2, dot2 + 1, 999));
+}
+
+float vercmp(string v1, string v2)
+{
+ if(strcasecmp(v1, v2) == 0) // early out check
+ return 0;
+
+ // "git" beats all
+ if(v1 == "git")
+ return 1;
+ if(v2 == "git")
+ return -1;
+
+ return vercmp_recursive(v1, v2);
+}
+
+float u8_strsize(string s)
+{
+ float l, i, c;
+ l = 0;
+ for(i = 0; ; ++i)
+ {
+ c = str2chr(s, i);
+ if(c <= 0)
+ break;
+ ++l;
+ if(c >= 0x80)
+ ++l;
+ if(c >= 0x800)
+ ++l;
+ if(c >= 0x10000)
+ ++l;
+ }
+ return l;
+}
+
+// translation helpers
+string language_filename(string s)
+{
+ string fn;
+ float fh;
+ fn = prvm_language;
+ if(fn == "" || fn == "dump")
+ return s;
+ fn = strcat(s, ".", fn);
+ if((fh = fopen(fn, FILE_READ)) >= 0)
+ {
+ fclose(fh);
+ return fn;
+ }
+ return s;
+}
+string CTX(string s)
+{
+ float p = strstrofs(s, "^", 0);
+ if(p < 0)
+ return s;
+ return substring(s, p+1, -1);
+}
string getWrappedLine(float w, vector size, textLengthUpToWidth_widthFunction_t tw);
string getWrappedLineLen(float w, textLengthUpToLength_lenFunction_t tw);
-float isGametypeInFilter(float gt, float tp, string pattern);
+float isGametypeInFilter(float gt, float tp, float ts, string pattern);
typedef void(float i1, float i2, entity pass) swapfunc_t; // is only ever called for i1 < i2
typedef float(float i1, float i2, entity pass) comparefunc_t; // <0 for <, ==0 for ==, >0 for > (like strcmp)
#ifndef MENUQC
vector NearestPointOnBox(entity box, vector org);
#endif
+
+float vercmp(string v1, string v2);
+
+float u8_strsize(string s);
+
+// translation helpers
+string prvm_language;
+string language_filename(string s);
+string CTX(string s);
+#define ZCTX(s) strzone(CTX(s))
--- /dev/null
+# list of words that must not be used in the source as a single string;
+# use ZCTX(_("CONTEXT^string")) instead
+# vi macro to do it:
+# :s/_("\([^"]*\)")/ZCTX(_("CONTEXT^\1"))/g
+# test by:
+# grep -v ^# i18n-badwords.txt | while IFS= read -r W; do grep -nri "_(\"$W\")" menu/xonotic; done | sort -n
+# this is done to help with languages like Russian where these words may need
+# different grammatical gender in different instances
+All
+Best
+Disabled
+Good
+High
+Insane
+Low
+Lowest
+Medium
+Normal
+Off
+Ultra
+Small
+Large
+Custom
+Very short
+Short
+Long
+Full
+Empty
+None
+Few
+Many
+Lots
+Both
+Ambient:
--- /dev/null
+How to make the .po template:
+
+find . -type f -not -name \*.po -not -name \*.txt | xgettext -LC -k_ -f- --from-code utf-8
+
+
+How to compare the .po template against a language file:
+
+msgcmp ../../menu.dat.de.po messages.po
+
+
+How to merge the .po template into a language file:
+
+msgmerge -U ../../menu.dat.de.po messages.po
+
+
+Guideline:
+- do NOT translate strings in error() messages, or in dprint()!
+- delete obviously useless developer prints while at it
+- change obvious developer prints from print to dprint (even in comments),
+ unless in developer-only functions (e.g. *dumptree*)
+- mark translatable strings with _()
+- if a translatable string is a strcat monster, change it to sprintf
+- if code loads files with text, use language_filename()
+- interesting vim macros:
+ :map # /"<return>
+ :map ' i_(<esc>2f"a)<esc>/"<return>
+ :map " F"isprintf(_(<esc>%i), )<esc>i
+
+Unresolved TODO:
+
+- translated campaigns
n.prevSibling = p;
else
me.lastChild = p;
+ remove(other);
}
void AnimHost_removeAllAnim(entity me)
{
tmp = e;
e = tmp.prevSibling;
- me.removeAnim(me, tmp);
tmp.finishAnim(tmp);
}
}
{
tmp = e;
e = tmp.prevSibling;
- me.removeAnim(me, tmp);
tmp.finishAnim(tmp);
}
}
for(e = me.firstChild; e; e = e.nextSibling)
{
e.tick(e, time);
- }
- for(e = me.firstChild; e; e = e.nextSibling)
- {
if (e.isFinished(e))
{
tmp = e;
e = tmp.prevSibling;
me.removeAnim(me, tmp);
- remove(tmp);
}
}
}
#include "xonotic/bigbutton.c"
#include "xonotic/commandbutton.c"
#include "xonotic/bigcommandbutton.c"
+#include "xonotic/dialog_firstrun.c"
#include "xonotic/dialog_teamselect.c"
#include "xonotic/dialog_settings.c"
#include "xonotic/dialog_settings_video.c"
#include "xonotic/dialog_multiplayer_create_mutators.c"
#include "xonotic/dialog_multiplayer_create_advanced.c"
#include "xonotic/dialog_multiplayer_create_mapinfo.c"
-#include "xonotic/gametypebutton.c"
+#include "xonotic/gametypelist.c"
#include "xonotic/maplist.c"
#include "xonotic/skinlist.c"
+#include "xonotic/languagelist.c"
#include "xonotic/image.c"
#include "xonotic/crosshairbutton.c"
#include "xonotic/playermodel.c"
}
void draw_CenterText(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
{
- //print(strcat("orig = ", vtos(theOrigin) ," tx = ", ftos(draw_TextWidth(theText, ICanHasKallerz, theSize)), "\n"));
+ //dprint(strcat("orig = ", vtos(theOrigin) ," tx = ", ftos(draw_TextWidth(theText, ICanHasKallerz, theSize)), "\n"));
draw_Text(theOrigin - eX * 0.5 * draw_TextWidth(theText, ICanHasKallerz, theSize), theText, theSize, theColor, theAlpha, ICanHasKallerz);
}
float draw_TextWidth(string theText, float ICanHasKallerz, vector SizeThxBye)
{
//return strlen(theText);
- //print("draw_TextWidth \"", theText, "\"\n");
+ //dprint("draw_TextWidth \"", theText, "\"\n");
vector v;
v = '0 0 0';
//float r;
}
}
+float curl_uri_get_pos;
+float curl_uri_get_exec[URI_GET_CURL_END - URI_GET_CURL + 1];
+string curl_uri_get_cvar[URI_GET_CURL_END - URI_GET_CURL + 1];
+void Curl_URI_Get_Callback(float id, float status, string data)
+{
+ float i;
+ float do_exec;
+ string do_cvar;
+ i = id - URI_GET_CURL;
+ do_exec = curl_uri_get_exec[i];
+ do_cvar = curl_uri_get_cvar[i];
+ if(status != 0)
+ {
+ print(sprintf(_("error: status is %d\n"), status));
+ return;
+ }
+ if(do_exec)
+ localcmd(data);
+ if(do_cvar)
+ cvar_set(do_cvar, data);
+ if(!do_exec && !do_cvar)
+ print(data);
+}
+
void GameCommand(string theCommand)
{
float argc;
if(argv(0) == "help" || argc == 0)
{
- print("Usage: menu_cmd theCommand..., where possible theCommands are:\n");
- print(" sync - reloads all cvars on the current menu page\n");
- print(" directmenu ITEM - select a menu item as main item\n");
+ print(_("Usage: menu_cmd command..., where possible commands are:\n"));
+ print(_(" sync - reloads all cvars on the current menu page\n"));
+ print(_(" directmenu ITEM - select a menu item as main item\n"));
GameCommand_Generic("help");
return;
}
if(argv(0) == "sync")
{
loadAllCvars(main);
+ updateCompression();
return;
}
return;
}
+ if(argv(0) == "languageselect")
+ {
+ m_goto_language_selector();
+ return;
+ }
+
if(argv(0) == "videosettings")
{
m_goto_video_settings();
return;
}
+ if(argv(0) == "curl")
+ {
+ float do_exec;
+ string do_cvar;
+ float key;
+ float i, j;
+ string url;
+ float buf;
+ float r;
+
+ do_exec = FALSE;
+ do_cvar = string_null;
+ key = -1;
+
+ for(i = 1; i+1 < argc; ++i)
+ {
+ if(argv(i) == "--cvar" && i+2 < argc)
+ {
+ ++i;
+ do_cvar = argv(i);
+ continue;
+ }
+ if(argv(i) == "--exec")
+ {
+ do_exec = TRUE;
+ continue;
+ }
+ if(argv(i) == "--key" && i+2 < argc)
+ {
+ ++i;
+ key = stof(argv(i));
+ continue;
+ }
+ break;
+ }
+
+ // now, argv(i) is the URL
+ // following args may be POST parameters
+ url = argv(i);
+ ++i;
+ buf = buf_create();
+ j = 0;
+ for(; i+1 < argc; i += 2)
+ bufstr_set(buf, ++j, sprintf("%s=%s", uri_escape(argv(i)), uri_escape(argv(i+1))));
+ if(i < argc)
+ bufstr_set(buf, ++j, sprintf("submit=%s", uri_escape(argv(i))));
+
+ if(j == 0) // no args: GET
+ r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, string_null, string_null, -1, key);
+ else // with args: POST
+ r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, "application/x-www-form-urlencoded", "&", buf, key);
+
+ if(r)
+ {
+ curl_uri_get_exec[curl_uri_get_pos] = do_exec;
+ curl_uri_get_cvar[curl_uri_get_pos] = do_cvar;
+ curl_uri_get_pos = mod(curl_uri_get_pos + 1, URI_GET_CURL_END - URI_GET_CURL + 1);
+ }
+ else
+ print(_("error creating curl handle\n"));
+
+ buf_del(buf);
+
+ return;
+ }
+
#if 0
if(argv(0) == "tokentest")
{
}
#endif
- print("Invalid theCommand. For a list of supported theCommands, try menu_cmd help.\n");
+ print(_("Invalid command. For a list of supported commands, try menu_cmd help.\n"));
}
{
me.origin = absOrigin;
me.size = absSize;
- // me.tooltip = "The quick brown fox jumped over the lazy sleeping dog's back then sat on a tack. Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.";
}
void Item_draw(entity me)
}
void BorderImage_draw(entity me)
{
- //print(vtos(me.borderVec), "\n");
-
if(me.src)
draw_BorderPicture('0 0 0', me.src, '1 1 0', me.color, 1, me.borderVec);
if(me.fontSize > 0)
METHOD(Button, mousePress, float(entity, vector))
METHOD(Button, mouseDrag, float(entity, vector))
METHOD(Button, mouseRelease, float(entity, vector))
+ METHOD(Button, focusEnter, void(entity))
ATTRIB(Button, onClick, void(entity, entity), SUB_Null)
ATTRIB(Button, onClickEntity, entity, NULL)
ATTRIB(Button, src, string, string_null)
float Button_mousePress(entity me, vector pos)
{
me.mouseDrag(me, pos); // verify coordinates
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
return 1;
}
float Button_mouseRelease(entity me, vector pos)
if(me.pressed)
{
if not(me.disabled)
+ {
+ if(cvar("menu_sounds"))
+ localsound("sound/misc/menu2.wav");
me.onClick(me, me.onClickEntity);
+ }
me.pressed = 0;
}
return 1;
{
me.focusable = !me.disabled;
}
-.float playedfocus;
+void Button_focusEnter(entity me)
+{
+ if(cvar("menu_sounds") > 1)
+ localsound("sound/misc/menu1.wav");
+ SUPER(Button).focusEnter(me);
+}
void Button_draw(entity me)
{
vector bOrigin, bSize;
me.onClick(me, me.onClickEntity);
}
me.clickTime -= frametime;
-
- if(cvar("menu_sounds") > 1)
- if(me.focused && !me.playedfocus)
- {
- localsound("sound/misc/menu1.wav");
- me.playedfocus = 1;
- }
- else if(!me.focused && me.playedfocus)
- me.playedfocus = 0;
}
-#endif
\ No newline at end of file
+#endif
void Dialog_addItemSimple(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
{
- //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
vector o, s;
o = me.itemOrigin + eX * ( col * me.itemSpacing_x) + eY * ( row * me.itemSpacing_y);
s = me.itemSize + eX * ((colspan - 1) * me.itemSpacing_x) + eY * ((rowspan - 1) * me.itemSpacing_y);
if(me.closable)
{
closebutton = me.closeButton = spawnButton();
- closebutton.configureButton(closebutton, "Close", 0, me.closeButtonImage);
+ closebutton.configureButton(closebutton, "", 0, me.closeButtonImage);
closebutton.onClick = Dialog_Close; closebutton.onClickEntity = me;
closebutton.srcMulti = 0;
me.addItem(me, closebutton, '0 0 0', '1 1 0', 1); // put it as LAST
local vector fontsize;
fontsize_x = fontsize_y = 1.0 / 30.0;
fontsize_z = 0.0;
- draw_Text( '0 0 0', "Browser not initialized!", fontsize, '1 1 1', 1.0, 0 );
+ draw_Text( '0 0 0', _("Browser not initialized!"), fontsize, '1 1 1', 1.0, 0 );
}
}
ATTRIB(InputBox, forbiddenCharacters, string, "")
ATTRIB(InputBox, color, vector, '1 1 1')
ATTRIB(InputBox, colorF, vector, '1 1 1')
- ATTRIB(InputBox, maxLength, float, 255)
+ ATTRIB(InputBox, maxLength, float, 255) // if negative, it counts bytes, not chars
ENDCLASS(InputBox)
void InputBox_Clear_Click(entity btn, entity me);
#endif
for(i = 0; i < strlen(ch); ++i)
if(strstrofs(me.forbiddenCharacters, substring(ch, i, 1), 0) > -1)
return;
- if(strlen(ch) + strlen(me.text) > me.maxLength)
- return;
+ if(me.maxLength > 0)
+ {
+ if(strlen(ch) + strlen(me.text) > me.maxLength)
+ return;
+ }
+ else if(me.maxLength < 0)
+ {
+ if(u8_strsize(ch) + u8_strsize(me.text) > -me.maxLength)
+ return;
+ }
me.setText(me, strcat(substring(me.text, 0, me.cursorPos), ch, substring(me.text, me.cursorPos, strlen(me.text) - me.cursorPos)));
me.cursorPos += strlen(ch);
}
draw_Text(p, substring(me.text, i, 2), me.realFontSize, '1 1 1', theAlpha, 0);
}
}
- /*else if(ch2 == "a") // ^a found
- {
- draw_Fill(p, eX * w + eY * me.realFontSize_y, '1 1 1', 0.5);
- draw_Text(p, substring(me.text, i, 2), me.realFontSize, theColor, 0.8, 0);
-
- component = str2chr(me.text, i+2);
- if (component >= '0' && component <= '9')
- component = component - '0';
- else if (component >= 'a' && component <= 'f')
- component = component - 87;
- else if (component >= 'A' && component <= 'F')
- component = component - 55;
- else
- component = -1;
-
- if (component >= 0) // ^ah found
- {
- // FIX ME: overflow here
- if (component == 20 && theVariableAlpha <= 0.97)
- theVariableAlpha = theVariableAlpha + 0.0625;
- else if (component == 30 && theVariableAlpha >= 0.03)
- theVariableAlpha = theVariableAlpha - 0.0625;
- else
- theVariableAlpha = component*0.0625;
-
- draw_Fill(p, eX * draw_TextWidth(substring(me.text, i, 3), 0, me.realFontSize) + eY * me.realFontSize_y, '0.8 0.8 0.8', 0.5);
- draw_Text(p, strcat(ch, ch2), me.realFontSize, theColor, 0.8, 0);
- }
- }*/
else
{
draw_Fill(p, eX * w + eY * me.realFontSize_y, '1 1 1', 0.5);
METHOD(Label, resizeNotify, void(entity, vector, vector, vector, vector))
METHOD(Label, setText, void(entity, string))
METHOD(Label, toString, string(entity))
+ METHOD(Label, recalcPosition, void(entity))
ATTRIB(Label, text, string, string_null)
ATTRIB(Label, fontSize, float, 8)
ATTRIB(Label, align, float, 0.5)
ATTRIB(Label, textEntity, entity, NULL)
ATTRIB(Label, allowWrap, float, 0)
ATTRIB(Label, recalcPos, float, 0)
+ ATTRIB(Label, condenseFactor, float, 1)
ENDCLASS(Label)
#endif
me.text = txt;
me.recalcPos = 1;
}
+void Label_recalcPosition(entity me)
+{
+ float spaceAvail;
+ spaceAvail = 1 - me.keepspaceLeft - me.keepspaceRight;
+
+ float spaceUsed;
+ spaceUsed = draw_TextWidth(me.text, me.allowColors, me.realFontSize);
+
+ if(spaceUsed <= spaceAvail)
+ {
+ me.realOrigin_x = me.align * (spaceAvail - spaceUsed) + me.keepspaceLeft;
+ me.condenseFactor = 1;
+ }
+ else if(me.allowCut || me.allowWrap)
+ {
+ me.realOrigin_x = me.keepspaceLeft;
+ me.condenseFactor = 1;
+ }
+ else
+ {
+ me.realOrigin_x = me.keepspaceLeft;
+ me.condenseFactor = spaceAvail / spaceUsed;
+ dprint(sprintf(_("NOTE: label text %s too wide for label, condensed by factor %f\n"), me.text, me.condenseFactor));
+ }
+ me.recalcPos = 0;
+}
void Label_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
{
SUPER(Label).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
me.keepspaceLeft = me.marginLeft * me.realFontSize_x;
if(me.marginRight)
me.keepspaceRight = me.marginRight * me.realFontSize_x;
- me.realOrigin_y = 0.5 * (1 - me.realFontSize_y);
- me.realOrigin_x = me.align * (1 - me.keepspaceLeft - me.keepspaceRight - min(draw_TextWidth(me.text, me.allowColors, me.realFontSize), (1 - me.keepspaceLeft - me.keepspaceRight))) + me.keepspaceLeft;
- me.recalcPos = 0;
+
+ me.recalcPosition(me);
+
+ float lines;
+
+ vector dfs;
+ vector fs;
+
+ // set up variables to draw in condensed size, but use hinting for original size
+ fs = me.realFontSize;
+ fs_x *= me.condenseFactor;
+
+ dfs = draw_fontscale;
+ draw_fontscale_x *= me.condenseFactor;
+
+ if(me.allowCut) // FIXME allowCut incompatible with align != 0
+ lines = 1;
+ else if(me.allowWrap) // FIXME allowWrap incompatible with align != 0
+ {
+ getWrappedLine_remaining = me.text;
+ lines = 0;
+ while(getWrappedLine_remaining)
+ {
+ if (me.allowColors)
+ getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), fs, draw_TextWidth_WithColors);
+ else
+ getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), fs, draw_TextWidth_WithoutColors);
+ ++lines;
+ }
+ }
+ else
+ lines = 1;
+
+ draw_fontscale = dfs;
+
+ me.realOrigin_y = 0.5 * (1 - lines * me.realFontSize_y);
}
void Label_configureLabel(entity me, string txt, float sz, float algn)
{
t = me.text;
if(me.recalcPos)
- me.realOrigin_x = me.align * (1 - me.keepspaceLeft - me.keepspaceRight - min(draw_TextWidth(t, me.allowColors, me.realFontSize), (1 - me.keepspaceLeft - me.keepspaceRight))) + me.keepspaceLeft;
- me.recalcPos = 0;
+ me.recalcPosition(me);
- //if(me.text == "Bookmark")
- // draw_Fill(me.realOrigin, '0 1 0' + '1 0 0' * draw_TextWidth(t, me.allowColors, me.realFontSize), '1 0 1', 1);
-
if(me.fontSize)
if(t)
{
+ vector dfs;
+ vector fs;
+
+ // set up variables to draw in condensed size, but use hinting for original size
+ fs = me.realFontSize;
+ fs_x *= me.condenseFactor;
+
+ dfs = draw_fontscale;
+ draw_fontscale_x *= me.condenseFactor;
+
if(me.allowCut) // FIXME allowCut incompatible with align != 0
- draw_Text(me.realOrigin, draw_TextShortenToWidth(t, (1 - me.keepspaceLeft - me.keepspaceRight), me.allowColors, me.realFontSize), me.realFontSize, me.colorL, me.alpha, me.allowColors);
+ draw_Text(me.realOrigin, draw_TextShortenToWidth(t, (1 - me.keepspaceLeft - me.keepspaceRight), me.allowColors, fs), fs, me.colorL, me.alpha, me.allowColors);
else if(me.allowWrap) // FIXME allowWrap incompatible with align != 0
{
getWrappedLine_remaining = t;
while(getWrappedLine_remaining)
{
if (me.allowColors)
- t = getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), me.realFontSize, draw_TextWidth_WithColors);
+ t = getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), fs, draw_TextWidth_WithColors);
else
- t = getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), me.realFontSize, draw_TextWidth_WithoutColors);
- draw_Text(o, t, me.realFontSize, me.colorL, me.alpha, me.allowColors);
+ t = getWrappedLine((1 - me.keepspaceLeft - me.keepspaceRight), fs, draw_TextWidth_WithoutColors);
+ draw_Text(o, t, fs, me.colorL, me.alpha, me.allowColors);
o_y += me.realFontSize_y;
}
}
else
- draw_Text(me.realOrigin, t, me.realFontSize, me.colorL, me.alpha, me.allowColors);
+ draw_Text(me.realOrigin, t, fs, me.colorL, me.alpha, me.allowColors);
+
+ draw_fontscale = dfs;
}
}
#endif
oldshift = draw_shift;
oldscale = draw_scale;
absSize = boxToGlobalSize(me.size, eX * (1 - me.controlWidth) + eY * me.itemHeight);
+ draw_scale = boxToGlobalSize(eX * (1 - me.controlWidth) + eY * me.itemHeight, oldscale);
for(i = floor(me.scrollPos / me.itemHeight); i < me.nItems; ++i)
{
float y;
if(y >= 1)
break;
draw_shift = boxToGlobal(eY * y, oldshift, oldscale);
- draw_scale = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), oldscale);
me.drawListBoxItem(me, i, absSize, (me.selectedItem == i));
}
draw_ClearClip();
void ListBox_drawListBoxItem(entity me, float i, vector absSize, float selected)
{
- draw_Text('0 0 0', strcat("Item ", ftos(i)), eX * (8 / absSize_x) + eY * (8 / absSize_y), (selected ? '0 1 0' : '1 1 1'), 1, 0);
+ draw_Text('0 0 0', sprintf(_("Item %d"), i), eX * (8 / absSize_x) + eY * (8 / absSize_y), (selected ? '0 1 0' : '1 1 1'), 1, 0);
}
#endif
me.animationState = 0;
}
- //print(ftos(me.animationState), "\n");
-
f = min(1, frametime * 5);
switch(me.animationState)
{
METHOD(Slider, mousePress, float(entity, vector))
METHOD(Slider, mouseDrag, float(entity, vector))
METHOD(Slider, mouseRelease, float(entity, vector))
+ METHOD(Slider, focusEnter, void(entity))
METHOD(Slider, valueToText, string(entity, float))
METHOD(Slider, toString, string(entity))
METHOD(Slider, setValue, void(entity, float))
void Slider_setValue(entity me, float val)
{
if (me.animated) {
- anim.stopObjAnim(anim, me);
anim.removeObjAnim(anim, me);
makeHostedEasing(me, Slider_setSliderValue, easingQuadInOut, 1, me.sliderValue, val);
} else {
}
string Slider_toString(entity me)
{
- return strcat(ftos(me.value), " (", me.valueToText(me, me.value), ")");
+ return sprintf(_("%d (%s)"), me.value, me.valueToText(me, me.value));
}
void Slider_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
{
if(me.disabled)
return 0;
- anim.finishObjAnim(anim, me);
+ anim.removeObjAnim(anim, me);
animed = me.animated;
me.animated = false;
//me.mouseDrag(me, pos);
}
}
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
return 1;
}
float Slider_mouseRelease(entity me, vector pos)
me.pressed = 0;
if(me.disabled)
return 0;
+ if(cvar("menu_sounds"))
+ localsound("sound/misc/menu2.wav");
return 1;
}
void Slider_showNotify(entity me)
{
me.focusable = !me.disabled;
}
+void Slider_focusEnter(entity me)
+{
+ if(cvar("menu_sounds") > 1)
+ localsound("sound/misc/menu1.wav");
+ SUPER(Slider).focusEnter(me);
+}
void Slider_draw(entity me)
{
float controlLeft;
string TextSlider_valueToText(entity me, float val)
{
if(val >= me.nValues)
- return "custom";
+ return _("custom");
if(val < 0)
- return "custom";
+ return _("custom");
return me.(valueStrings[val]);
}
void TextSlider_setValueFromIdentifier(entity me, string id)
//////////////////////////////////////////////////
// AK FIXME: Create perhaps a special builtin file for the common cmds
-//#define PROFILESTRZONE
-//#define FIXEDFOPEN
-
float checkextension(string ext) = #1;
// error cmds
float pow(float a, float b) = #46;
void copyentity(entity src, entity dst) = #47;
-#ifdef FIXEDFOPEN
-float _fopen( string filename, float mode ) = #48;
-#else
float fopen(string filename, float mode) = #48;
-#endif
void fclose(float fhandle) = #49;
string fgets(float fhandle) = #50;
void fputs(float fhandle, string s) = #51;
vector stov(string s) = #55;
-#ifdef PROFILESTRZONE
-string _strzone(string s) = #56;
-void _strunzone(string s) = #57;
-
-string( string s ) strzone =
-{
- return _strzone( s );
-};
-
-void( string s ) strunzone =
-{
- return _strunzone( s );
-};
-#else
string strzone(string s) = #56;
void strunzone(string s) = #57;
-#endif
float tokenize(string s) = #58;
float(string s, string separator1, ...) tokenizebyseparator = #479;
string(string in) uri_escape = #510;
string(string in) uri_unescape = #511;
+//DP_QC_URI_GET
+//idea: divVerent
+//darkplaces implementation: divVerent
+//loads text from an URL into a string
+//returns 1 on success of initiation, 0 if there are too many concurrent
+//connections already or if the URL is invalid
+//the following callback will receive the data and MUST exist!
+// void(float id, float status, string data) URI_Get_Callback;
+//status is either
+// negative for an internal error,
+// 0 for success, or
+// the HTTP response code on server error (e.g. 404)
+//if 1 is returned by uri_get, the callback will be called in the future
+float(string url, float id) uri_get = #513;
+//DP_QC_URI_POST
+//idea: divVerent
+//darkplaces implementation: divVerent
+//loads text from an URL into a string after POSTing via HTTP
+//works like uri_get, but uri_post sends data with Content-Type: content_type to the server
+//and uri_post sends the string buffer buf, joined using the delimiter delim
+float(string url, float id, string content_type, string data) uri_post = #513;
+float(string url, float id, string content_type, string delim, float buf) uri_postbuf = #513;
+
string(string, float) netaddress_resolve = #625;
string(string search, string replace, string subject) strreplace = #484;
string(float uselocaltime, string format, ...) strftime = #478;
-#ifdef FIXEDFOPEN
-float fopen( string filename, float mode ) =
-{
- local float handle;
- if( mode == FILE_READ ) {
- return _fopen( filename, mode );
- }
-
- // check for data/
- filename = strzone( filename );
- if( substring( filename, 0, 5 ) != "data/" ) {
- print( "menu: fopen: all output must go into data/!\n" );
- return -1;
- }
- handle = _fopen( substring( filename, 5, 10000 ), mode );
- strunzone( filename );
- return handle;
-};
-#endif
-
float(string s) tokenize_console = #514;
float(float i) argv_start_index = #515;
float(float i) argv_end_index = #516;
string crypto_getkeyfp(string serveraddress) = #633; // retrieves the cached host key's CA fingerprint of a server given by IP address
string crypto_getidfp(string serveraddress) = #634; // retrieves the cached host key fingerprint of a server given by IP address
string crypto_getencryptlevel(string serveraddress) = #635; // 0 if never encrypting, 1 supported, 2 requested, 3 required, appended by list of allowed methods in order of preference ("AES128"), preceded by a space each
+float(string url, float id, string content_type, string delim, float buf, float keyid) crypto_uri_postbuf = #513;
//description:
void() m_init =
{
cvar_set("_menu_alpha", "0");
+ prvm_language = strzone(cvar_string("prvm_language"));
check_unacceptable_compiler_bugs();
#ifdef WATERMARK
- print("^4MQC Build information: ", WATERMARK(), "\n");
+ print(sprintf(_("^4MQC Build information: %s\n"), WATERMARK()));
#endif
// list all game dirs (TEST)
s = getgamedirinfo(i, GETGAMEDIRINFO_NAME);
if not(s)
break;
- print(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
+ dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
}
}
}
if(cvar_string("menu_skin") != "")
{
draw_currentSkin = strcat("gfx/menu/", cvar_string("menu_skin"));
- fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ);
+ fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
}
if(fh < 0)
if(cvar_defstring("menu_skin") != "")
{
draw_currentSkin = strcat("gfx/menu/", cvar_defstring("menu_skin"));
- fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ);
+ fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
}
if(fh < 0)
{
draw_currentSkin = "gfx/menu/default";
- fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ);
+ fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
}
draw_currentSkin = strzone(draw_currentSkin);
while((s = fgets(fh)))
if(mouseButtonsPressed < 0)
{
mouseButtonsPressed = 0;
- print("Warning: released an already released button\n");
+ dprint("Warning: released an already released button\n");
}
}
if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
if(mouseButtonsPressed > 10)
{
mouseButtonsPressed = 10;
- print("Warning: pressed an already pressed button\n");
+ dprint("Warning: pressed an already pressed button\n");
}
}
if(key == K_ALT) menuShiftState |= S_ALT;
return FALSE;
if(tooltippos_y + menuTooltipSize_y > 1)
return FALSE;
- /*
- menuTooltipOrigin_x = rint(tooltippos_x * cvar("vid_width")) / cvar("vid_width");
- menuTooltipOrigin_y = rint(tooltippos_y * cvar("vid_height")) / cvar("vid_height");
- menuTooltipOrigin_z = 0;
- */
menuTooltipOrigin = tooltippos;
return TRUE;
}
vector avoidplus, avoidminus;
vector v;
- avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x) / conwidth;
- avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y) / conheight;
+ avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth;
+ avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight;
avoidplus_z = 0;
- avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x) / conwidth + menuTooltipSize_x;
- avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y) / conheight + menuTooltipSize_y;
+ avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth + menuTooltipSize_x;
+ avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight + menuTooltipSize_y;
avoidminus_z = 0;
// bottom right
if(Menu_Active)
if(!cvar("menu_video_played"))
{
- localcmd("set menu_video_played 1; cd loop $menu_cdtrack; play sound/announcer/default/welcome.ogg\n");
- menuLogoAlpha = -0.8; // no idea why, but when I start this at zero, it jumps instead of fading
+ localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.ogg\n");
+ menuLogoAlpha = -0.8; // no idea why, but when I start this at zero, it jumps instead of fading FIXME
}
+ // ALWAYS set this cvar; if we start but menu is not active, this means we want no background music!
+ localcmd("set menu_video_played 1\n");
}
t = gettime();
}
else
{
- e = findstring(NULL, name, itemname);
+ for(e = NULL; (e = findstring(e, name, itemname)); )
+ if(e.classname != "vtbl")
+ break;
if(e)
{
m_hide();
m_goto("skinselector");
}
+void() m_goto_language_selector =
+{
+ if(!menuInitialized)
+ return;
+ // TODO add code to switch back to the language selector (no idea how to do it now)
+ m_goto("languageselector");
+}
+
void() m_goto_video_settings =
{
if(!menuInitialized)
return;
- // TODO add code to switch back to the skin selector (no idea how to do it now)
+ // TODO add code to switch back to the video settings (no idea how to do it now)
m_goto("videosettings");
}
void m_display();
void m_goto(string name);
void m_goto_skin_selector();
+void m_goto_language_selector();
void m_goto_video_settings();
.string name;
while(<DATA>)
{
chomp;
- if(/^\s*(?:SKINFLOAT|SKINVECTOR)\(([A-Z_]+), ([-'0-9. ]+)\);$/)
+ if(/^\s*(?:SKINFLOAT|SKINVECTOR)\(([A-Z_]+), ([-'0-9. ]+)\);$/) #'
{
printf "%-31s %s\n", $1, $2;
}
SKINVECTOR(AVOID_TOOLTIP, '8 8 0');
// the individual dialog background colors
+ SKINVECTOR(COLOR_DIALOG_FIRSTRUN, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_MULTIPLAYER, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_SETTINGS, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_TEAMSELECT, '1 1 1');
SKINVECTOR(COLOR_DIALOG_SINGLEPLAYER, '1 1 0.7');
SKINVECTOR(COLOR_DIALOG_CREDITS, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_WEAPONS, '1 0.7 0.7');
- SKINVECTOR(COLOR_DIALOG_RADAR, '0.7 0.7 1');
+ SKINVECTOR(COLOR_DIALOG_WAYPOINTS, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_SERVERINFO, '0.7 0.7 1');
SKINVECTOR(COLOR_DIALOG_CVARS, '1 0 0');
SKINVECTOR(COLOR_BUTTON_C, '1 1 1');
SKINVECTOR(COLOR_BUTTON_F, '1 1 1');
SKINVECTOR(COLOR_BUTTON_D, '1 1 1');
+ SKINFLOAT(MARGIN_BUTTON, 0.5);
// item: campaign
SKINFLOAT(ALPHA_CAMPAIGN_SELECTABLE, 0.8);
//#define SKINSTRING(name,def) case #name: break
#define SKINSTRING(name,def) case #name: SKIN##name = strzone(value); break
// I know this leaks memory when skin is read multiple times. Screw it.
-#define SKINEND case "": break; case "//": break; default: print("Invalid key in skin file: ", key, "\n"); } }
+#define SKINEND case "": break; case "//": break; default: dprint("Invalid key in skin file: ", key, "\n"); } }
#include "skin-customizables.inc"
#undef SKINEND
#undef SKINSTRING
ATTRIB(XonoticButton, colorD, vector, SKINCOLOR_BUTTON_D)
ATTRIB(XonoticButton, alpha, float, SKINALPHA_TEXT)
ATTRIB(XonoticButton, disabledAlpha, float, SKINALPHA_DISABLED)
+ ATTRIB(XonoticButton, marginLeft, float, SKINMARGIN_BUTTON) // chars
+ ATTRIB(XonoticButton, marginRight, float, SKINMARGIN_BUTTON) // chars
ENDCLASS(XonoticButton)
entity makeXonoticButton(string theText, vector theColor);
#endif
if(i <= me.campaignIndex)
s = campaign_shortdesc[i]; // fteqcc sucks
else
- s = "???";
- s = draw_TextShortenToWidth(strcat("Level ", ftos(i + 1), ": ", s), me.columnNameSize, 0, me.realFontSize);
+ s = _("???");
+ s = draw_TextShortenToWidth(sprintf(_("Level %d: %s"), i+1, s), me.columnNameSize, 0, me.realFontSize);
draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, theColor, theAlpha, 0);
if(i <= me.campaignIndex)
return hsl_to_rgb(v_x * 6 * eX + eY + v_y / 0.875 * eZ);
}
+vector color_hslimage(vector v, vector margin)
+{
+ vector pos;
+ v = rgb_to_hsl(v);
+ if (v_y)
+ {
+ pos_x = v_x / 6;
+ pos_y = v_z * 0.875;
+ }
+ else // grey scale
+ {
+ pos_x = v_z;
+ pos_y = 0.875 + 0.07;
+ }
+ pos_x = margin_x + pos_x * (1 - 2 * margin_x);
+ pos_y = margin_y + pos_y * (1 - 2 * margin_y);
+ return pos;
+}
+
float XonoticColorpicker_mouseDrag(entity me, vector coords)
{
float i;
#ifdef INTERFACE
CLASS(XonoticColorpickerString) EXTENDS(Image)
- METHOD(XonoticColorpickerString, configureXonoticColorpickerString, void(entity, string))
+ METHOD(XonoticColorpickerString, configureXonoticColorpickerString, void(entity, string, string))
METHOD(XonoticColorpickerString, mousePress, float(entity, vector))
METHOD(XonoticColorpickerString, mouseRelease, float(entity, vector))
METHOD(XonoticColorpickerString, mouseDrag, float(entity, vector))
METHOD(XonoticColorpickerString, draw, void(entity))
ATTRIB(XonoticColorpickerString, disabledAlpha, float, 0.3)
ENDCLASS(XonoticColorpickerString)
-entity makeXonoticColorpickerString(string theCvar);
+entity makeXonoticColorpickerString(string theCvar, string theDefaultCvar);
#endif
#ifdef IMPLEMENTATION
-entity makeXonoticColorpickerString(string theCvar)
+entity makeXonoticColorpickerString(string theCvar, string theDefaultCvar)
{
entity me;
me = spawnXonoticColorpickerString();
- me.configureXonoticColorpickerString(me, theCvar);
+ me.configureXonoticColorpickerString(me, theCvar, theDefaultCvar);
return me;
}
-void XonoticColorpickerString_configureXonoticColorpickerString(entity me, string theCvar)
+void XonoticColorpickerString_configureXonoticColorpickerString(entity me, string theCvar, string theDefaultCvar)
{
me.cvarName = theCvar;
me.configureImage(me, me.image);
- me.prevcoords = '1 1 0';
+ if(cvar_string(theCvar) != "")
+ me.prevcoords = color_hslimage(stov(cvar_string(theCvar)), me.imagemargin);
+ else // use default
+ me.prevcoords = color_hslimage(stov(cvar_string(theDefaultCvar)), me.imagemargin);
}
float XonoticColorpickerString_mousePress(entity me, vector coords)
if(coords_x <= 1 - margin_x)
if(coords_y <= 1 - margin_y)
{
- cvar_set(me.cvarName, sprintf("%v", hslimage_color(coords, margin)));
me.prevcoords = coords;
}
sz = draw_PictureSize(strcat(me.src, "_selected"));
sz = globalToBoxSize(sz, draw_scale);
- if(me.disabled)
- me.prevcoords = '1 1 0';
- else
+ if(!me.disabled)
+ {
+ cvar_set(me.cvarName, sprintf("%v", hslimage_color(me.prevcoords, me.imagemargin)));
draw_Picture(me.imgOrigin + me.prevcoords - 0.5 * sz, strcat(me.src, "_selected"), sz, '1 1 1', 1);
+ }
draw_alpha = save;
}
#endif
{
me.configureXonoticListBox(me);
// load the file
- me.bufferIndex = buf_load("xonotic-credits.txt");
+ me.bufferIndex = buf_load(language_filename("xonotic-credits.txt"));
+ if(me.bufferIndex < 0)
+ me.bufferIndex = buf_load("xonotic-credits.txt");
me.nItems = buf_getsize(me.bufferIndex);
}
void XonoticCreditsList_destroy(entity me)
me.loadCvars(me);
me.configureRadioButton(me, string_null, me.fontSize, me.image, theGroup, 0);
me.srcMulti = 1;
- me.src3 = strzone(strcat("/gfx/crosshair", ftos(me.cvarValueFloat)));
+ if(me.cvarValueFloat == -1)
+ me.src3 = strzone(strcat("/gfx/crosshair", cvar("crosshair")));
+ else
+ me.src3 = strzone(strcat("/gfx/crosshair", ftos(me.cvarValueFloat)));
me.src4 = "/gfx/crosshairdot";
}
void XonoticCrosshairButton_setChecked(entity me, float val)
{
+ if(me.cvarValueFloat != -1) // preview shouldn't work as a button
if(val != me.checked)
{
me.checked = val;
vector sz, rgb;
float a;
- rgb = eX * cvar("crosshair_color_red") + eY * cvar("crosshair_color_green") + eZ * cvar("crosshair_color_blue");
+ rgb = stov(cvar_string("crosshair_color"));
a = cvar("crosshair_alpha");
- if(!me.checked && !me.focused)
+ if(!me.checked && !me.focused && me.cvarValueFloat != -1)
{
a *= me.disabledAlpha;
rgb = '1 1 1';
}
+ if(me.cvarValueFloat == -1) // update the preview if this is the preview button
+ {
+ if(me.src3)
+ strunzone(me.src3);
+ me.src3 = strzone(strcat("/gfx/crosshair", cvar_string("crosshair")));
+ me.focused = 1;
+ me.checked = 0;
+ }
+
SUPER(XonoticCrosshairButton).draw(me);
sz = draw_PictureSize(me.src3);
sz = globalToBoxSize(sz, draw_scale);
- sz = (10 * '1 1 0' + sz * cvar("crosshair_size")) * 0.05; // (10 * '1 1 0' + ...) * 0.05 here to make visible size changes happen also at bigger sizes
- if(sz_x > 0.95)
- sz = sz * (0.95 / sz_x);
- if(sz_y > 0.95)
- sz = sz * (0.95 / sz_y);
+ if(me.cvarValueFloat == -1)
+ {
+ sz = (6 * '1 1 0' + sz * cvar("crosshair_size")) * 0.08; // (6 * '1 1 0' + ...) * 0.08 here to make visible size changes happen also at bigger sizes
+ if(sz_x > 0.95)
+ sz = sz * (0.95 / sz_x);
+ if(sz_y > 0.95)
+ sz = sz * (0.95 / sz_y);
+ }
+ else // show the crosshair picker at full size
+ sz = '0.95 0.95 0';
draw_Picture('0.5 0.5 0' - 0.5 * sz, me.src3, sz, rgb, a);
if(cvar("crosshair_dot"))
+ {
+ if(cvar_string("crosshair_dot_color") != "0")
+ rgb = stov(cvar_string("crosshair_dot_color"));
draw_Picture('0.5 0.5 0' - 0.5 * sz * cvar("crosshair_dot_size"), me.src4, sz * cvar("crosshair_dot_size"), rgb, a * cvar("crosshair_dot_alpha"));
+ }
}
#endif
ATTRIB(XonoticCvarList, columnValueOrigin, float, 0)
ATTRIB(XonoticCvarList, columnValueSize, float, 0)
+ METHOD(XonoticCvarList, mouseRelease, float(entity, vector))
METHOD(XonoticCvarList, setSelected, void(entity, float))
+
ATTRIB(XonoticCvarList, controlledTextbox, entity, NULL)
ATTRIB(XonoticCvarList, cvarNameBox, entity, NULL)
ATTRIB(XonoticCvarList, cvarDescriptionBox, entity, NULL)
void CvarList_Filter_Change(entity box, entity me);
void CvarList_Value_Change(entity box, entity me);
void CvarList_Revert_Click(entity btn, entity me);
+void CvarList_End_Editing(entity box, entity me);
#endif
#ifdef IMPLEMENTATION
t = cvar_type(me.cvarName);
me.cvarType = "";
if(t & CVAR_TYPEFLAG_SAVED)
- me.cvarType = strcat(me.cvarType, ", will be saved to config.cfg");
+ me.cvarType = strcat(me.cvarType, ", ", _("will be saved to config.cfg"));
else
- me.cvarType = strcat(me.cvarType, ", will not be saved");
+ me.cvarType = strcat(me.cvarType, ", ", _("will not be saved"));
if(t & CVAR_TYPEFLAG_PRIVATE)
- me.cvarType = strcat(me.cvarType, ", private");
+ me.cvarType = strcat(me.cvarType, ", ", _("private"));
if(t & CVAR_TYPEFLAG_ENGINE)
- me.cvarType = strcat(me.cvarType, ", engine setting");
+ me.cvarType = strcat(me.cvarType, ", ", _("engine setting"));
if(t & CVAR_TYPEFLAG_READONLY)
- me.cvarType = strcat(me.cvarType, ", read only");
+ me.cvarType = strcat(me.cvarType, ", ", _("read only"));
me.cvarType = strzone(substring(me.cvarType, 2, strlen(me.cvarType) - 2));
me.cvarNameBox.setText(me.cvarNameBox, me.cvarName);
CvarList_Revert_Click(world, me);
return 1;
}
+ else if(scan == K_ENTER)
+ me.cvarValueBox.parent.setFocus(me.cvarValueBox.parent, me.cvarValueBox);
else if(SUPER(XonoticCvarList).keyDown(me, scan, ascii, shift))
return 1;
else if(!me.controlledTextbox)
return me.controlledTextbox.keyDown(me.controlledTextbox, scan, ascii, shift);
}
+float XonoticCvarList_mouseRelease(entity me, vector pos)
+{
+ if(me.pressed == 2)
+ me.cvarValueBox.parent.setFocus(me.cvarValueBox.parent, me.cvarValueBox);
+ return SUPER(XonoticCvarList).mouseRelease(me, pos);
+}
+
void CvarList_Value_Change(entity box, entity me)
{
cvar_set(me.cvarNameBox.text, box.text);
me.cvarValueBox.setText(me.cvarValueBox, me.cvarDefault);
me.cvarValueBox.cursorPos = strlen(me.cvarDefault);
}
+
+void CvarList_End_Editing(entity box, entity me)
+{
+ box.parent.setFocus(box.parent, me);
+}
+
#endif
// still to be customized by user
/*
ATTRIB(XonoticDialog, closable, float, 1)
- ATTRIB(XonoticDialog, title, string, "Form1") // ;)
+ ATTRIB(XonoticDialog, title, string, _("Form1")) // ;)
ATTRIB(XonoticDialog, color, vector, '1 0.5 1')
ATTRIB(XonoticDialog, intendedWidth, float, 0)
ATTRIB(XonoticDialog, rows, float, 3)
CLASS(XonoticCreditsDialog) EXTENDS(XonoticDialog)
METHOD(XonoticCreditsDialog, fill, void(entity))
METHOD(XonoticCreditsDialog, focusEnter, void(entity))
- ATTRIB(XonoticCreditsDialog, title, string, "Credits")
+ ATTRIB(XonoticCreditsDialog, title, string, _("Credits"))
ATTRIB(XonoticCreditsDialog, color, vector, SKINCOLOR_DIALOG_CREDITS)
ATTRIB(XonoticCreditsDialog, intendedWidth, float, SKINWIDTH_CREDITS)
ATTRIB(XonoticCreditsDialog, rows, float, SKINROWS_CREDITS)
me.TR(me);
me.TD(me, me.rows - 1, me.columns, me.creditsList = makeXonoticCreditsList());
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticFirstRunDialog) EXTENDS(XonoticRootDialog)
+ METHOD(XonoticFirstRunDialog, fill, void(entity)) // to be overridden by user to fill the dialog with controls
+ ATTRIB(XonoticFirstRunDialog, title, string, _("Welcome"))
+ ATTRIB(XonoticFirstRunDialog, color, vector, SKINCOLOR_DIALOG_FIRSTRUN)
+ ATTRIB(XonoticFirstRunDialog, intendedWidth, float, 0.6)
+ ATTRIB(XonoticFirstRunDialog, rows, float, 15)
+ ATTRIB(XonoticFirstRunDialog, columns, float, 3)
+ ATTRIB(XonoticFirstRunDialog, name, string, "FirstRun")
+ ATTRIB(XonoticFirstRunDialog, playerNameLabel, entity, NULL)
+ ATTRIB(XonoticFirstRunDialog, playerNameLabelAlpha, float, 0)
+
+ ATTRIB(XonoticFirstRunDialog, closable, float, 0)
+ENDCLASS(XonoticFirstRunDialog)
+#endif
+
+#ifdef IMPLEMENTATION
+float CheckFirstRunButton(entity me)
+{
+ if(cvar_string("_cl_name") != "Player")
+ return 1;
+ if(cvar_string("prvm_language") != prvm_language)
+ return 1; // OK will then reopen the dialog in another language
+ return 0;
+}
+
+void XonoticFirstRunDialog_fill(entity me)
+{
+ entity e;
+ entity label, box;
+
+ me.TR(me);
+ me.TD(me, 2, 3, e = makeXonoticTextLabel(0, _("Welcome to Xonotic, please select your language preference and enter your player name to get started. You can change these options later through the menu system.")));
+ e.allowWrap = 1;
+ me.TR(me);
+
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Text language:")));
+ me.TR(me);
+ me.TD(me, 3, 3, e = makeXonoticLanguageList());
+ e.name = "languageselector_firstrun";
+ e.doubleClickCommand = "saveconfig; menu_restart; togglemenu";
+ me.TR(me);
+ me.TR(me);
+
+ me.TR(me);
+ me.TD(me, 1, 0.5, me.playerNameLabel = makeXonoticTextLabel(0, _("Name:")));
+ me.playerNameLabelAlpha = me.playerNameLabel.alpha;
+ me.TD(me, 1, 2.5, label = makeXonoticTextLabel(0, string_null));
+ label.allowCut = 1;
+ label.allowColors = 1;
+ label.alpha = 1;
+ me.TR(me);
+ me.TD(me, 1, 3.0, box = makeXonoticInputBox(1, "_cl_name"));
+ box.forbiddenCharacters = "\r\n\\\"$"; // don't care, isn't getting saved
+ box.maxLength = -127; // negative means encoded length in bytes
+ box.saveImmediately = 1;
+ label.textEntity = box;
+ me.TR(me);
+ me.TD(me, 5, 1, e = makeXonoticColorpicker(box));
+ me.TD(me, 5, 2, e = makeXonoticCharmap(box));
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+
+ // because of the language selector, this is a menu_restart!
+ me.gotoRC(me, me.rows - 1, 0);
+ me.TD(me, 1, me.columns, e = makeXonoticCommandButton(_("Save settings"), '0 0 0', "saveconfig; menu_restart; togglemenu", COMMANDBUTTON_APPLY));
+ setDependentWeird(e, CheckFirstRunButton);
+}
+#endif
#ifdef INTERFACE
CLASS(XonoticHUDAmmoDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDAmmoDialog, fill, void(entity))
- ATTRIB(XonoticHUDAmmoDialog, title, string, "Ammo Panel")
+ ATTRIB(XonoticHUDAmmoDialog, title, string, _("Ammo Panel"))
ATTRIB(XonoticHUDAmmoDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDAmmoDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDAmmoDialog, rows, float, 15)
{
entity e;
string panelname = "ammo";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_ammo", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Ammunition display:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Ammunition display:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_ammo_onlycurrent", "Show only current ammo type"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_ammo_onlycurrent", _("Show only current ammo type")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Align icon:"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "0", "Left"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "1", "Right"));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "0", _("Left")));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "1", _("Right")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDChatDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDChatDialog, fill, void(entity))
- ATTRIB(XonoticHUDChatDialog, title, string, "Chat Panel")
+ ATTRIB(XonoticHUDChatDialog, title, string, _("Chat Panel"))
ATTRIB(XonoticHUDChatDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDChatDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDChatDialog, rows, float, 15)
{
entity e;
string panelname = "chat";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_chat", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Chat entries:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Chat entries:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Chat size:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Chat size:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(6, 20, 1, "con_chatsize"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Chat lifetime:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Chat lifetime:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(5, 60, 5, "con_chattime"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_chatsound", "Chat beep sound"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_chatsound", _("Chat beep sound")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDEngineInfoDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDEngineInfoDialog, fill, void(entity))
- ATTRIB(XonoticHUDEngineInfoDialog, title, string, "Engine Info Panel")
+ ATTRIB(XonoticHUDEngineInfoDialog, title, string, _("Engine Info Panel"))
ATTRIB(XonoticHUDEngineInfoDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDEngineInfoDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDEngineInfoDialog, rows, float, 15)
{
entity e;
string panelname = "engineinfo";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_engineinfo", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Engine info:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Engine info:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_engineinfo_framecounter_exponentialmovingaverage", "Use an averaging algorithm for fps"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_engineinfo_framecounter_exponentialmovingaverage", _("Use an averaging algorithm for fps")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDHealthArmorDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDHealthArmorDialog, fill, void(entity))
- ATTRIB(XonoticHUDHealthArmorDialog, title, string, "Health/Armor Panel")
+ ATTRIB(XonoticHUDHealthArmorDialog, title, string, _("Health/Armor Panel"))
ATTRIB(XonoticHUDHealthArmorDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDHealthArmorDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDHealthArmorDialog, rows, float, 15)
{
entity e;
string panelname = "healtharmor";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_progressbar", "Enable status bar"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_progressbar", _("Enable status bar")));
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Status bar alignment:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "0", "Left"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "0", _("Left")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "1", "Right"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "1", _("Right")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "3", "Inward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "3", _("Inward")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "4", "Outward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "4", _("Outward")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Icon alignment:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Icon alignment:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "0", "Left"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "1", "Right"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "3", "Inward"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "4", "Outward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "0", _("Left")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "1", _("Right")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "3", _("Inward")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "4", _("Outward")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_flip", "Flip health and armor positions"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_flip", _("Flip health and armor positions")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDInfoMessagesDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDInfoMessagesDialog, fill, void(entity))
- ATTRIB(XonoticHUDInfoMessagesDialog, title, string, "Info Messages Panel")
+ ATTRIB(XonoticHUDInfoMessagesDialog, title, string, _("Info Messages Panel"))
ATTRIB(XonoticHUDInfoMessagesDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDInfoMessagesDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDInfoMessagesDialog, rows, float, 15)
{
entity e;
string panelname = "infomessages";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_infomessages", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Info messages:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Info messages:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_infomessages_flip", "Flip align"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_infomessages_flip", _("Flip align")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDModIconsDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDModIconsDialog, fill, void(entity))
- ATTRIB(XonoticHUDModIconsDialog, title, string, "Mod Icons Panel")
+ ATTRIB(XonoticHUDModIconsDialog, title, string, _("Mod Icons Panel"))
ATTRIB(XonoticHUDModIconsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDModIconsDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDModIconsDialog, rows, float, 15)
{
entity e;
string panelname = "modicons";
- float i;
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_modicons", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
+ DIALOG_HUDPANEL_COMMON();
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDNotificationDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDNotificationDialog, fill, void(entity))
- ATTRIB(XonoticHUDNotificationDialog, title, string, "Notification Panel")
+ ATTRIB(XonoticHUDNotificationDialog, title, string, _("Notification Panel"))
ATTRIB(XonoticHUDNotificationDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDNotificationDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDNotificationDialog, rows, float, 15)
{
entity e;
string panelname = "notify";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Notifications:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Notifications:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_print", "Also print notifications to the console"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_print", _("Also print notifications to the console")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_flip", "Flip notify order"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_flip", _("Flip notify order")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Entry lifetime:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Entry lifetime:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(3, 15, 1, "hud_panel_notify_time"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Entry fadetime:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Entry fadetime:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(0.5, 5, 0.5, "hud_panel_notify_fadetime"));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDPowerupsDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDPowerupsDialog, fill, void(entity))
- ATTRIB(XonoticHUDPowerupsDialog, title, string, "Powerups Panel")
+ ATTRIB(XonoticHUDPowerupsDialog, title, string, _("Powerups Panel"))
ATTRIB(XonoticHUDPowerupsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDPowerupsDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDPowerupsDialog, rows, float, 15)
{
entity e;
string panelname = "powerups";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_progressbar", "Enable status bar"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_progressbar", _("Enable status bar")));
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Status bar alignment:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "0", "Left"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "0", _("Left")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "1", "Right"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "1", _("Right")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "3", "Inward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "3", _("Inward")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "4", "Outward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "4", _("Outward")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Icon alignment:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Icon alignment:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "0", "Left"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "1", "Right"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "3", "Inward"));
- me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "4", "Outward"));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "0", _("Left")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "1", _("Right")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "3", _("Inward")));
+ me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "4", _("Outward")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_flip", "Flip strength and shield positions"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_flip", _("Flip strength and shield positions")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDPressedKeysDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDPressedKeysDialog, fill, void(entity))
- ATTRIB(XonoticHUDPressedKeysDialog, title, string, "Pressed Keys Panel")
+ ATTRIB(XonoticHUDPressedKeysDialog, title, string, _("Pressed Keys Panel"))
ATTRIB(XonoticHUDPressedKeysDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDPressedKeysDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDPressedKeysDialog, rows, float, 15)
{
entity e;
string panelname = "pressedkeys";
- float i;
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextSlider("hud_panel_pressedkeys"));
- e.addValue(e, "Panel disabled", "0");
- e.addValue(e, "Panel enabled when spectating", "1");
- e.addValue(e, "Panel always enabled", "2");
+ me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_pressedkeys"));
+ e.addValue(e, _("Panel disabled"), "0");
+ e.addValue(e, _("Panel enabled when spectating"), "1");
+ e.addValue(e, _("Panel always enabled"), "2");
e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
+
+ DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Forced aspect:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Forced aspect:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(0.2, 4, 0.1, "hud_panel_pressedkeys_aspect"));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDRaceTimerDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDRaceTimerDialog, fill, void(entity))
- ATTRIB(XonoticHUDRaceTimerDialog, title, string, "Race Timer Panel")
+ ATTRIB(XonoticHUDRaceTimerDialog, title, string, _("Race Timer Panel"))
ATTRIB(XonoticHUDRaceTimerDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDRaceTimerDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDRaceTimerDialog, rows, float, 15)
{
entity e;
string panelname = "racetimer";
- float i;
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_racetimer", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
+ DIALOG_HUDPANEL_COMMON();
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDRadarDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDRadarDialog, fill, void(entity))
- ATTRIB(XonoticHUDRadarDialog, title, string, "Radar Panel")
+ ATTRIB(XonoticHUDRadarDialog, title, string, _("Radar Panel"))
ATTRIB(XonoticHUDRadarDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDRadarDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDRadarDialog, rows, float, 15)
{
entity e;
string panelname = "radar";
- float i;
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextSlider("hud_panel_radar"));
- e.addValue(e, "Panel disabled", "0");
- e.addValue(e, "Panel enabled in teamgames", "1");
- e.addValue(e, "Panel always enabled", "2");
+ me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_radar"));
+ e.addValue(e, _("Panel disabled"), "0");
+ e.addValue(e, _("Panel enabled in teamgames"), "1");
+ e.addValue(e, _("Panel always enabled"), "2");
e.configureXonoticTextSliderValues(e);
+
+ DIALOG_HUDPANEL_COMMON_NOTOGGLE();
+
me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Radar:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Radar:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Alpha:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_radar_foreground_alpha"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Rotation:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Rotation:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_radar_rotation"));
- e.addValue(e, "Forward", "0");
- e.addValue(e, "West", "1");
- e.addValue(e, "South", "2");
- e.addValue(e, "East", "3");
- e.addValue(e, "North", "4");
+ e.addValue(e, _("Forward"), "0");
+ e.addValue(e, _("West"), "1");
+ e.addValue(e, _("South"), "2");
+ e.addValue(e, _("East"), "3");
+ e.addValue(e, _("North"), "4");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Scale:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Scale:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(1024, 8192, 512, "hud_panel_radar_scale"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Zoom mode:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider("hud_panel_radar_zoommode"));
- e.addValue(e, "Zoomed in", "0");
- e.addValue(e, "Zoomed out", "1");
- e.addValue(e, "Always zoomed", "2");
- e.addValue(e, "Never zoomed", "3");
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Zoom mode:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_radar_zoommode"));
+ e.addValue(e, _("Zoomed in"), "0");
+ e.addValue(e, _("Zoomed out"), "1");
+ e.addValue(e, _("Always zoomed"), "2");
+ e.addValue(e, _("Never zoomed"), "3");
e.configureXonoticTextSliderValues(e);
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDScoreDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDScoreDialog, fill, void(entity))
- ATTRIB(XonoticHUDScoreDialog, title, string, "Score Panel")
+ ATTRIB(XonoticHUDScoreDialog, title, string, _("Score Panel"))
ATTRIB(XonoticHUDScoreDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDScoreDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDScoreDialog, rows, float, 15)
{
entity e;
string panelname = "score";
- float i;
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_score", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
+ DIALOG_HUDPANEL_COMMON();
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDTimerDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDTimerDialog, fill, void(entity))
- ATTRIB(XonoticHUDTimerDialog, title, string, "Timer Panel")
+ ATTRIB(XonoticHUDTimerDialog, title, string, _("Timer Panel"))
ATTRIB(XonoticHUDTimerDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDTimerDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDTimerDialog, rows, float, 15)
{
entity e;
string panelname = "timer";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_timer", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Timer:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Timer:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_timer_increment", "Show elapsed time"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_timer_increment", _("Show elapsed time")));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDVoteDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDVoteDialog, fill, void(entity))
- ATTRIB(XonoticHUDVoteDialog, title, string, "Vote Panel")
+ ATTRIB(XonoticHUDVoteDialog, title, string, _("Vote Panel"))
ATTRIB(XonoticHUDVoteDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDVoteDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDVoteDialog, rows, float, 15)
{
entity e;
string panelname = "vote";
- float i;
+
+ DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_vote", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Alpha after voting:"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Alpha after voting:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_vote_alreadyvoted_alpha"));
}
#endif
#ifdef INTERFACE
CLASS(XonoticHUDWeaponsDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDWeaponsDialog, fill, void(entity))
- ATTRIB(XonoticHUDWeaponsDialog, title, string, "Weapons Panel")
+ ATTRIB(XonoticHUDWeaponsDialog, title, string, _("Weapons Panel"))
ATTRIB(XonoticHUDWeaponsDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDWeaponsDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDWeaponsDialog, rows, float, 17)
string panelname = "weapons";
float i;
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_weapons", "Enable panel"));
- me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color"))));
- setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
- e.addValue(e, "Default", "");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team Color:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
- e.addValue(e, "Default", "");
- e.addValue(e, "Disable", "0");
- for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
- me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
- e.addValue(e, "Default", "");
- for(i = 0; i <= 10; ++i)
- e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
- e.configureXonoticTextSliderValues(e);
+ DIALOG_HUDPANEL_COMMON();
+
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Fade out after:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Fade out after:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_timeout"))));
- e.addValue(e, "Never", "0");
+ e.addValue(e, _("Never"), "0");
for(i = 1; i <= 10; ++i)
- e.addValue(e, strzone(strcat(ftos_decimals(i, 0), "s")), strzone(ftos(i)));
+ e.addValue(e, strzone(sprintf(_("%ds"), i)), strzone(ftos(i)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Fade effect:"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "0", "None"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Fade effect:")));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "0", ZCTX(_("EF^None"))));
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "1", "Slide"));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "1", _("Slide")));
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "2", "Alpha"));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(3, "hud_panel_weapons_timeout_effect", "2", _("Alpha")));
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Weapon icons:"));
+ me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Weapon icons:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Show weapon ID as:"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "0", "None"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "1", "Number"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "2", "Bind"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Show weapon ID as:")));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "0", ZCTX(_("SHOWAS^None"))));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "1", _("Number")));
+ me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "2", _("Bind")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_accuracy", "Show Accuracy"));
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_ammo", "Show Ammo"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_accuracy", _("Show Accuracy")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_ammo", _("Show Ammo")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Ammo bar color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_weapons_ammo_color"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Ammo bar color:")));
+ me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_weapons_ammo_color", "hud_panel_weapons_ammo_color"));
setDependent(e, "hud_panel_weapons_ammo", 1, 1);
me.TR(me);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Ammo bar alpha:"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Ammo bar alpha:")));
me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_weapons_ammo_alpha"));
setDependent(e, "hud_panel_weapons_ammo", 1, 1);
}
#ifdef INTERFACE
CLASS(XonoticHUDExitDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticHUDExitDialog, fill, void(entity))
- ATTRIB(XonoticHUDExitDialog, title, string, "Panel HUD Setup")
+ ATTRIB(XonoticHUDExitDialog, title, string, _("Panel HUD Setup"))
ATTRIB(XonoticHUDExitDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDExitDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticHUDExitDialog, rows, float, 18)
float i;
me.TR(me);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Panel background defaults:"));
+ me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Panel background defaults:")));
me.TR(me);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_bg"))));
- e.addValue(e, "Disable", "0");
- e.addValue(e, "border_default", "border_default");
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_bg"))));
+ e.addValue(e, _("Disable"), "0");
+ e.addValue(e, "border_default", "border_default"); // this is a file name!
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_bg_color"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Color:")));
+ me.TD(me, 2, 2.6, e = makeXonoticColorpickerString("hud_panel_bg_color", "hud_panel_bg_color"));
me.TR(me);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Border size:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_bg_border"));
- e.addValue(e, "Disable", "0");
+ e.addValue(e, _("Disable"), "0");
for(i = 1; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Alpha:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_bg_alpha"));
for(i = 1; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team color:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Team color:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_bg_color_team"));
- e.addValue(e, "Disable", "0");
+ e.addValue(e, _("Disable"), "0");
for(i = 1; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.4);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", "Test the team color in HUD configure mode"));
+ me.TD(me, 1, 3.6, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", _("Test team color in configure mode")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Padding:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Padding:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_bg_padding"));
for(i = 0; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "HUD Dock:"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("HUD Dock:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_dock"));
- e.addValue(e, "Disable", "0");
- e.addValue(e, "Small", "dock_small");
- e.addValue(e, "Medium", "dock_medium");
- e.addValue(e, "Large", "dock_large");
+ e.addValue(e, ZCTX(_("DOCK^Disabled")), "0");
+ e.addValue(e, ZCTX(_("DOCK^Small")), "dock_small");
+ e.addValue(e, ZCTX(_("DOCK^Medium")), "dock_medium");
+ e.addValue(e, ZCTX(_("DOCK^Large")), "dock_large");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:"));
- me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_dock_color"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Color:")));
+ me.TD(me, 2, 2.6, e = makeXonoticColorpickerString("hud_dock_color", "hud_dock_color"));
me.TR(me);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Alpha:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Alpha:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_dock_alpha"));
for(i = 1; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Team color:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Team color:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_dock_color_team"));
- e.addValue(e, "Disable", "0");
+ e.addValue(e, _("Disable"), "0");
for(i = 1; i <= 10; ++i)
e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Grid settings:"));
+ me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Grid settings:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_configure_grid", "Snap panels to grid"));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_configure_grid", _("Snap panels to grid")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Grid size:"));
- me.TD(me, 1, 0.2, e = makeXonoticTextLabel(0, "X:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Grid size:")));
+ me.TD(me, 1, 0.2, e = makeXonoticTextLabel(0, _("X:")));
me.TD(me, 1, 1.1, e = makeXonoticTextSlider("hud_configure_grid_xsize"));
for(i = 1; i <= 14; ++i)
e.addValue(e, strzone(ftos_decimals(i/200, 3)), strzone(ftos(i/200)));
e.configureXonoticTextSliderValues(e);
setDependent(e, "hud_configure_grid", 1, 1);
- me.TD(me, 1, 0.2, e = makeXonoticTextLabel(0, "Y:"));
+ me.TD(me, 1, 0.2, e = makeXonoticTextLabel(0, _("Y:")));
me.TD(me, 1, 1.1, e = makeXonoticTextSlider("hud_configure_grid_ysize"));
for(i = 1; i <= 14; ++i)
e.addValue(e, strzone(ftos_decimals(i/200, 3)), strzone(ftos(i/200)));
setDependent(e, "hud_configure_grid", 1, 1);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticCommandButton("Exit setup", '0 0 0', "_hud_configure 0", 1));
+ me.TD(me, 1, me.columns, e = makeXonoticCommandButton(_("Exit setup"), '0 0 0', "_hud_configure 0", 1));
}
#endif
#ifdef INTERFACE
CLASS(XonoticMultiplayerDialog) EXTENDS(XonoticDialog)
METHOD(XonoticMultiplayerDialog, fill, void(entity))
- ATTRIB(XonoticMultiplayerDialog, title, string, "Multiplayer")
+ ATTRIB(XonoticMultiplayerDialog, title, string, _("Multiplayer"))
ATTRIB(XonoticMultiplayerDialog, color, vector, SKINCOLOR_DIALOG_MULTIPLAYER)
ATTRIB(XonoticMultiplayerDialog, intendedWidth, float, 0.96)
ATTRIB(XonoticMultiplayerDialog, rows, float, 24)
entity mc, e;
mc = makeXonoticTabController(me.rows - 2);
me.TR(me);
- me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Servers", makeXonoticServerListTab()));
- setDependentStringNotEqual(e, "_cl_name", "Player");
- me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Create", makeXonoticServerCreateTab()));
- setDependentStringNotEqual(e, "_cl_name", "Player");
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Demos", makeXonoticDemoBrowserTab()));
- me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Player Setup", makeXonoticPlayerSettingsTab()));
- if(cvar_string("_cl_name") == "Player")
- e.onClick(e, e.onClickEntity); // lol animation
+ me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Servers"), makeXonoticServerListTab()));
+ me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Create"), makeXonoticServerCreateTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Demos"), makeXonoticDemoBrowserTab()));
+ me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Player Setup"), makeXonoticPlayerSettingsTab()));
me.TR(me);
me.TR(me);
CLASS(XonoticServerCreateTab) EXTENDS(XonoticTab)
METHOD(XonoticServerCreateTab, fill, void(entity))
METHOD(XonoticServerCreateTab, gameTypeChangeNotify, void(entity))
- ATTRIB(XonoticServerCreateTab, title, string, "Create")
+ ATTRIB(XonoticServerCreateTab, title, string, _("Create"))
ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9)
ATTRIB(XonoticServerCreateTab, rows, float, 22)
ATTRIB(XonoticServerCreateTab, columns, float, 6.5)
float n;
me.TR(me);
- n = 6;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_dm", "DM"));
- e0 = e;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_lms", "LMS"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_arena", "Arena"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_runematch", "Runematch"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_race", "Race"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_cts", "Race CTS"));
- if(e.checked) e0 = NULL;
- me.TR(me);
- n = 8;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_tdm", "TDM"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ctf", "CTF"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ca", "CA"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_domination", "Domination"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_keyhunt", "Key Hunt"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_assault", "Assault"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_onslaught", "Onslaught"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_nexball", "Nexball"));
- if(e.checked) e0 = NULL;
- if(e0)
- {
- //print("NO CHECK\n");
- e0.setChecked(e0, 1);
- }
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Game type:")));
+ me.TR(me);
+ me.TD(me, 9, 3, e = makeXonoticGametypeList());
+ me.TR(me);
me.TR(me);
me.TR(me);
- me.mapListBox = makeXonoticMapList();
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Map list:"));
- makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
me.TR(me);
- me.TD(me, me.rows - 7, 3, me.mapListBox);
- me.gotoRC(me, me.rows - 3, 0);
- me.TDempty(me, 0.5);
- me.TD(me, 1, 1, e = makeXonoticButton("All", '0 0 0'));
- e.onClick = MapList_All;
- e.onClickEntity = me.mapListBox;
- me.TD(me, 1, 1, e = makeXonoticButton("None", '0 0 0'));
- e.onClick = MapList_None;
- e.onClickEntity = me.mapListBox;
- me.TDempty(me, 0.5);
-
- me.gotoRC(me, 3, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Match settings:"));
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Match settings:")));
me.TR(me);
me.sliderTimelimit = makeXonoticSlider(1.0, 60.0, 0.5, "timelimit_override");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderTimelimit, "Time limit:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderTimelimit, _("Time limit:")));
me.TD(me, 1, 2, me.sliderTimelimit);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderTimelimit, "Use map specified default"));
+ me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderTimelimit, _("Use map specified default")));
me.TR(me);
me.sliderFraglimit = makeXonoticSlider(1.0, 2000.0, 5, "fraglimit_override");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderFraglimit, "Point limit:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderFraglimit, _("Point limit:")));
me.checkboxFraglimit = e;
me.TD(me, 1, 2, me.sliderFraglimit);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderFraglimit, "Use map specified default"));
+ me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderFraglimit, _("Use map specified default")));
me.checkboxFraglimitMapinfo = e;
me.TR(me);
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Player slots:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Number of bots:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Bot skill:"));
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Bot skill:")));
setDependent(e, "bot_number", 0, -1);
me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
- e.addValue(e, "Botlike", "0");
- e.addValue(e, "Beginner", "1");
- e.addValue(e, "You will win", "2");
- e.addValue(e, "You can win", "3");
- e.addValue(e, "You might win", "4");
- e.addValue(e, "Advanced", "5");
- e.addValue(e, "Expert", "6");
- e.addValue(e, "Pro", "7");
- e.addValue(e, "Assassin", "8");
- e.addValue(e, "Unhuman", "9");
- e.addValue(e, "Godlike", "10");
+ e.addValue(e, _("Botlike"), "0");
+ e.addValue(e, _("Beginner"), "1");
+ e.addValue(e, _("You will win"), "2");
+ e.addValue(e, _("You can win"), "3");
+ e.addValue(e, _("You might win"), "4");
+ e.addValue(e, _("Advanced"), "5");
+ e.addValue(e, _("Expert"), "6");
+ e.addValue(e, _("Pro"), "7");
+ e.addValue(e, _("Assassin"), "8");
+ e.addValue(e, _("Unhuman"), "9");
+ e.addValue(e, _("Godlike"), "10");
e.configureXonoticTextSliderValues(e);
setDependent(e, "bot_number", 0, -1);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Bot names:"));
- me.TD(me, 1, 0.7, e = makeXonoticInputBox(1, "bot_prefix"));
- setDependent(e, "bot_number", 0, -1);
- me.TD(me, 1, 0.6, e = makeXonoticTextLabel(0.5, "Shadow"));
- setDependent(e, "bot_number", 0, -1);
- me.TD(me, 1, 0.7, e = makeXonoticInputBox(1, "bot_suffix"));
- setDependent(e, "bot_number", 0, -1);
- me.TR(me);
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Map voting:"));
- me.TD(me, 1, 2, e = makeXonoticTextSlider("g_maplist_votable"));
- e.addValue(e, "No voting", "0");
- e.addValue(e, "2 choices", "2");
- e.addValue(e, "3 choices", "3");
- e.addValue(e, "4 choices", "4");
- e.addValue(e, "5 choices", "5");
- e.addValue(e, "6 choices", "6");
- e.addValue(e, "7 choices", "7");
- e.addValue(e, "8 choices", "8");
- e.addValue(e, "9 choices", "9");
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(0.5, 0, "sv_vote_simple_majority_factor", "Simple majority wins vcall"));
- me.TR(me);
- me.TR(me);
- me.TDempty(me, 0.5);
- me.TD(me, 1, 2, e = makeXonoticButton("Advanced settings...", '0 0 0'));
- e.onClick = DialogOpenButton_Click;
- e.onClickEntity = main.advancedDialog;
- main.advancedDialog.refilterEntity = me.mapListBox;
- me.TR(me);
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticButton("Mutators...", '0 0 0'));
+ me.TD(me, 1, 1, e = makeXonoticButton(_("Mutators..."), '0 0 0'));
e.onClick = DialogOpenButton_Click;
e.onClickEntity = main.mutatorsDialog;
main.mutatorsDialog.refilterEntity = me.mapListBox;
me.TD(me, 1, 2, e0 = makeXonoticTextLabel(0, string_null));
e0.textEntity = main.mutatorsDialog;
e0.allowCut = 1;
+ me.TR(me);
+ me.TDempty(me, 0.5);
+ me.TD(me, 1, 2, e = makeXonoticButton(_("Advanced settings..."), '0 0 0'));
+ e.onClick = DialogOpenButton_Click;
+ e.onClickEntity = main.advancedDialog;
+ main.advancedDialog.refilterEntity = me.mapListBox;
+
+ me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
+ me.mapListBox = makeXonoticMapList();
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Map list:")));
+ makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
+ me.TR(me);
+ me.TD(me, me.rows - 4, 3, me.mapListBox);
+ me.gotoRC(me, me.rows - 3, 3.5);
+ me.TDempty(me, 0.25);
+ me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
+ e.onClick = MapList_All;
+ e.onClickEntity = me.mapListBox;
+ me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
+ e.onClick = MapList_None;
+ e.onClickEntity = me.mapListBox;
+ me.TDempty(me, 0.25);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("Start Multiplayer!", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
e.onClick = MapList_LoadMap;
e.onClickEntity = me.mapListBox;
me.mapListBox.startButton = e;
l2 = me.checkboxFraglimitMapinfo;
switch(gt)
{
- case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, l2, "Capture limit:", 1, 20, 1, "capturelimit_override"); break;
- case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, l2, "Point limit:", 50, 500, 10, "g_domination_point_limit"); break;
- case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, l2, "Point limit:", 200, 1500, 50, "g_keyhunt_point_limit"); break;
- case MAPINFO_TYPE_RUNEMATCH: GameType_ConfigureSliders(e, l, l2, "Point limit:", 50, 500, 10, "g_runematch_point_limit"); break;
- case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, l2, "Lives:", 3, 50, 1, "g_lms_lives_override"); break;
- case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(e, l, l2, "Laps:", 1, 25, 1, "g_race_laps_limit"); break;
- case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(e, l, l2, "Goals:", 1, 50, 1, "g_nexball_goallimit"); break;
- case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(e, l, l2, "Point limit:", 50, 500, 10, ""); break;
- case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(e, l, l2, "Point limit:", 50, 500, 10, ""); break;
- case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(e, l, l2, "Point limit:", 50, 500, 10, ""); break;
- default: GameType_ConfigureSliders(e, l, l2, "Frag limit:", 5, 100, 5, "fraglimit_override"); break;
+ case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, l2, _("Capture limit:"), 1, 20, 1, "capturelimit_override"); break;
+ case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 50, 500, 10, "g_domination_point_limit"); break;
+ case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit"); break;
+ case MAPINFO_TYPE_RUNEMATCH: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 50, 500, 10, "g_runematch_point_limit"); break;
+ case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, l2, _("Lives:"), 3, 50, 1, "g_lms_lives_override"); break;
+ case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(e, l, l2, _("Laps:"), 1, 25, 1, "g_race_laps_limit"); break;
+ case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(e, l, l2, _("Goals:"), 1, 50, 1, "g_nexball_goallimit"); break;
+ case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 50, 500, 10, ""); break;
+ case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 50, 500, 10, ""); break;
+ case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(e, l, l2, _("Point limit:"), 50, 500, 10, ""); break;
+ default: GameType_ConfigureSliders(e, l, l2, _("Frag limit:"), 5, 100, 5, "fraglimit_override"); break;
}
me.mapListBox.refilter(me.mapListBox);
}
METHOD(XonoticAdvancedDialog, fill, void(entity))
METHOD(XonoticAdvancedDialog, showNotify, void(entity))
METHOD(XonoticAdvancedDialog, close, void(entity))
- ATTRIB(XonoticAdvancedDialog, title, string, "Advanced server settings")
+ ATTRIB(XonoticAdvancedDialog, title, string, _("Advanced server settings"))
ATTRIB(XonoticAdvancedDialog, color, vector, SKINCOLOR_DIALOG_ADVANCED)
ATTRIB(XonoticAdvancedDialog, intendedWidth, float, 0.5)
- ATTRIB(XonoticAdvancedDialog, rows, float, 13)
+ ATTRIB(XonoticAdvancedDialog, rows, float, 17)
ATTRIB(XonoticAdvancedDialog, columns, float, 3)
ATTRIB(XonoticAdvancedDialog, refilterEntity, entity, NULL)
ENDCLASS(XonoticAdvancedDialog)
{
entity e;
me.TR(me);
- me.TD(me, 1, 1.2, makeXonoticTextLabel(0, "Game settings:"));
+ me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Game settings:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "sv_spectate", "Allow spectating"));
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "sv_spectate", _("Allow spectating")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Spawn shield:"));
- me.TD(me, 1, 1.7, e = makeXonoticSlider(0, 15, 0.5, "g_spawnshieldtime"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Spawn shield:")));
+ me.TD(me, 1, 1.6, e = makeXonoticSlider(0, 15, 0.5, "g_spawnshieldtime"));
me.TR(me);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Game speed:"));
- me.TD(me, 1, 1.7, e = makeXonoticSlider(0.5, 2.0, 0.1, "slowmo"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticCheckBoxEx(2, 0, "g_antilag", "AntiLag"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Game speed:")));
+ me.TD(me, 1, 1.6, e = makeXonoticSlider(0.5, 2.0, 0.1, "slowmo"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1.2, makeXonoticTextLabel(0, "Teamplay settings:"));
+ me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Teamplay settings:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Friendly fire scale:"));
- me.TD(me, 1, 1.7, e = makeXonoticSlider(0, 1.0, 0.05, "g_friendlyfire"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Friendly fire scale:")));
+ me.TD(me, 1, 1.6, e = makeXonoticSlider(0, 1.0, 0.05, "g_friendlyfire"));
+ me.TR(me);
+ me.TDempty(me, 0.4);
+ me.TD(me, 1, 2.6, e = makeXonoticCheckBox(0, "g_friendlyfire_virtual", _("Virtual friendly fire (effect only)")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Friendly fire penalty:"));
- me.TD(me, 1, 1.7, e = makeXonoticSlider(0, 1.0, 0.05, "g_mirrordamage"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Friendly fire penalty:")));
+ me.TD(me, 1, 1.6, e = makeXonoticSlider(0, 1.0, 0.05, "g_mirrordamage"));
+ me.TR(me);
+ me.TDempty(me, 0.4);
+ me.TD(me, 1, 2.6, e = makeXonoticCheckBox(0, "g_mirrordamage_virtual", _("Virtual penalty (effect only)")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Teams:"));
- me.TD(me, 1, 1.7, e = makeXonoticTextSlider("g_tdm_teams_override g_domination_teams_override g_keyhunt_teams_override"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Teams:")));
+ me.TD(me, 1, 1.6, e = makeXonoticTextSlider("g_tdm_teams_override g_domination_teams_override g_keyhunt_teams_override"));
e.addValue(e, "Default", "0");
e.addValue(e, "2 teams", "2");
e.addValue(e, "3 teams", "3");
e.addValue(e, "4 teams", "4");
e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TR(me);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Map voting:")));
+ me.TD(me, 1, 2, e = makeXonoticTextSlider("g_maplist_votable"));
+ e.addValue(e, _("No voting"), "0");
+ e.addValue(e, _("2 choices"), "2");
+ e.addValue(e, _("3 choices"), "3");
+ e.addValue(e, _("4 choices"), "4");
+ e.addValue(e, _("5 choices"), "5");
+ e.addValue(e, _("6 choices"), "6");
+ e.addValue(e, _("7 choices"), "7");
+ e.addValue(e, _("8 choices"), "8");
+ e.addValue(e, _("9 choices"), "9");
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(0.5, 0, "sv_vote_simple_majority_factor", _("Simple majority wins vcall")));
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
CLASS(XonoticMapInfoDialog) EXTENDS(XonoticDialog)
METHOD(XonoticMapInfoDialog, fill, void(entity))
METHOD(XonoticMapInfoDialog, loadMapInfo, void(entity, float, entity))
- ATTRIB(XonoticMapInfoDialog, title, string, "Map Information")
+ ATTRIB(XonoticMapInfoDialog, title, string, _("Map Information"))
ATTRIB(XonoticMapInfoDialog, color, vector, SKINCOLOR_DIALOG_MAPINFO)
- ATTRIB(XonoticMapInfoDialog, intendedWidth, float, 0.85)
- ATTRIB(XonoticMapInfoDialog, rows, float, 9)
+ ATTRIB(XonoticMapInfoDialog, intendedWidth, float, 1.0)
+ ATTRIB(XonoticMapInfoDialog, rows, float, 12)
ATTRIB(XonoticMapInfoDialog, columns, float, 10)
ATTRIB(XonoticMapInfoDialog, previewImage, entity, NULL)
ATTRIB(XonoticMapInfoDialog, descriptionLabel, entity, NULL)
ATTRIB(XonoticMapInfoDialog, featuresLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeDeathmatchLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeTDMLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeLMSLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeArenaLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeRuneLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeDominationLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeKeyHuntLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCTFLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCALabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeAssaultLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeOnslaughtLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeRaceLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCTSLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeNexballLabel, entity, NULL)
+ ATTRIBARRAY(XonoticMapInfoDialog, typeLabels, entity, 24)
ATTRIB(XonoticMapInfoDialog, currentMapIndex, float, 0)
ATTRIB(XonoticMapInfoDialog, currentMapBSPName, string, string_null)
me.currentMapTitle = strzone(MapInfo_Map_title);
me.currentMapAuthor = strzone(MapInfo_Map_author);
me.currentMapDescription = strzone(MapInfo_Map_description);
- me.currentMapFeaturesText = strzone((MapInfo_Map_supportedFeatures & MAPINFO_FEATURE_WEAPONS) ? "Full item placement" : "MinstaGib only");
+ me.currentMapFeaturesText = strzone((MapInfo_Map_supportedFeatures & MAPINFO_FEATURE_WEAPONS) ? _("Full item placement") : _("MinstaGib only"));
me.currentMapPreviewImage = strzone(strcat("/maps/", MapInfo_Map_bspname));
me.frame.setText(me.frame, me.currentMapBSPName);
me.featuresLabel.setText(me.featuresLabel, me.currentMapFeaturesText);
me.previewImage.src = me.currentMapPreviewImage;
- me.typeDeathmatchLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH);
- me.typeTDMLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH);
- me.typeLMSLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_LMS);
- me.typeArenaLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ARENA);
- me.typeDominationLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DOMINATION);
- me.typeRuneLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RUNEMATCH);
- me.typeKeyHuntLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT);
- me.typeCTFLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTF);
- me.typeCALabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CA);
- me.typeAssaultLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT);
- me.typeOnslaughtLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT);
- me.typeRaceLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE);
- me.typeCTSLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTS);
- me.typeNexballLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_NEXBALL);
+ for(i = 0; i < GameType_GetCount(); ++i)
+ {
+ entity e;
+ e = me.(typeLabels[i]);
+ e.disabled = !(MapInfo_Map_supportedGametypes & GameType_GetID(i));
+ }
MapInfo_ClearTemps();
}
void XonoticMapInfoDialog_fill(entity me)
{
entity e;
- float w, wgt;
+ float w, wgt, i, n;
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, me.rows - 2, 3, e = makeXonoticImage(string_null, 4.0/3.0));
me.previewImage = e;
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
w = me.columns - me.currentColumn;
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Title:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Title:")));
me.TD(me, 1, w-1, e = makeXonoticTextLabel(0, ""));
e.colorL = SKINCOLOR_MAPLIST_TITLE;
e.allowCut = 1;
me.titleLabel = e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Author:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Author:")));
me.TD(me, 1, w-1, e = makeXonoticTextLabel(0, ""));
e.colorL = SKINCOLOR_MAPLIST_AUTHOR;
e.allowCut = 1;
me.authorLabel = e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Features:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Features:")));
me.TD(me, 1, w-1, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.featuresLabel = e;
me.TR(me);
- me.TD(me, 1, w, e = makeXonoticTextLabel(0, "Game types:"));
- me.TR(me); wgt = (w-0.2)/5;
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "DM"));
- me.typeDeathmatchLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "TDM"));
- me.typeTDMLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "LMS"));
- me.typeLMSLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Arena"));
- me.typeArenaLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Rune"));
- me.typeRuneLabel = e;
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Domination"));
- me.typeDominationLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Key Hunt"));
- me.typeKeyHuntLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CTF"));
- me.typeCTFLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CA"));
- me.typeCALabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Assault"));
- me.typeAssaultLabel = e;
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Onslaught"));
- me.typeOnslaughtLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Race"));
- me.typeRaceLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CTS"));
- me.typeCTSLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Nexball"));
- me.typeNexballLabel = e;
+ me.TD(me, 1, w, e = makeXonoticTextLabel(0, _("Game types:")));
+
+
+ n = ceil(GameType_GetCount() / (me.rows - 6));
+ wgt = (w - 0.2) / n;
+ for(i = 0; i < GameType_GetCount(); ++i)
+ {
+ if(mod(i, n) == 0)
+ {
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ }
+ me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, GameType_GetName(i)));
+ me.(typeLabels[i]) = e;
+ }
me.gotoRC(me, me.rows - 2, 0);
me.TD(me, 1, me.columns, e = makeXonoticTextLabel(0.5, ""));
me.gotoRC(me, me.rows - 1, 0);
me.TDempty(me, 0.5);
- me.TD(me, 1, me.columns - 5.5, e = makeXonoticButton("Close", '0 0 0'));
+ me.TD(me, 1, me.columns - 5.5, e = makeXonoticButton(_("Close"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
- me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton("Play", '0 0 0'));
+ me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton(_("Play"), '0 0 0'));
me.startButton.onClick = MapList_LoadMap;
me.startButton.onClickEntity = NULL; // filled later
}
METHOD(XonoticMutatorsDialog, fill, void(entity))
METHOD(XonoticMutatorsDialog, showNotify, void(entity))
METHOD(XonoticMutatorsDialog, close, void(entity))
- ATTRIB(XonoticMutatorsDialog, title, string, "Mutators")
+ ATTRIB(XonoticMutatorsDialog, title, string, _("Mutators"))
ATTRIB(XonoticMutatorsDialog, color, vector, SKINCOLOR_DIALOG_MUTATORS)
ATTRIB(XonoticMutatorsDialog, intendedWidth, float, 0.9)
- ATTRIB(XonoticMutatorsDialog, rows, float, 18)
+ ATTRIB(XonoticMutatorsDialog, rows, float, 17)
ATTRIB(XonoticMutatorsDialog, columns, float, 6)
ATTRIB(XonoticMutatorsDialog, refilterEntity, entity, NULL)
ENDCLASS(XonoticMutatorsDialog)
if(s == "0")
return "";
if(s == "all")
- return "All Weapons Arena";
+ return _("All Weapons Arena");
if(s == "most")
- return "Most Weapons Arena";
+ return _("Most Weapons Arena");
if(s == weaponarenastring_cvar)
return weaponarenastring;
if(weaponarenastring)
s = strcat(s, " & ", e.message);
}
}
- s = strcat(substring(s, 3, strlen(s) - 3), " Arena");
+ s = sprintf(_("%s Arena"), substring(s, 3, strlen(s) - 3));
weaponarenastring = strzone(s);
string s;
s = "";
if(cvar("g_dodging"))
- s = strcat(s, ", Dodging");
+ s = strcat(s, ", ", _("Dodging"));
if(cvar("g_minstagib"))
- s = strcat(s, ", MinstaGib");
+ s = strcat(s, ", ", _("MinstaGib"));
if(cvar("g_nix"))
- s = strcat(s, ", NIX");
+ s = strcat(s, ", ", _("NIX"));
if(cvar("g_rocket_flying"))
- s = strcat(s, ", Rocket Flying");
+ s = strcat(s, ", ", _("Rocket Flying"));
if(cvar_string("g_weaponarena") != "0")
s = strcat(s, ", ", WeaponArenaString());
if(cvar("g_start_weapon_laser") == 0)
- s = strcat(s, ", No start weapons");
+ s = strcat(s, ", ", _("No start weapons"));
if(cvar("sv_gravity") < 800)
- s = strcat(s, ", Low gravity");
+ s = strcat(s, ", ", _("Low gravity"));
if(cvar("g_cloaked"))
- s = strcat(s, ", Cloaked");
+ s = strcat(s, ", ", _("Cloaked"));
if(cvar("g_grappling_hook"))
- s = strcat(s, ", Hook");
- if(cvar("g_laserguided_missile"))
- s = strcat(s, ", LG missiles");
+ s = strcat(s, ", ", _("Hook"));
if(cvar("g_midair"))
- s = strcat(s, ", Midair");
+ s = strcat(s, ", ", _("Midair"));
if(cvar("g_vampire"))
- s = strcat(s, ", Vampire");
+ s = strcat(s, ", ", _("Vampire"));
if(cvar("g_pinata"))
- s = strcat(s, ", Pinata");
+ s = strcat(s, ", ", _("Piñata"));
if(cvar("g_weapon_stay"))
- s = strcat(s, ", Weapons stay");
+ s = strcat(s, ", ", _("Weapons stay"));
if(cvar("g_bloodloss") > 0)
- s = strcat(s, ", Bloodloss");
+ s = strcat(s, ", ", _("Blood loss"));
if(cvar("g_jetpack"))
- s = strcat(s, ", Jet pack");
+ s = strcat(s, ", ", _("Jet pack"));
if(s == "")
- return "None";
+ return ZCTX(_("MUT^None"));
else
return substring(s, 2, strlen(s) - 2);
}
float i, j;
string str, hstr;
me.TR(me);
- me.TD(me, 1, 2, makeXonoticTextLabel(0, "Gameplay mutators:"));
+ me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_dodging", "Dodging"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_dodging", _("Dodging")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_cloaked", "Cloaked"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_cloaked", _("Cloaked")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_midair", "Midair"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_midair", _("Midair")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_vampire", "Vampire"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_vampire", _("Vampire")));
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticSlider(10, 50, 1, "g_bloodloss");
- me.TD(me, 1, 2, e = makeXonoticSliderCheckBox(0, 1, s, "Blood loss"));
+ me.TD(me, 1, 2, e = makeXonoticSliderCheckBox(0, 1, s, _("Blood loss")));
me.TR(me);
me.TDempty(me, 0.4);
me.TD(me, 1, 1.8, s);
s = makeXonoticSlider(80, 400, 8, "sv_gravity");
s.valueDigits = 0;
s.valueDisplayMultiplier = 0.125; // show gravity in percent
- me.TD(me, 1, 2, e = makeXonoticSliderCheckBox(800, 1, s, "Low gravity"));
+ me.TD(me, 1, 2, e = makeXonoticSliderCheckBox(800, 1, s, _("Low gravity")));
e.savedValue = 200; // good on silvercity
me.TR(me);
me.TDempty(me, 0.4);
me.TD(me, 1, 1.8, s);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 2, makeXonoticTextLabel(0, "Weapon & item mutators:"));
+ me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_grappling_hook", "Grappling hook"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_grappling_hook", _("Grappling hook")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_jetpack", "Jet pack"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_jetpack", _("Jet pack")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_laserguided_missile", "Laser guided missiles"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_rocket_flying", "Rocket Flying"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_pinata", _("Piñata")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_pinata", "Pinata"));
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(2, 0, "g_weapon_stay", "Weapons stay"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(2, 0, "g_weapon_stay", _("Weapons stay")));
me.TR(me);
me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Weapon arenas:"));
+ me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Weapon arenas:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, string_null, string_null, "Regular (no arena)"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, string_null, string_null, _("Regular (no arena)")));
for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
{
w = get_weaponinfo(i);
}
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "menu_weaponarena_with_laser", "with laser"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "menu_weaponarena_with_laser", _("with laser")));
// hook the draw function to gray it out
e.draw_weaponarena = e.draw;
e.draw = preDrawLaserWeaponArenaLaserButton;
e.saveCvars_weaponarena = e.saveCvars;
e.saveCvars = saveCvarsLaserWeaponArenaLaserButton;
me.TR(me);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Special arenas:"));
+ me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Special arenas:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_minstagib", string_null, "MinstaGib"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_minstagib", string_null, _("MinstaGib")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_nix", string_null, "NIX"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_nix", string_null, _("NIX")));
me.TR(me);
me.TDempty(me, 0.4);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "g_nix_with_laser", "with laser"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "g_nix_with_laser", _("with laser")));
setDependent(e, "g_nix", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_weaponarena", "most", "Most weapons"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_weaponarena", "most", _("Most weapons")));
e.cvarOffValue = "0";
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_start_weapon_laser", "0", "No start weapons"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_start_weapon_laser", "0", _("No start weapons")));
e.cvarOffValue = "-1";
- makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_campingrifle g_start_weapon_hlac g_start_weapon_seeker g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_porto g_start_weapon_tuba");
+ makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_sniperrifle g_start_weapon_hlac g_start_weapon_seeker g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_porto g_start_weapon_tuba g_start_weapon_minelayer");
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
#ifdef INTERFACE
CLASS(XonoticDemoBrowserTab) EXTENDS(XonoticTab)
METHOD(XonoticDemoBrowserTab, fill, void(entity))
- ATTRIB(XonoticDemoBrowserTab, title, string, "Demo")
+ ATTRIB(XonoticDemoBrowserTab, title, string, _("Demo"))
ATTRIB(XonoticDemoBrowserTab, intendedWidth, float, 0.9)
ATTRIB(XonoticDemoBrowserTab, rows, float, 22)
ATTRIB(XonoticDemoBrowserTab, columns, float, 6.5)
entity dlist;
me.TR(me);
- me.TD(me, 1, me.columns, e = makeXonoticCheckBox(0, "cl_autodemo", "Record demos while playing"));
+ me.TD(me, 1, me.columns, e = makeXonoticCheckBox(0, "cl_autodemo", _("Record demos while playing")));
me.TR(me);
dlist = makeXonoticDemoList();
me.TR(me);
- me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, "Filter:"));
- me.TD(me, 1, 0.5, btn = makeXonoticButton("Clear", '0 0 0'));
+ me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, _("Filter:")));
+ me.TD(me, 1, 0.5, btn = makeXonoticButton(_("Clear"), '0 0 0'));
btn.onClick = InputBox_Clear_Click;
me.TD(me, 1, me.columns - 1, e = makeXonoticInputBox(0, string_null));
e.onChange = DemoList_Filter_Change;
me.TR(me);
me.TD(me, me.rows - 4, me.columns, dlist);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns / 2, e = makeXonoticButton("Timedemo", '0 0 0'));
+ me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Timedemo"), '0 0 0'));
e.onClick = TimeDemo_Click;
e.onClickEntity = dlist;
- me.TD(me, 1, me.columns / 2, e = makeXonoticButton("Play", '0 0 0'));
+ me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Play"), '0 0 0'));
e.onClick = StartDemo_Click;
e.onClickEntity = dlist;
}
#ifdef INTERFACE
CLASS(XonoticServerListTab) EXTENDS(XonoticTab)
METHOD(XonoticServerListTab, fill, void(entity))
- ATTRIB(XonoticServerListTab, title, string, "Join")
+ ATTRIB(XonoticServerListTab, title, string, _("Join"))
ATTRIB(XonoticServerListTab, intendedWidth, float, 0.9)
ATTRIB(XonoticServerListTab, rows, float, 22)
ATTRIB(XonoticServerListTab, columns, float, 6.5)
slist = makeXonoticServerList();
me.TR(me);
- me.TD(me, 1, 0.4, e = makeXonoticTextLabel(0, "Filter:"));
- me.TD(me, 1, 0.6, btn = makeXonoticButton("Clear", '0 0 0'));
+ me.TD(me, 1, 0.4, e = makeXonoticTextLabel(0, _("Filter:")));
+ me.TD(me, 1, 0.6, btn = makeXonoticButton(_("Clear"), '0 0 0'));
btn.onClick = InputBox_Clear_Click;
me.TD(me, 1, me.columns - 0.6 * 4 - 0.4, e = makeXonoticInputBox(0, string_null));
e.onChange = ServerList_Filter_Change;
e.onChangeEntity = slist;
btn.onClickEntity = e;
slist.controlledTextbox = e;
- me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "menu_slist_showempty", "Empty"));
+ me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "menu_slist_showempty", ZCTX(_("SRVS^Empty"))));
slist.filterShowEmpty = e.checked;
e.onClickEntity = slist;
e.onClick = ServerList_ShowEmpty_Click;
- me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "menu_slist_showfull", "Full"));
+ me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "menu_slist_showfull", ZCTX(_("SRVS^Full"))));
slist.filterShowFull = e.checked;
e.onClickEntity = slist;
e.onClick = ServerList_ShowFull_Click;
- me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "net_slist_pause", "Pause"));
+ me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "net_slist_pause", _("Pause")));
me.TR(me);
me.TD(me, 1, 1, slist.sortButton1 = makeXonoticButton(string_null, '0 0 0'));
me.TD(me, me.rows - 4, me.columns, slist);
me.gotoRC(me, me.rows - 2, 0);
- me.TD(me, 1, 0.6, e = makeXonoticTextLabel(0, "Address:"));
+ me.TD(me, 1, 0.6, e = makeXonoticTextLabel(0, _("Address:")));
me.TD(me, 1, 2.9, e = makeXonoticInputBox(0, string_null));
e.onEnter = ServerList_Connect_Click;
e.onEnterEntity = slist;
+ e.onChange = ServerList_Update_favoriteButton;
+ e.onChangeEntity = slist;
slist.ipAddressBox = e;
me.TD(me, 1, 1.5, e = makeXonoticButton("", '0 0 0'));
e.onClick = ServerList_Favorite_Click;
e.onClickEntity = slist;
slist.favoriteButton = e;
- me.TD(me, 1, 1.5, e = makeXonoticButton("Info", '0 0 0'));
+ me.TD(me, 1, 1.5, e = makeXonoticButton(_("Info..."), '0 0 0'));
e.onClick = ServerList_Info_Click;
e.onClickEntity = slist;
slist.infoButton = e;
me.TR(me);
- me.TD(me, 1, me.columns, e = makeXonoticButton("Join!", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("Join!"), '0 0 0'));
e.onClick = ServerList_Connect_Click;
e.onClickEntity = slist;
slist.connectButton = e;
CLASS(XonoticServerInfoDialog) EXTENDS(XonoticDialog)
METHOD(XonoticServerInfoDialog, fill, void(entity))
METHOD(XonoticServerInfoDialog, loadServerInfo, void(entity, float))
- ATTRIB(XonoticServerInfoDialog, title, string, "Server Information")
+ ATTRIB(XonoticServerInfoDialog, title, string, _("Server Information"))
ATTRIB(XonoticServerInfoDialog, color, vector, SKINCOLOR_DIALOG_SERVERINFO)
- ATTRIB(XonoticServerInfoDialog, intendedWidth, float, 0.68)
+ ATTRIB(XonoticServerInfoDialog, intendedWidth, float, 0.8)
ATTRIB(XonoticServerInfoDialog, rows, float, 15)
ATTRIB(XonoticServerInfoDialog, columns, float, 12)
#ifdef IMPLEMENTATION
void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
{
- float m, pure, j;
- string s, typestr, versionstr, numh, maxp, k, v;
+ float m, pure, freeslots, j, numh, maxp, numb;
+ string s, typestr, versionstr, k, v;
if(me.currentServerName)
strunzone(me.currentServerName);
me.cnameLabel.setText(me.cnameLabel, me.currentServerCName);
pure = -1;
- typestr = "N/A";
- versionstr = "N/A";
+ typestr = _("N/A");
+ versionstr = _("N/A");
SLIST_FIELD_QCSTATUS = gethostcacheindexforkey("qcstatus");
s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
typestr = argv(0);
versionstr = argv(1);
}
+ freeslots = -1;
for(j = 2; j < m; ++j)
{
if(argv(j) == "")
v = substring(argv(j), 1, -1);
if(k == "P")
pure = stof(v);
+ else if(k == "S")
+ freeslots = stof(v);
}
me.currentServerType = strzone(typestr);
me.rawPlayerList.setPlayerList(me.rawPlayerList, me.currentServerPlayers);
SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey("numhumans");
- numh = ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i));
+ numh = gethostcachenumber(SLIST_FIELD_NUMHUMANS, i);
SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey("maxplayers");
- maxp = ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i));
- me.currentServerNumPlayers = strzone(strcat(numh,"/",maxp));
+ maxp = gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i);
+ SLIST_FIELD_NUMBOTS = gethostcacheindexforkey("numbots");
+ numb = gethostcachenumber(SLIST_FIELD_NUMBOTS, i);
+ if(freeslots < 0)
+ freeslots = maxp - numh - numb;
+ me.currentServerNumPlayers = strzone(sprintf(_("%d/%d, %d free player slots"), numh, maxp, freeslots));
me.numPlayersLabel.setText(me.numPlayersLabel, me.currentServerNumPlayers);
- SLIST_FIELD_NUMBOTS = gethostcacheindexforkey("numbots");
- s = ftos(gethostcachenumber(SLIST_FIELD_NUMBOTS, i));
+ s = ftos(numb);
me.currentServerNumBots = strzone(s);
me.numBotsLabel.setText(me.numBotsLabel, me.currentServerNumBots);
me.currentServerVersion = strzone(versionstr);
me.versionLabel.setText(me.versionLabel, me.currentServerVersion);
- me.currentServerPure = ((pure < 0) ? "N/A" : (pure == 0) ? "Official settings" : sprintf("%d modified settings", pure));
+ me.currentServerPure = ((pure < 0) ? "N/A" : (pure == 0) ? _("Official settings") : sprintf(_("%d modified settings"), pure));
me.currentServerPure = strzone(me.currentServerPure);
me.pureLabel.setText(me.pureLabel, me.currentServerPure);
s = crypto_getidfp(me.currentServerCName);
if not(s)
- s = "N/A";
+ s = _("N/A");
me.currentServerID = strzone(s);
me.idLabel.setText(me.idLabel, me.currentServerID);
s = crypto_getkeyfp(me.currentServerCName);
if not(s)
- s = "N/A";
+ s = _("N/A");
me.currentServerKey = strzone(s);
me.keyLabel.setText(me.keyLabel, me.currentServerKey);
if(s == "")
{
if(cvar("crypto_aeslevel") >= 3)
- me.currentServerEncrypt = "N/A (can't connect)";
+ me.currentServerEncrypt = _("N/A (can't connect)");
else
- me.currentServerEncrypt = "N/A";
+ me.currentServerEncrypt = _("N/A");
}
else switch(stof(substring(s, 0, 1)))
{
case 0:
if(cvar("crypto_aeslevel") >= 3)
- me.currentServerEncrypt = "not supported (can't connect)";
+ me.currentServerEncrypt = _("not supported (can't connect)");
else
- me.currentServerEncrypt = "not supported (won't encrypt)";
+ me.currentServerEncrypt = _("not supported (won't encrypt)");
break;
case 1:
if(cvar("crypto_aeslevel") >= 2)
- me.currentServerEncrypt = "supported (will encrypt)";
+ me.currentServerEncrypt = _("supported (will encrypt)");
else
- me.currentServerEncrypt = "supported (won't encrypt)";
+ me.currentServerEncrypt = _("supported (won't encrypt)");
break;
case 2:
if(cvar("crypto_aeslevel") >= 1)
- me.currentServerEncrypt = "requested (will encrypt)";
+ me.currentServerEncrypt = _("requested (will encrypt)");
else
- me.currentServerEncrypt = "requested (won't encrypt)";
+ me.currentServerEncrypt = _("requested (won't encrypt)");
break;
case 3:
if(cvar("crypto_aeslevel") <= 0)
- me.currentServerEncrypt = "required (can't connect)";
+ me.currentServerEncrypt = _("required (can't connect)");
else
- me.currentServerEncrypt = "required (will encrypt)";
+ me.currentServerEncrypt = _("required (will encrypt)");
break;
}
me.encryptLabel.setText(me.encryptLabel, me.currentServerEncrypt);
me.cnameLabel = e;
me.TR(me);
- me.TD(me, 1, 5.5, e = makeXonoticTextLabel(0, "Players:"));
+ me.TD(me, 1, 5.5, e = makeXonoticTextLabel(0, _("Players:")));
me.TR(me);
me.TD(me, me.rows - 4, 6, e = makeXonoticPlayerList());
me.rawPlayerList = e;
me.gotoRC(me, 1, 6.25); me.setFirstColumn(me, me.currentColumn);
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Type:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Type:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.typeLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Map:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Map:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.mapLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Gameplay:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Gameplay:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.pureLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Players:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Players:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.numPlayersLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Bots:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Bots:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.numBotsLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Mod:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Mod:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.modLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Version:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Version:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.versionLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Ping:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Ping:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.pingLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "CA:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("CA:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.keyLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Key:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Key:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.idLabel = e;
me.TR(me);
- me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, "Encryption:"));
+ me.TD(me, 1, 1.75, e = makeXonoticTextLabel(0, _("Encryption:")));
me.TD(me, 1, 4.0, e = makeXonoticTextLabel(0, ""));
e.allowCut = 1;
me.encryptLabel = e;
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns - 6, e = makeXonoticButton("Close", '0 0 0'));
+ me.TD(me, 1, me.columns - 6, e = makeXonoticButton(_("Close"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
- me.TD(me, 1, me.columns - 6, e = makeXonoticButton("Join!", '0 0 0'));
+ me.TD(me, 1, me.columns - 6, e = makeXonoticButton(_("Join!"), '0 0 0'));
e.onClick = Join_Click;
e.onClickEntity = me;
}
CLASS(XonoticPlayerSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticPlayerSettingsTab, fill, void(entity))
METHOD(XonoticPlayerSettingsTab, draw, void(entity))
- ATTRIB(XonoticPlayerSettingsTab, title, string, "Player Setup")
+ ATTRIB(XonoticPlayerSettingsTab, title, string, _("Player Setup"))
ATTRIB(XonoticPlayerSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticPlayerSettingsTab, rows, float, 22)
ATTRIB(XonoticPlayerSettingsTab, columns, float, 6.5)
float i, r, m, n;
me.TR(me);
- me.TD(me, 1, 0.5, me.playerNameLabel = makeXonoticTextLabel(0, "Name:"));
+ me.TD(me, 1, 0.5, me.playerNameLabel = makeXonoticTextLabel(0, _("Name:")));
me.playerNameLabelAlpha = me.playerNameLabel.alpha;
me.TD(me, 1, 2.5, label = makeXonoticTextLabel(0, string_null));
label.allowCut = 1;
me.TR(me);
me.TD(me, 1, 3.0, box = makeXonoticInputBox(1, "_cl_name"));
box.forbiddenCharacters = "\r\n\\\"$"; // don't care, isn't getting saved
- box.maxLength = 63;
+ box.maxLength = -127; // negative means encoded length in bytes
+ box.saveImmediately = 1;
label.textEntity = box;
me.TR(me);
me.TD(me, 5, 1, e = makeXonoticColorpicker(box));
me.TR(me);
me.gotoRC(me, 8, 0.0);
pms = makeXonoticPlayerModelSelector();
- me.TD(me, 1, 0.6, e = makeXonoticTextLabel(1, "Model:"));
+ me.TD(me, 1, 0.6, e = makeXonoticTextLabel(1, _("Model:")));
me.TD(me, 1, 0.3, e = makeXonoticButton("<<", '0 0 0'));
e.onClick = PlayerModelSelector_Prev_Click;
e.onClickEntity = pms;
}
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Field of view:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Field of view:")));
me.TD(me, 1, 2, e = makeXonoticSlider(60, 130, 1, "fov"));
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Damage kick:"));
- me.TD(me, 1, 2, e = makeXonoticSlider(0, 0.5, 0.05, "v_kicktime"));
me.TR(me);
sl = makeXonoticSlider(0.45, 0.75, 0.01, "cl_bobcycle");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, sl, "View bobbing:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, sl, _("View bobbing:")));
makeMulti(sl, "cl_bob2cycle");
me.TD(me, 1, 2, sl);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Zoom factor:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Zoom factor:")));
me.TD(me, 1, 2, e = makeXonoticSlider(2, 16, 0.5, "cl_zoomfactor"));
me.TR(me);
sl = makeXonoticSlider(1, 8, 0.5, "cl_zoomspeed");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1, 1, sl, "Zoom speed:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1, 1, sl, _("Zoom speed:")));
me.TD(me, 1, 2, sl);
me.TR(me);
- me.TD(me, 1, 1.5, e = makeXonoticButton("Weapon settings...", '0 0 0'));
+ me.TD(me, 1, 1.5, e = makeXonoticButton(_("Weapon settings..."), '0 0 0'));
e.onClick = DialogOpenButton_Click;
e.onClickEntity = main.weaponsDialog;
me.TD(me, 1, 1.5, e0 = makeXonoticTextLabel(0, string_null));
e0.textEntity = main.weaponsDialog;
e0.allowCut = 1;
me.TR(me);
- me.TD(me, 1, 0.75, e = makeXonoticTextLabel(0, "Crosshair:"));
- me.TD(me, 1, 1.00, e = makeXonoticCheckBox(0, "crosshair_per_weapon", "Per weapon"));
- me.TD(me, 1, 1.25, e = makeXonoticCheckBox(1, "crosshair_color_override", "& Per weapon colors"));
- setDependent(e, "crosshair_per_weapon", 1, 1);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair:")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "crosshair_per_weapon", _("Per weapon")));
me.TR(me);
- me.TDempty(me, 0.5);
+ me.TDempty(me, 0.2);
for(i = 1; i <= 10; ++i) {
me.TDNoMargin(me, 1, 2 / 10, e = makeXonoticCrosshairButton(3, i), '1 1 0');
setDependent(e, "crosshair_per_weapon", 0, 0);
}
+ // show a larger preview of the selected crosshair
+ me.TDempty(me, 0.2);
+ me.TDNoMargin(me, 2, 2 / 5, e = makeXonoticCrosshairButton(4, -1), '1 1 0'); // crosshair -1 makes this a preview
+ setDependent(e, "crosshair_per_weapon", 0, 0);
me.TR(me);
- me.TDempty(me, 0.5);
+ me.TDempty(me, 0.2);
for(i = 11; i <= 20; ++i) {
me.TDNoMargin(me, 1, 2 / 10, e = makeXonoticCrosshairButton(3, i), '1 1 0');
setDependent(e, "crosshair_per_weapon", 0, 0);
}
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair size:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair size:")));
me.TD(me, 1, 1.8, e = makeXonoticSlider(0.10, 1.5, 0.05, "crosshair_size"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair alpha:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair alpha:")));
me.TD(me, 1, 1.8, e = makeXonoticSlider(0, 1, 0.1, "crosshair_alpha"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair red:"));
- me.TD(me, 1, 1.8, e = makeXonoticSlider(0, 1, 0.01, "crosshair_color_red"));
- setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair color:"));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(4, "crosshair_color_per_weapon", string_null, _("Per weapon")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(4, "crosshair_color_by_health", string_null, _("By health")));
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair green:"));
- me.TD(me, 1, 1.8, e = makeXonoticSlider(0, 1, 0.01, "crosshair_color_green"));
- setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
+ me.TDempty(me, 0.3);
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(4, string_null, string_null, _("Custom")));
+ me.TD(me, 2, 1.8, e = makeXonoticColorpickerString("crosshair_color", "crosshair_color"));
+ setDependentAND(e, "crosshair_color_per_weapon", 0, 0, "crosshair_color_by_health", 0, 0);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Crosshair blue:"));
- me.TD(me, 1, 1.8, e = makeXonoticSlider(0, 1, 0.01, "crosshair_color_blue"));
- setDependentOR(e, "crosshair_per_weapon", 0, 0, "crosshair_color_override", 1, 1);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "crosshair_dot", "Enable centered dot"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "crosshair_dot", _("Enable center dot")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, "Size:"));
+ me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, _("Size:")));
me.TD(me, 1, 0.9, e = makeXonoticSlider(0.2, 2, 0.1, "crosshair_dot_size"));
setDependent(e, "crosshair_dot", 1, 1);
- me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, "Alpha:"));
+ me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, _("Alpha:")));
me.TD(me, 1, 0.9, e = makeXonoticSlider(0.10, 1, 0.1, "crosshair_dot_alpha"));
setDependent(e, "crosshair_dot", 1, 1);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Hit test:"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "crosshair_hittest", "0", "None"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "crosshair_hittest", "1", "TrueAim"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "crosshair_hittest", "1.25", "Enemies"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Hit test:")));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "0", ZCTX(_("HTST^None"))));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "1", _("TrueAim")));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(5, "crosshair_hittest", "1.25", _("Enemies")));
me.TR(me);
me.TDempty(me, 0.4);
- me.TD(me, 1, 2.2, e = makeXonoticButton("Waypoints setup...", '0 0 0'));
+ me.TD(me, 1, 2.2, e = makeXonoticButton(_("Waypoints setup..."), '0 0 0'));
e.onClick = DialogOpenButton_Click;
e.onClickEntity = main.waypointDialog;
- me.TDempty(me, 0.5);
me.TR(me);
me.TDempty(me, 0.4);
- me.TD(me, 1, 2.2, e = makeXonoticButton("Enter HUD editor", '0 0 0'));
+ me.TD(me, 1, 2.2, e = makeXonoticButton(_("Enter HUD editor"), '0 0 0'));
e.onClick = HUDSetup_Join_Click;
e.onClickEntity = me;
- me.TDempty(me, 0.5);
me.TR(me);
#ifdef ALLOW_FORCEMODELS
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Force models:"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(2, string_null, string_null, "None"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(2, "cl_forceplayermodelsfromxonotic", string_null, "Custom"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(2, "cl_forceplayermodels", string_null, "All"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Force models:")));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(6, string_null, string_null, ZCTX(_("MDL^None")));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(6, "cl_forceplayermodelsfromxonotic", string_null, ZCTX(_("MDL^Custom"))));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(6, "cl_forceplayermodels", string_null, ZCTX(_("MDL^All"))));
#endif
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_gentle", "Disable gore effects"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_gentle", _("Disable gore effects")));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Gibs:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Gibs:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_nogibs"));
- e.addValue(e, "None", "1");
- e.addValue(e, "Few", "0.75");
- e.addValue(e, "Many", "0.5");
- e.addValue(e, "Lots", "0");
+ e.addValue(e, ZCTX(_("GIBS^None")), "1");
+ e.addValue(e, ZCTX(_("GIBS^Few")), "0.75");
+ e.addValue(e, ZCTX(_("GIBS^Many")), "0.5");
+ e.addValue(e, ZCTX(_("GIBS^Lots")), "0");
e.configureXonoticTextSliderValues(e);
setDependent(e, "cl_gentle", 0, 0);
+ me.TR(me);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Damage splash:")));
+ me.TD(me, 1, 2, e = makeXonoticSlider(0, 1, 0.05, "hud_damage"));
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";cl_cmd sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_shownames;sendcvar cl_forceplayermodelsfromxonotic;sendcvar cl_forceplayermodels;playermodel $_cl_playermodel;playerskin $_cl_playerskin", COMMANDBUTTON_APPLY));
+ me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "color -1 -1;name \"$_cl_name\";cl_cmd sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_shownames;sendcvar cl_forceplayermodelsfromxonotic;sendcvar cl_forceplayermodels;playermodel $_cl_playermodel;playerskin $_cl_playerskin", COMMANDBUTTON_APPLY));
}
void HUDSetup_Join_Click(entity me, entity btn)
{
#ifdef INTERFACE
CLASS(XonoticWaypointDialog) EXTENDS(XonoticDialog)
- METHOD(XonoticWaypointDialog, toString, string(entity))
METHOD(XonoticWaypointDialog, fill, void(entity))
METHOD(XonoticWaypointDialog, showNotify, void(entity))
- ATTRIB(XonoticWaypointDialog, title, string, "Waypoints")
- ATTRIB(XonoticWaypointDialog, color, vector, SKINCOLOR_DIALOG_RADAR)
- ATTRIB(XonoticWaypointDialog, intendedWidth, float, 0.7)
+ ATTRIB(XonoticWaypointDialog, title, string, _("Waypoints"))
+ ATTRIB(XonoticWaypointDialog, color, vector, SKINCOLOR_DIALOG_WAYPOINTS)
+ ATTRIB(XonoticWaypointDialog, intendedWidth, float, 0.5)
ATTRIB(XonoticWaypointDialog, rows, float, 6)
- ATTRIB(XonoticWaypointDialog, columns, float, 4)
+ ATTRIB(XonoticWaypointDialog, columns, float, 3)
ENDCLASS(XonoticWaypointDialog)
#endif
#ifdef IMPLEMENTATION
void XonoticWaypointDialog_showNotify(entity me)
{
- loadAllCvars(me);
-}
-string XonoticWaypointDialog_toString(entity me)
-{
- return "XXX";
+ loadAllCvars(me);
}
void XonoticWaypointDialog_fill(entity me)
{
entity e;
-
- me.TR(me);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Waypoint settings:"));
+
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 3.8, e = makeXonoticCheckBox(1, "cl_hidewaypoints", "Show base waypoints"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_hidewaypoints", _("Show base waypoints")));
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Waypoint scale:"));
- me.TD(me, 1, 3, e = makeXonoticSlider(0.5, 1.5, 0.01, "g_waypointsprite_scale"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Waypoint scale:")));
+ me.TD(me, 1, 2, e = makeXonoticSlider(0.5, 1.5, 0.05, "g_waypointsprite_scale"));
setDependent(e, "cl_hidewaypoints", 0, 0);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Waypoint alpha:"));
- me.TD(me, 1, 3, e = makeXonoticSlider(0.1, 1, 0.01, "g_waypointsprite_alpha"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Waypoint alpha:")));
+ me.TD(me, 1, 2, e = makeXonoticSlider(0.1, 1, 0.05, "g_waypointsprite_alpha"));
setDependent(e, "cl_hidewaypoints", 0, 0);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Show names:"));
- me.TD(me, 1, 3, e = makeXonoticTextSlider("cl_shownames"));
- e.addValue(e, "Never", "0");
- e.addValue(e, "Teammates", "1");
- e.addValue(e, "All players", "2");
+ me.TR(me);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Show names:")));
+ me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_shownames"));
+ e.addValue(e, _("Never"), "0");
+ e.addValue(e, _("Teammates"), "1");
+ e.addValue(e, _("All players"), "2");
e.configureXonoticTextSliderValues(e);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
-
#endif
METHOD(XonoticWeaponsDialog, toString, string(entity))
METHOD(XonoticWeaponsDialog, fill, void(entity))
METHOD(XonoticWeaponsDialog, showNotify, void(entity))
- ATTRIB(XonoticWeaponsDialog, title, string, "Weapon settings")
+ ATTRIB(XonoticWeaponsDialog, title, string, _("Weapon settings"))
ATTRIB(XonoticWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
- ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.5)
+ ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticWeaponsDialog, rows, float, 17)
- ATTRIB(XonoticWeaponsDialog, columns, float, 4)
+ ATTRIB(XonoticWeaponsDialog, columns, float, 3)
ATTRIB(XonoticWeaponsDialog, weaponsList, entity, NULL)
ENDCLASS(XonoticWeaponsDialog)
#endif
entity e;
me.TR(me);
- me.TD(me, 1, 4, makeXonoticTextLabel(0, "Weapon priority list:"));
+ me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Weapon priority list:")));
me.TR(me);
- me.TD(me, 9, 4, e = me.weaponsList = makeXonoticWeaponsList());
+ me.TD(me, 9, 3, e = me.weaponsList = makeXonoticWeaponsList());
me.gotoRC(me, 10, 0);
- me.TDempty(me, 1);
- me.TD(me, 1, 1, e = makeXonoticButton("Up", '0 0 0'));
+ me.TDempty(me, 0.5);
+ me.TD(me, 1, 1, e = makeXonoticButton(_("Up"), '0 0 0'));
e.onClick = WeaponsList_MoveUp_Click;
e.onClickEntity = me.weaponsList;
- me.TD(me, 1, 1, e = makeXonoticButton("Down", '0 0 0'));
+ me.TD(me, 1, 1, e = makeXonoticButton(_("Down"), '0 0 0'));
e.onClick = WeaponsList_MoveDown_Click;
e.onClickEntity = me.weaponsList;
- me.gotoRC(me, 11, 0);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_weaponpriority_useforcycling", "Use priority list for weapon cycling"));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_autoswitch", "Auto switch weapons on pickup"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_weaponpriority_useforcycling", _("Use priority list for weapon cycling")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "r_drawviewmodel", "Draw 1st person weapon model"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_autoswitch", _("Auto switch weapons on pickup")));
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "r_drawviewmodel", _("Draw 1st person weapon model")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "cl_gunalign", "4", "Left align"));
+ me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
setDependent(e, "r_drawviewmodel", 1, 1);
- me.TD(me, 1, 1, e = makeXonoticRadioButton(1, "cl_gunalign", "3", "Right align"));
+ me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
setDependent(e, "r_drawviewmodel", 1, 1);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_flipped", "Flip view horizontally"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_flipped", _("Flip view horizontally")));
me.TR(me);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
#ifdef INTERFACE
CLASS(XonoticNewsDialog) EXTENDS(XonoticDialog)
METHOD(XonoticNewsDialog, fill, void(entity))
- ATTRIB(XonoticNewsDialog, title, string, "News")
+ ATTRIB(XonoticNewsDialog, title, string, _("News"))
ATTRIB(XonoticNewsDialog, color, vector, SKINCOLOR_DIALOG_SETTINGS)
ATTRIB(XonoticNewsDialog, intendedWidth, float, 0.96)
ATTRIB(XonoticNewsDialog, rows, float, 24)
entity e;
me.TR(me);
me.TD(me, 24, 1, e = spawnGecko());
- e.configureBrowser( e, "http://alientrap.org/xonotic/index.php?module=news" );
+ e.configureBrowser( e, _("http://www.xonotic.org/team/blog/") );
}
#endif
#ifdef INTERFACE
CLASS(XonoticQuitDialog) EXTENDS(XonoticDialog)
METHOD(XonoticQuitDialog, fill, void(entity))
- ATTRIB(XonoticQuitDialog, title, string, "Quit")
+ ATTRIB(XonoticQuitDialog, title, string, _("Quit"))
ATTRIB(XonoticQuitDialog, color, vector, SKINCOLOR_DIALOG_QUIT)
ATTRIB(XonoticQuitDialog, intendedWidth, float, 0.5)
ATTRIB(XonoticQuitDialog, rows, float, 3)
{
entity e;
me.TR(me);
- me.TD(me, 1, 2, makeXonoticTextLabel(0.5, "Are you sure you want to quit?"));
+ me.TD(me, 1, 2, makeXonoticTextLabel(0.5, _("Are you sure you want to quit?")));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCommandButton("Yes", '1 0 0', "quit", 0));
- me.TD(me, 1, 1, e = makeXonoticButton("No", '0 1 0'));
+ me.TD(me, 1, 1, e = makeXonoticCommandButton(_("Yes"), '1 0 0', "quit", 0));
+ me.TD(me, 1, 1, e = makeXonoticButton(_("No"), '0 1 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
#ifdef INTERFACE
CLASS(XonoticSettingsDialog) EXTENDS(XonoticDialog)
METHOD(XonoticSettingsDialog, fill, void(entity))
- ATTRIB(XonoticSettingsDialog, title, string, "Settings")
+ ATTRIB(XonoticSettingsDialog, title, string, _("Settings"))
ATTRIB(XonoticSettingsDialog, color, vector, SKINCOLOR_DIALOG_SETTINGS)
ATTRIB(XonoticSettingsDialog, intendedWidth, float, 0.96)
ATTRIB(XonoticSettingsDialog, rows, float, 19)
entity mc;
mc = makeXonoticTabController(me.rows - 2);
me.TR(me);
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Input", makeXonoticInputSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Video", makeXonoticVideoSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Effects", makeXonoticEffectsSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Audio", makeXonoticAudioSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Network", makeXonoticNetworkSettingsTab()));
- me.TD(me, 1, 1, mc.makeTabButton(mc, "Misc", makeXonoticMiscSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Input"), makeXonoticInputSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Video"), makeXonoticVideoSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Effects"), makeXonoticEffectsSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Audio"), makeXonoticAudioSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Network"), makeXonoticNetworkSettingsTab()));
+ me.TD(me, 1, 1, mc.makeTabButton(mc, _("Misc"), makeXonoticMiscSettingsTab()));
me.TR(me);
me.TR(me);
me.TD(me, me.rows - 2, me.columns, mc);
#ifdef INTERFACE
CLASS(XonoticAudioSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticAudioSettingsTab, fill, void(entity))
- ATTRIB(XonoticAudioSettingsTab, title, string, "Audio")
+ ATTRIB(XonoticAudioSettingsTab, title, string, _("Audio"))
ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticAudioSettingsTab, rows, float, 17)
ATTRIB(XonoticAudioSettingsTab, columns, float, 6.5)
me.TR(me);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "mastervolume");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Master:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Master:")));
me.TD(me, 1, 2, s);
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
makeMulti(s, "snd_csqcchannel2volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Music:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Music:")));
me.TD(me, 1, 2, s);
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_staticvolume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Ambient:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, ZCTX(_("VOL^Ambient:"))));
makeMulti(s, "snd_entchannel2volume");
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_worldchannel0volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Info:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Info:")));
makeMulti(s, "snd_csqcchannel0volume");
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel3volume");
makeMulti(s, "snd_playerchannel0volume snd_playerchannel3volume snd_csqcchannel3volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Items:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Items:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel6volume");
makeMulti(s, "snd_csqcchannel6volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Pain:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Pain:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel7volume");
makeMulti(s, "snd_entchannel7volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Player:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Player:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel4volume");
makeMulti(s, "snd_playerchannel4volume snd_entchannel6volume snd_csqcchannel4volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Shots:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Shots:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel2volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Voice:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Voice:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel1volume");
makeMulti(s, "snd_playerchannel5volume snd_entchannel1volume snd_entchannel5volume");
- me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Weapons:"));
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Weapons:")));
me.TD(me, 1, 2, s);
- setDependentStringNotEqual(e, "volume", "0");
- setDependentStringNotEqual(s, "volume", "0");
+ setDependentStringNotEqual(e, "mastervolume", "0");
+ setDependentStringNotEqual(s, "mastervolume", "0");
me.TR(me);
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Frequency:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Frequency:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("snd_speed"));
- e.addValue(e, "8 kHz", "8000");
- e.addValue(e, "11.025 kHz", "11025");
- e.addValue(e, "16 kHz", "16000");
- e.addValue(e, "22.05 kHz", "22050");
- e.addValue(e, "24 kHz", "24000");
- e.addValue(e, "32 kHz", "32000");
- e.addValue(e, "44.1 kHz", "44100");
- e.addValue(e, "48 kHz", "48000");
+ e.addValue(e, _("8 kHz"), "8000");
+ e.addValue(e, _("11.025 kHz"), "11025");
+ e.addValue(e, _("16 kHz"), "16000");
+ e.addValue(e, _("22.05 kHz"), "22050");
+ e.addValue(e, _("24 kHz"), "24000");
+ e.addValue(e, _("32 kHz"), "32000");
+ e.addValue(e, _("44.1 kHz"), "44100");
+ e.addValue(e, _("48 kHz"), "48000");
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Channels:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Channels:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("snd_channels"));
- e.addValue(e, "Mono", "1");
- e.addValue(e, "Stereo", "2");
- e.addValue(e, "2.1", "3");
- e.addValue(e, "3.1", "4");
- e.addValue(e, "4.1", "5");
- e.addValue(e, "5.1", "6");
- e.addValue(e, "6.1", "7");
- e.addValue(e, "7.1", "8");
+ e.addValue(e, _("Mono"), "1");
+ e.addValue(e, _("Stereo"), "2");
+ e.addValue(e, _("2.1"), "3");
+ e.addValue(e, _("4"), "4");
+ e.addValue(e, _("5"), "5");
+ e.addValue(e, _("5.1"), "6");
+ e.addValue(e, _("6.1"), "7");
+ e.addValue(e, _("7.1"), "8");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "snd_swapstereo", "Swap Stereo"));
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "snd_swapstereo", _("Swap Stereo")));
setDependent(e, "snd_channels", 1.5, 0.5);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "snd_spatialization_control", "Headphone friendly mode"));
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "snd_spatialization_control", _("Headphone friendly mode")));
setDependent(e, "snd_channels", 1.5, 0.5);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Spatial voices:"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "0", "None"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "2", "Taunts"));
- me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "1", "All"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Spatial voices:")));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "0", ZCTX(_("VOCS^None"))));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "2", ZCTX(_("VOCS^Taunts"))));
+ me.TD(me, 1, 2/3, e = makeXonoticRadioButton(1, "cl_voice_directional", "1", ZCTX(_("VOCS^All"))));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Taunt range:"));
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Taunt range:")));
setDependent(e, "cl_voice_directional", 0.5, -0.5);
me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_voice_directional_taunt_attenuation"));
- e.addValue(e, "Very short", "3");
- e.addValue(e, "Short", "2");
- e.addValue(e, "Normal", "0.5");
- e.addValue(e, "Long", "0.25");
- e.addValue(e, "Full", "0.015625");
+ e.addValue(e, ZCTX(_("RNG^Very short")), "3");
+ e.addValue(e, ZCTX(_("RNG^Short")), "2");
+ e.addValue(e, ZCTX(_("RNG^Normal")), "0.5");
+ e.addValue(e, ZCTX(_("RNG^Long")), "0.25");
+ e.addValue(e, ZCTX(_("RNG^Full")), "0.015625");
e.configureXonoticTextSliderValues(e);
setDependent(e, "cl_voice_directional", 0.5, -0.5);
me.TR(me);
sl = makeXonoticSlider(0.15, 1, 0.05, "cl_autotaunt");
sl.valueDisplayMultiplier = 100;
sl.valueDigits = 0;
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, sl, "Automatic taunts"));
+ me.TD(me, 1, 3, e = makeXonoticSliderCheckBox(0, 1, sl, _("Automatic taunts")));
if(sl.value != e.savedValue)
e.savedValue = 0.65; // default
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Frequency:"));
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Frequency:")));
me.TD(me, 1, 2, sl);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Time warning:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time warning:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_sound_maptime_warning"));
- e.addValue(e, "None", "0");
- e.addValue(e, "1 minute", "1");
- e.addValue(e, "5 minutes", "2");
- e.addValue(e, "Both", "3");
+ e.addValue(e, ZCTX(_("WRN^None")), "0");
+ e.addValue(e, _("1 minute"), "1");
+ e.addValue(e, _("5 minutes"), "2");
+ e.addValue(e, ZCTX(_("WRN^Both")), "3");
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_hitsound", "Hit indicator"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_hitsound", _("Hit indicator")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(2, 0, "menu_sounds", "Menu sounds"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(2, 0, "menu_sounds", _("Menu sounds")));
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "snd_restart; sendcvar cl_hitsound; sendcvar cl_autotaunt; sendcvar cl_voice_directional; sendcvar cl_voice_directional_taunt_attenuation", COMMANDBUTTON_APPLY));
+ me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "snd_restart; sendcvar cl_hitsound; sendcvar cl_autotaunt; sendcvar cl_voice_directional; sendcvar cl_voice_directional_taunt_attenuation", COMMANDBUTTON_APPLY));
}
#endif
#ifdef INTERFACE
CLASS(XonoticEffectsSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticEffectsSettingsTab, fill, void(entity))
- ATTRIB(XonoticEffectsSettingsTab, title, string, "Effects")
+ ATTRIB(XonoticEffectsSettingsTab, title, string, _("Effects"))
ATTRIB(XonoticEffectsSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticEffectsSettingsTab, rows, float, 17)
ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.5)
return FALSE;
}
-float updateCompression()
-{
- float fh;
- float have_dds, have_jpg, have_tga;
- if((have_dds = ((fh = fopen("dds/particles/particlefont.dds", FILE_READ)) >= 0)))
- fclose(fh);
- if((have_jpg = ((fh = fopen("particles/particlefont.jpg", FILE_READ)) >= 0)))
- fclose(fh);
- if((have_tga = ((fh = fopen("particles/particlefont.tga", FILE_READ)) >= 0)))
- fclose(fh);
- if(have_dds && (have_jpg || have_tga))
- {
- cvar_set("gl_texturecompression", "0");
- return 1;
- }
- else if(have_dds)
- {
- cvar_set("gl_texturecompression", "0");
- cvar_set("r_texture_dds_load", "1");
- return 0;
- }
- else
- {
- cvar_set("gl_texturecompression", cvar_string("r_texture_dds_load"));
- return 2;
- }
-}
-
void XonoticEffectsSettingsTab_fill(entity me)
{
entity e, s;
float n;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Quality preset:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Quality preset:")));
n = 5 + 2 * !!cvar("developer");
if(cvar("developer"))
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("OMG!", '1 0 1', "exec effects-omg.cfg", 0));
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("Low", '0 0 0', "exec effects-low.cfg", 0));
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("Medium", '0 0 0', "exec effects-med.cfg", 0));
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("Normal", '0 0 0', "exec effects-normal.cfg", 0));
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("High", '0 0 0', "exec effects-high.cfg", 0));
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("Ultra", '0 0 0', "exec effects-ultra.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^OMG!")), '1 0 1', "exec effects-omg.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^Low")), '0 0 0', "exec effects-low.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^Medium")), '0 0 0', "exec effects-med.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^Normal")), '0 0 0', "exec effects-normal.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^High")), '0 0 0', "exec effects-high.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^Ultra")), '0 0 0', "exec effects-ultra.cfg", 0));
if(cvar("developer"))
- me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton("Ultimate", '0 0 0', "exec effects-ultimate.cfg", 0));
+ me.TD(me, 1, 5.5 / n, e = makeXonoticCommandButton(ZCTX(_("PRE^Ultimate")), '0 0 0', "exec effects-ultimate.cfg", 0));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Geometry detail:"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Geometry detail:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("r_subdivisions_tolerance"));
- e.addValue(e, "Lowest", "16");
- e.addValue(e, "Low", "8");
- e.addValue(e, "Normal", "4");
- e.addValue(e, "Good", "3");
- e.addValue(e, "Best", "2");
- e.addValue(e, "Insane", "1");
+ e.addValue(e, ZCTX(_("DET^Lowest")), "16");
+ e.addValue(e, ZCTX(_("DET^Low")), "8");
+ e.addValue(e, ZCTX(_("DET^Normal")), "4");
+ e.addValue(e, ZCTX(_("DET^Good")), "3");
+ e.addValue(e, ZCTX(_("DET^Best")), "2");
+ e.addValue(e, ZCTX(_("DET^Insane")), "1");
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Antialiasing:"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Antialiasing:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("vid_samples"));
- e.addValue(e, "Disabled", "1");
- e.addValue(e, "2x", "2");
- e.addValue(e, "4x", "4");
+ e.addValue(e, ZCTX(_("AA^Disabled")), "1");
+ e.addValue(e, _("2x"), "2");
+ e.addValue(e, _("4x"), "4");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Texture resolution:"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Texture resolution:")));
me.TD(me, 1, 2, e = makeXonoticPicmipSlider());
if(cvar("developer"))
- e.addValue(e, "Leet", "1337");
- e.addValue(e, "Lowest", "2");
- e.addValue(e, "Low", "1");
- e.addValue(e, "Normal", "0");
- e.addValue(e, "Good", "-1");
- e.addValue(e, "Best", "-2");
+ e.addValue(e, ZCTX(_("RES^Leet")), "1337");
+ e.addValue(e, ZCTX(_("RES^Lowest")), "2");
+ e.addValue(e, ZCTX(_("RES^Low")), "1");
+ e.addValue(e, ZCTX(_("RES^Normal")), "0");
+ e.addValue(e, ZCTX(_("RES^Good")), "-1");
+ e.addValue(e, ZCTX(_("RES^Best")), "-2");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
case 0:
break;
case 1:
- me.TD(me, 1, 2.8, e = makeXonoticCheckBox(1, "r_texture_dds_load", "Avoid lossy texture compression"));
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(1, "r_texture_dds_load", _("Avoid lossy texture compression")));
break;
case 2:
- me.TD(me, 1, 2.8, e = makeXonoticCheckBox(1, "r_texture_dds_load", "Avoid lossy texture compression"));
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(1, "r_texture_dds_load", _("Avoid lossy texture compression")));
makeMulti(e, "gl_texturecompression");
break;
}
}
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Anisotropy:"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Anisotropy:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("gl_texture_anisotropy"));
- e.addValue(e, "Disabled", "1");
- e.addValue(e, "2x", "2");
- e.addValue(e, "4x", "4");
- e.addValue(e, "8x", "8");
- e.addValue(e, "16x", "16");
+ e.addValue(e, ZCTX(_("ANISO^Disabled")), "1");
+ e.addValue(e, _("2x"), "2");
+ e.addValue(e, _("4x"), "4");
+ e.addValue(e, _("8x"), "8");
+ e.addValue(e, _("16x"), "16");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Particle quality:"));
- me.TD(me, 1, 2, e = makeXonoticSlider(0.2, 1.0, 0.1, "cl_particles_quality"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Particle quality:")));
+ me.TD(me, 1, 1.9, e = makeXonoticSlider(0.2, 1.0, 0.1, "cl_particles_quality"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Particle dist.:"));
- me.TD(me, 1, 2, e = makeXonoticSlider(500, 2000, 100, "r_drawparticles_drawdistance"));
+ me.TD(me, 1, 1.1, e = makeXonoticTextLabel(0, _("Particle distance:")));
+ me.TD(me, 1, 1.9, e = makeXonoticSlider(500, 2000, 100, "r_drawparticles_drawdistance"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_decals", "Decals"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Distance:"));
+ me.TD(me, 1, 0.9, e = makeXonoticTextLabel(0, _("Distance:")));
setDependent(e, "cl_decals", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
+ me.TD(me, 1, 1.9, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
setDependent(e, "cl_decals", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Time:"));
+ me.TD(me, 1, 0.9, e = makeXonoticTextLabel(0, _("Time:")));
setDependent(e, "cl_decals", 1, 1);
- me.TD(me, 1, 2, e = makeXonoticSlider(1, 20, 1, "cl_decals_time"));
+ me.TD(me, 1, 1.9, e = makeXonoticSlider(1, 20, 1, "cl_decals_time"));
setDependent(e, "cl_decals", 1, 1);
me.gotoRC(me, 2, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(1, "mod_q3bsp_nolightmaps", "Use lightmaps"));
- me.TD(me, 1, 1.9, e = makeXonoticCheckBox(0, "r_glsl_deluxemapping", "Deluxe mapping"));
+ me.TD(me, 1, 1.2, e = makeXonoticCheckBox(1, "mod_q3bsp_nolightmaps", _("Use lightmaps")));
+ me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_deluxemapping", _("Deluxe mapping")));
setDependentAND(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
- me.TD(me, 1, 0.7, e = makeXonoticCheckBox(0, "r_shadow_gloss", "Gloss"));
+ me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "r_shadow_gloss", _("Gloss")));
setDependentAND3(e, "vid_gl20", 1, 1, "r_glsl_deluxemapping", 1, 2, "mod_q3bsp_nolightmaps", 0, 0);
me.TR(me);
- me.TD(me, 1, 1.5, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping", "Offset mapping"));
+ me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping", _("Offset mapping")));
setDependent(e, "vid_gl20", 1, 1);
- me.TD(me, 1, 1.9, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping_reliefmapping", "Relief mapping"));
+ me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping_reliefmapping", _("Relief mapping")));
setDependentAND(e, "vid_gl20", 1, 1, "r_glsl_offsetmapping", 1, 1);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_water", "Reflections:"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_water", _("Reflections:")));
setDependent(e, "vid_gl20", 1, 1);
me.TD(me, 1, 2, e = makeXonoticTextSlider("r_water_resolutionmultiplier"));
- e.addValue(e, "Blurred", "0.25");
- e.addValue(e, "Good", "0.5");
- e.addValue(e, "Sharp", "1");
+ e.addValue(e, _("Blurred"), "0.25");
+ e.addValue(e, ZCTX(_("REFL^Good")), "0.5");
+ e.addValue(e, _("Sharp"), "1");
e.configureXonoticTextSliderValues(e);
setDependentAND(e, "vid_gl20", 1, 1, "r_water", 1, 1);
me.TR(me);
if(cvar("developer"))
- me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(3, 0, "r_showsurfaces", "Show surfaces"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(3, 0, "r_showsurfaces", _("Show surfaces")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticRadioButton(1, string_null, string_null, "No dynamic lighting"));
+ me.TD(me, 1, 3, e = makeXonoticRadioButton(1, string_null, string_null, _("No dynamic lighting")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticRadioButton(1, "gl_flashblend", string_null, "Flash blend approximation"));
+ me.TD(me, 1, 3, e = makeXonoticRadioButton(1, "gl_flashblend", string_null, _("Flash blend approximation")));
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "r_shadow_realtime_dlight", string_null, "Realtime dynamic lighting"));
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_realtime_dlight_shadows", "Shadows"));
+ me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "r_shadow_realtime_dlight", string_null, _("Realtime dynamic lighting")));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_realtime_dlight_shadows", _("Shadows")));
setDependent(e, "r_shadow_realtime_dlight", 1, 1);
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "r_shadow_realtime_world", "Realtime world lighting"));
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_realtime_world_shadows", "Shadows"));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "r_shadow_realtime_world", _("Realtime world lighting")));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_realtime_world_shadows", _("Shadows")));
setDependent(e, "r_shadow_realtime_world", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "r_shadow_usenormalmap", "Use normal maps"));
+ me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "r_shadow_usenormalmap", _("Use normal maps")));
setDependentOR(e, "r_shadow_realtime_dlight", 1, 1, "r_shadow_realtime_world", 1, 1);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_shadowmapping", "Soft shadows"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_shadow_shadowmapping", _("Soft shadows")));
setDependentWeird(e, someShadowCvarIsEnabled);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_coronas", "Coronas"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_coronas", _("Coronas")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "r_coronas_occlusionquery", _("Use Occlusion Queries")));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_bloom", "Bloom"));
+ me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_bloom", _("Bloom")));
setDependent(e, "r_hdr", 0, 0);
- me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(2, 0, "r_hdr", "High Dynamic Range (HDR)"));
+ me.TD(me, 1, 1.8, e = makeXonoticCheckBoxEx(2, 0, "r_hdr", _("High Dynamic Range (HDR)")));
me.TR(me);
s = makeXonoticSlider(0.1, 1, 0.1, "r_motionblur");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, "Motion blur:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, _("Motion blur:")));
if(s.value != e.savedValue)
e.savedValue = 0.5; // default
me.TD(me, 1, 2, s);
me.TR(me);
s = makeXonoticSlider(0.1, 1, 0.1, "r_damageblur");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, "Damage blur:"));
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, _("Damage blur:")));
if(s.value != e.savedValue)
e.savedValue = 0.4; // default
me.TD(me, 1, 2, s);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
+ me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
}
#endif
#ifdef INTERFACE
CLASS(XonoticInputSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticInputSettingsTab, fill, void(entity))
- ATTRIB(XonoticInputSettingsTab, title, string, "Input")
+ ATTRIB(XonoticInputSettingsTab, title, string, _("Input"))
ATTRIB(XonoticInputSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticInputSettingsTab, rows, float, 17)
ATTRIB(XonoticInputSettingsTab, columns, float, 6.5)
entity kb;
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Key bindings:"));
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Key bindings:")));
me.TR(me);
me.TD(me, me.rows - 2, 3.3, kb = makeXonoticKeyBinder());
me.gotoRC(me, me.rows - 1, 0);
me.TR(me);
- me.TD(me, 1, 1.1, e = makeXonoticButton("Change key...", '0 0 0'));
+ me.TD(me, 1, 1.1, e = makeXonoticButton(_("Change key..."), '0 0 0'));
e.onClick = KeyBinder_Bind_Change;
e.onClickEntity = kb;
kb.keyGrabButton = e;
- me.TD(me, 1, 1.1, e = makeXonoticButton("Edit...", '0 0 0'));
+ me.TD(me, 1, 1.1, e = makeXonoticButton(_("Edit..."), '0 0 0'));
e.onClick = KeyBinder_Bind_Edit;
e.onClickEntity = kb;
kb.userbindEditButton = e;
kb.userbindEditDialog = main.userbindEditDialog;
main.userbindEditDialog.keybindBox = kb;
- me.TD(me, 1, 1.1, e = makeXonoticButton("Clear", '0 0 0'));
+ me.TD(me, 1, 1.1, e = makeXonoticButton(_("Clear"), '0 0 0'));
e.onClick = KeyBinder_Bind_Clear;
e.onClickEntity = kb;
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Sensitivity:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Sensitivity:")));
me.TD(me, 1, 2, e = makeXonoticSlider(1, 32, 0.2, "sensitivity"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "UI mouse speed:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("UI mouse speed:")));
me.TD(me, 1, 2, e = makeXonoticSlider(0.2, 4.0, 0.1, "menu_mouse_speed"));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "m_filter", "Mouse filter"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "m_filter", _("Mouse filter")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(1.022, "m_pitch", "Invert mouse"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(1.022, "m_pitch", _("Invert mouse")));
me.TR(me);
if(cvar_type("joy_enable") & CVAR_TYPEFLAG_ENGINE)
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "joy_enable", "Use joystick input"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "joy_enable", _("Use joystick input")));
else if(cvar_type("joystick") & CVAR_TYPEFLAG_ENGINE)
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "joystick", "Use joystick input"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "joystick", _("Use joystick input")));
me.TR(me);
if(cvar_type("vid_dgamouse") & CVAR_TYPEFLAG_ENGINE)
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_dgamouse", "Turn off OS mouse acceleration"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_dgamouse", _("Turn off OS mouse acceleration")));
else if(cvar_type("apple_mouse_noaccel") & CVAR_TYPEFLAG_ENGINE)
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "apple_mouse_noaccel", "Turn off OS mouse acceleration"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "apple_mouse_noaccel", _("Turn off OS mouse acceleration")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_closeontoggleconsole", "\"enter console\" also closes"));
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Show binds:"));
- me.TD(me, 1, 2, e = makeXonoticTextSlider("sbar_showbinds"));
- e.addValue(e, "Actions", "0");
- e.addValue(e, "Bound keys", "1");
- e.addValue(e, "Both", "2");
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(2, 0, "cl_showpressedkeys", "Show pressed keys"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_closeontoggleconsole", _("\"enter console\" also closes")));
}
#endif
CLASS(XonoticUserbindEditDialog) EXTENDS(XonoticDialog)
METHOD(XonoticUserbindEditDialog, loadUserBind, void(entity, string, string, string))
METHOD(XonoticUserbindEditDialog, fill, void(entity))
- ATTRIB(XonoticUserbindEditDialog, title, string, "User defined key bind")
+ ATTRIB(XonoticUserbindEditDialog, title, string, _("User defined key bind"))
ATTRIB(XonoticUserbindEditDialog, color, vector, SKINCOLOR_DIALOG_USERBIND)
ATTRIB(XonoticUserbindEditDialog, intendedWidth, float, 0.7)
ATTRIB(XonoticUserbindEditDialog, rows, float, 4)
{
entity e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Name:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Name:")));
me.TD(me, 1, me.columns - 1, me.nameBox = makeXonoticInputBox(0, string_null));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Command when pressed:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Command when pressed:")));
me.TD(me, 1, me.columns - 1, me.commandPressBox = makeXonoticInputBox(0, string_null));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Command when released:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Command when released:")));
me.TD(me, 1, me.columns - 1, me.commandReleaseBox = makeXonoticInputBox(0, string_null));
me.TR(me);
- me.TD(me, 1, me.columns / 2, e = makeXonoticButton("Save", '0 0 0'));
+ me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Save"), '0 0 0'));
e.onClick = XonoticUserbindEditDialog_Save;
e.onClickEntity = me;
- me.TD(me, 1, me.columns / 2, e = makeXonoticButton("Cancel", '0 0 0'));
+ me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Cancel"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
#ifdef INTERFACE
CLASS(XonoticMiscSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticMiscSettingsTab, fill, void(entity))
- ATTRIB(XonoticMiscSettingsTab, title, string, "Misc")
+ ATTRIB(XonoticMiscSettingsTab, title, string, _("Misc"))
ATTRIB(XonoticMiscSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticMiscSettingsTab, rows, float, 17)
ATTRIB(XonoticMiscSettingsTab, columns, float, 6.5)
entity sk;
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Menu skins:"));
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Menu skins:")));
me.TR(me);
me.TD(me, me.rows - 2, 3, sk = makeXonoticSkinList());
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, 3, e = makeXonoticButton("Apply immediately", '0 0 0'));
+ me.TD(me, 1, 3, e = makeXonoticButton(_("Apply immediately"), '0 0 0'));
e.onClick = SetSkin_Click;
e.onClickEntity = sk;
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showtime", "Show current time"));
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Text language:")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showdate", "Show current date"));
+ me.TD(me, 3, 3, sk = makeXonoticLanguageList());
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showfps", "Show frames per second"));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_showspeed", "Speedometer"));
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticButton(_("Apply immediately"), '0 0 0'));
+ e.onClick = SetLanguage_Click;
+ e.onClickEntity = sk;
+
+ me.TR(me);
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showtime", _("Show current time")));
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showdate", _("Show current date")));
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "showfps", _("Show frames per second")));
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_showspeed", _("Speedometer")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "0", "qu/s (hidden)"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "0", _("qu/s (hidden)")));
setDependent(e, "cl_showspeed", 1, 1);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "1", "qu/s"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "1", _("qu/s")));
setDependent(e, "cl_showspeed", 1, 1);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "2", "m/s"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "2", _("m/s")));
setDependent(e, "cl_showspeed", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "3", "km/h"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "3", _("km/h")));
setDependent(e, "cl_showspeed", 1, 1);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "4", "mph"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "4", _("mph")));
setDependent(e, "cl_showspeed", 1, 1);
- me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "5", "knots"));
+ me.TD(me, 1, 2.8/3, e = makeXonoticRadioButton(1, "cl_showspeed_unit", "5", _("knots")));
setDependent(e, "cl_showspeed", 1, 1);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_showacceleration", "Show accelerometer"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_showacceleration", _("Show accelerometer")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8/2, e = makeXonoticTextLabel(0, "Accelerometer scale:"));
+ me.TD(me, 1, 2.8/2, e = makeXonoticTextLabel(0, _("Accelerometer scale:")));
setDependent(e, "cl_showacceleration", 1, 1);
- me.TD(me, 1, 2.8/2, e = makeXonoticSlider(1, 10, 0.5, "cl_showacceleration_scale"));
+ me.TD(me, 1, 2.8/2, e = makeXonoticSlider(0.2, 2, 0.2, "cl_showacceleration_scale"));
setDependent(e, "cl_showacceleration", 1, 1);
me.TR(me);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "cl_maxfps_alwayssleep", "Minimize input latency"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_maxfps_alwayssleep", _("Minimize input latency")));
me.TR(me);
me.TR(me);
me.TDempty(me, 0.5);
- me.TD(me, 1, 2, e = makeXonoticButton("Advanced settings...", '0 0 0'));
+ me.TD(me, 1, 2, e = makeXonoticButton(_("Advanced settings..."), '0 0 0'));
e.onClick = DialogOpenButton_Click;
e.onClickEntity = main.cvarsDialog;
}
#ifdef INTERFACE
CLASS(XonoticCvarsDialog) EXTENDS(XonoticDialog)
- METHOD(XonoticCvarsDialog, toString, string(entity))
METHOD(XonoticCvarsDialog, fill, void(entity))
METHOD(XonoticCvarsDialog, showNotify, void(entity))
- ATTRIB(XonoticCvarsDialog, title, string, "Advanced settings")
+ ATTRIB(XonoticCvarsDialog, title, string, _("Advanced settings"))
ATTRIB(XonoticCvarsDialog, color, vector, SKINCOLOR_DIALOG_CVARS)
ATTRIB(XonoticCvarsDialog, intendedWidth, float, 0.8)
ATTRIB(XonoticCvarsDialog, rows, float, 25)
{
loadAllCvars(me);
}
-string XonoticCvarsDialog_toString(entity me)
-{
- return "XXX";
-}
void XonoticCvarsDialog_fill(entity me)
{
entity e, cvarlist, btn;
cvarlist = makeXonoticCvarList();
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Cvar filter:"));
- me.TD(me, 1, 0.5, btn = makeXonoticButton("Clear", '0 0 0'));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Cvar filter:")));
+ me.TD(me, 1, 0.5, btn = makeXonoticButton(_("Clear"), '0 0 0'));
me.TD(me, 1, me.columns - 1.5, e = makeXonoticInputBox(0, string_null));
e.onChange = CvarList_Filter_Change;
e.onChangeEntity = cvarlist;
me.TR(me);
me.TD(me, me.rows - me.currentRow - 7, me.columns, cvarlist);
me.gotoRC(me, me.rows - 7, 0);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Setting:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Setting:")));
me.TD(me, 1, me.columns - 1, e = makeXonoticTextLabel(0, string_null));
cvarlist.cvarNameBox = e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Type:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Type:")));
me.TD(me, 1, me.columns - 1, e = makeXonoticTextLabel(0, string_null));
cvarlist.cvarTypeBox = e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Value:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Value:")));
me.TD(me, 1, me.columns - 2, e = makeXonoticInputBox(0, string_null));
cvarlist.cvarValueBox = e;
e.onChange = CvarList_Value_Change;
e.onChangeEntity = cvarlist;
+ e.onEnter = CvarList_End_Editing;
+ e.onEnterEntity = cvarlist;
me.TD(me, 1, 1, e = makeXonoticButton(string_null, SKINCOLOR_CVARLIST_REVERTBUTTON));
cvarlist.cvarDefaultBox = e;
e.onClick = CvarList_Revert_Click;
e.allowCut = 1;
e.marginLeft = e.marginRight = 0.5;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Description:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Description:")));
me.TD(me, 1, me.columns - 1, e = makeXonoticTextLabel(0, string_null));
cvarlist.cvarDescriptionBox = e;
e.allowWrap = 1;
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
#ifdef INTERFACE
CLASS(XonoticNetworkSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticNetworkSettingsTab, fill, void(entity))
- ATTRIB(XonoticNetworkSettingsTab, title, string, "Network")
+ ATTRIB(XonoticNetworkSettingsTab, title, string, _("Network"))
ATTRIB(XonoticNetworkSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticNetworkSettingsTab, rows, float, 17)
ATTRIB(XonoticNetworkSettingsTab, columns, float, 6.5)
entity e;
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_movement", "Client-side movement prediction"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_movement", _("Client-side movement prediction")));
me.TR(me);
- //me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_nolerp", "Network update smoothing"));
+ //me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_nolerp", _("Network update smoothing")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "shownetgraph", "Show netgraph"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "shownetgraph", _("Show netgraph")));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Network speed:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Network speed:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("_cl_rate"));
- e.addValue(e, "56k", "4000");
- e.addValue(e, "ISDN", "7000");
- e.addValue(e, "Slow ADSL", "15000");
- e.addValue(e, "Fast ADSL", "20000");
- e.addValue(e, "Broadband", "66666");
+ e.addValue(e, _("56k"), "4000");
+ e.addValue(e, _("ISDN"), "7000");
+ e.addValue(e, _("Slow ADSL"), "15000");
+ e.addValue(e, _("Fast ADSL"), "20000");
+ e.addValue(e, _("Broadband"), "66666");
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Input packets/s:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Input packets/s:")));
me.TD(me, 1, 2, e = makeXonoticSlider(20, 100, 1, "cl_netfps"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "HTTP downloads:"));
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("HTTP downloads:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Downloads:"));
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Downloads:")));
me.TD(me, 1, 2, e = makeXonoticSlider(1, 5, 1, "cl_curl_maxdownloads"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Speed (kB/s):"));
+ me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Speed (kB/s):")));
me.TD(me, 1, 2, e = makeXonoticSlider(10, 1500, 10, "cl_curl_maxspeed"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Client UDP port:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Client UDP port:")));
me.TD(me, 1, 0.64, e = makeXonoticInputBox(0, "cl_port"));
}
#endif
#ifdef INTERFACE
CLASS(XonoticVideoSettingsTab) EXTENDS(XonoticTab)
METHOD(XonoticVideoSettingsTab, fill, void(entity))
- ATTRIB(XonoticVideoSettingsTab, title, string, "Video")
+ ATTRIB(XonoticVideoSettingsTab, title, string, _("Video"))
ATTRIB(XonoticVideoSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticVideoSettingsTab, rows, float, 17)
ATTRIB(XonoticVideoSettingsTab, columns, float, 6.5)
entity e;
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Resolution:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Resolution:")));
me.TD(me, 1, 2, e = makeXonoticResolutionSlider());
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Font/UI size:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Font/UI size:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("menu_vid_scale"));
- e.addValue(e, "Unreadable", "-1");
- e.addValue(e, "Tiny", "-0.75");
- e.addValue(e, "Little", "-0.5");
- e.addValue(e, "Small", "-0.25");
- e.addValue(e, "Medium", "0");
- e.addValue(e, "Large", "0.25");
- e.addValue(e, "Huge", "0.5");
- e.addValue(e, "Gigantic", "0.75");
- e.addValue(e, "Colossal", "1");
+ e.addValue(e, ZCTX(_("SZ^Unreadable")), "-1");
+ e.addValue(e, ZCTX(_("SZ^Tiny")), "-0.75");
+ e.addValue(e, ZCTX(_("SZ^Little")), "-0.5");
+ e.addValue(e, ZCTX(_("SZ^Small")), "-0.25");
+ e.addValue(e, ZCTX(_("SZ^Medium")), "0");
+ e.addValue(e, ZCTX(_("SZ^Large")), "0.25");
+ e.addValue(e, ZCTX(_("SZ^Huge")), "0.5");
+ e.addValue(e, ZCTX(_("SZ^Gigantic")), "0.75");
+ e.addValue(e, ZCTX(_("SZ^Colossal")), "1");
e.configureXonoticTextSliderValues(e);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Color depth:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Color depth:")));
me.TD(me, 1, 2, e = makeXonoticSlider(16, 32, 16, "vid_bitsperpixel"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "vid_fullscreen", "Full screen"));
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "vid_vsync", "Vertical Synchronization"));
+ me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "vid_fullscreen", _("Full screen")));
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "vid_vsync", _("Vertical Synchronization")));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_gl20", "Use OpenGL 2.0 shaders (GLSL)"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_gl20", _("Use OpenGL 2.0 shaders (GLSL)")));
me.TR(me);
- me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "r_coronas_occlusionquery", "Use Occlusion Queries"));
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "v_glslgamma", _("Use GLSL to handle color control")));
+ setDependent(e, "vid_gl20", 1, 1);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Vertex Buffer Objects (VBOs)"));
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Vertex Buffer Objects (VBOs)")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "gl_vbo", "0", "Off"));
- me.TD(me, 1, 2.1, e = makeXonoticRadioButton(1, "gl_vbo", "3", "Vertices, some Tris (compatible)"));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "gl_vbo", "0", ZCTX(_("VBO^Off"))));
+ me.TD(me, 1, 1.9, e = makeXonoticRadioButton(1, "gl_vbo", "3", _("Vertices, some Tris (compatible)")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "gl_vbo", "2", "Vertices"));
- me.TD(me, 1, 2.1, e = makeXonoticRadioButton(1, "gl_vbo", "1", "Vertices and Triangles"));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "gl_vbo", "2", _("Vertices")));
+ me.TD(me, 1, 1.9, e = makeXonoticRadioButton(1, "gl_vbo", "1", _("Vertices and Triangles")));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Depth first:"));
+ me.TR(me);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Depth first:")));
me.TD(me, 1, 2, e = makeXonoticTextSlider("r_depthfirst"));
- e.addValue(e, "Disabled", "0");
- e.addValue(e, "World", "1");
- e.addValue(e, "All", "2");
+ e.addValue(e, ZCTX(_("DF^Disabled")), "0");
+ e.addValue(e, ZCTX(_("DF^World")), "1");
+ e.addValue(e, ZCTX(_("DF^All")), "2");
e.configureXonoticTextSliderValues(e);
me.TR(me);
if(cvar_type("apple_multithreadedgl") & CVAR_TYPEFLAG_ENGINE)
- me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "apple_multithreadedgl", "Disable multithreaded OpenGL"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "apple_multithreadedgl", _("Disable multithreaded OpenGL")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "gl_finish", "Wait for GPU to finish each frame"));
+ me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "gl_finish", _("Wait for GPU to finish each frame")));
me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Brightness:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Brightness:")));
me.TD(me, 1, 2, e = makeXonoticSlider(0.0, 0.5, 0.02, "v_brightness"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Contrast:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Contrast:")));
me.TD(me, 1, 2, e = makeXonoticSlider(1.0, 3.0, 0.05, "v_contrast"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Gamma:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Gamma:")));
me.TD(me, 1, 2, e = makeXonoticSlider(0.5, 2.0, 0.05, "v_gamma"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Contrast boost:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Contrast boost:")));
me.TD(me, 1, 2, e = makeXonoticSlider(1.0, 5.0, 0.1, "v_contrastboost"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Saturation:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Saturation:")));
setDependent(e, "vid_gl20", 1, 1);
me.TD(me, 1, 2, e = makeXonoticSlider(0.5, 2.0, 0.05, "r_glsl_saturation"));
setDependent(e, "vid_gl20", 1, 1);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_glslgamma", "Use GLSL to handle color control"));
- setDependent(e, "vid_gl20", 1, 1);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Ambient:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, ZCTX(_("LIT^Ambient:"))));
me.TD(me, 1, 2, e = makeXonoticSlider(0, 20.0, 1.0, "r_ambient"));
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Intensity:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Intensity:")));
me.TD(me, 1, 2, e = makeXonoticSlider(0.5, 2.0, 0.05, "r_hdr_scenebrightness"));
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "menu_cmd setresolution; vid_restart; menu_restart; togglemenu; defer 0.1 \"menu_cmd videosettings\"", COMMANDBUTTON_APPLY));
+ me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "menu_cmd setresolution; vid_restart; menu_restart; togglemenu; defer 0.1 \"menu_cmd videosettings\"", COMMANDBUTTON_APPLY));
}
#endif
#ifdef INTERFACE
CLASS(XonoticSingleplayerDialog) EXTENDS(XonoticDialog)
METHOD(XonoticSingleplayerDialog, fill, void(entity))
- ATTRIB(XonoticSingleplayerDialog, title, string, "Singleplayer")
+ ATTRIB(XonoticSingleplayerDialog, title, string, _("Singleplayer"))
ATTRIB(XonoticSingleplayerDialog, color, vector, SKINCOLOR_DIALOG_SINGLEPLAYER)
ATTRIB(XonoticSingleplayerDialog, intendedWidth, float, 0.80)
ATTRIB(XonoticSingleplayerDialog, rows, float, 24)
me.TR(me);
me.TDempty(me, (me.columns - 3) / 2);
- me.TD(me, 2, 3, e = makeXonoticBigButton("Instant action! (random map with bots)", '0 0 0'));
+ me.TD(me, 2, 3, e = makeXonoticBigButton(_("Instant action! (random map with bots)"), '0 0 0'));
e.onClick = InstantAction_LoadMap;
e.onClickEntity = NULL;
me.TR(me);
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, btnPrev = makeXonoticButton("<<", '0 0 0'));
- me.TD(me, 1, me.columns - 2, lblTitle = makeXonoticTextLabel(0.5, "???"));
+ me.TD(me, 1, me.columns - 2, lblTitle = makeXonoticTextLabel(0.5, _("???")));
me.TD(me, 1, 1, btnNext = makeXonoticButton(">>", '0 0 0'));
me.TR(me);
me.TD(me, me.rows - 5, me.columns, me.campaignBox = makeXonoticCampaignList());
me.campaignBox.campaignGo(me.campaignBox, 0);
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("Start Singleplayer!", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Singleplayer!"), '0 0 0'));
e.onClick = CampaignList_LoadMap;
e.onClickEntity = me.campaignBox;
}
#ifdef INTERFACE
CLASS(XonoticWinnerDialog) EXTENDS(XonoticDialog)
METHOD(XonoticWinnerDialog, fill, void(entity))
- ATTRIB(XonoticWinnerDialog, title, string, "Winner")
+ ATTRIB(XonoticWinnerDialog, title, string, _("Winner"))
ATTRIB(XonoticWinnerDialog, color, vector, SKINCOLOR_DIALOG_SINGLEPLAYER)
ATTRIB(XonoticWinnerDialog, intendedWidth, float, 0.32)
ATTRIB(XonoticWinnerDialog, rows, float, 12)
me.TD(me, me.rows - 2, me.columns, e = makeXonoticImage("/gfx/winner", -1));
me.gotoRC(me, me.rows - 1, 0);
- me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
+ me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
CLASS(XonoticTeamSelectDialog) EXTENDS(XonoticRootDialog)
METHOD(XonoticTeamSelectDialog, fill, void(entity)) // to be overridden by user to fill the dialog with controls
METHOD(XonoticTeamSelectDialog, showNotify, void(entity))
- ATTRIB(XonoticTeamSelectDialog, title, string, "Team Selection") // ;)
+ ATTRIB(XonoticTeamSelectDialog, title, string, _("Team Selection")) // ;)
ATTRIB(XonoticTeamSelectDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticTeamSelectDialog, intendedWidth, float, 0.4)
ATTRIB(XonoticTeamSelectDialog, rows, float, 5)
{
entity e;
me.TR(me);
- me.TD(me, 2, 4, e = makeTeamButton("join 'best' team (auto-select)", '0 0 0', "cmd selectteam auto; cmd join"));
+ me.TD(me, 2, 4, e = makeTeamButton(_("join 'best' team (auto-select)"), '0 0 0', "cmd selectteam auto; cmd join"));
e.preferredFocusPriority = 1;
me.TR(me);
me.TR(me);
- me.TD(me, 2, 1, me.team1 = makeTeamButton("red", '1 0.5 0.5', "cmd selectteam red; cmd join"));
- me.TD(me, 2, 1, me.team2 = makeTeamButton("blue", '0.5 0.5 1', "cmd selectteam blue; cmd join"));
- me.TD(me, 2, 1, me.team3 = makeTeamButton("yellow", '1 1 0.5', "cmd selectteam yellow; cmd join"));
- me.TD(me, 2, 1, me.team4 = makeTeamButton("pink", '1 0.5 1', "cmd selectteam pink; cmd join"));
+ me.TD(me, 2, 1, me.team1 = makeTeamButton(_("red"), '1 0.5 0.5', "cmd selectteam red; cmd join"));
+ me.TD(me, 2, 1, me.team2 = makeTeamButton(_("blue"), '0.5 0.5 1', "cmd selectteam blue; cmd join"));
+ me.TD(me, 2, 1, me.team3 = makeTeamButton(_("yellow"), '1 1 0.5', "cmd selectteam yellow; cmd join"));
+ me.TD(me, 2, 1, me.team4 = makeTeamButton(_("pink"), '1 0.5 1', "cmd selectteam pink; cmd join"));
me.TR(me);
me.TR(me);
- me.TD(me, 1, 4, makeXonoticCommandButton("spectate", '0 0 0', "cmd spectate", 1));
+ me.TD(me, 1, 4, makeXonoticCommandButton(_("spectate"), '0 0 0', "cmd spectate", 1));
}
#endif
--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticGametypeList) EXTENDS(XonoticListBox)
+ METHOD(XonoticGametypeList, configureXonoticGametypeList, void(entity))
+ ATTRIB(XonoticGametypeList, rowsPerItem, float, 1)
+ METHOD(XonoticGametypeList, drawListBoxItem, void(entity, float, vector, float))
+ METHOD(XonoticGametypeList, resizeNotify, void(entity, vector, vector, vector, vector))
+ METHOD(XonoticGametypeList, setSelected, void(entity, float))
+ METHOD(XonoticGametypeList, loadCvars, void(entity))
+ METHOD(XonoticGametypeList, saveCvars, void(entity))
+
+ ATTRIB(XonoticGametypeList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticGametypeList, realUpperMargin, float, 0)
+ ATTRIB(XonoticGametypeList, columnNameOrigin, float, 0)
+ ATTRIB(XonoticGametypeList, columnNameSize, float, 0)
+ENDCLASS(XonoticGametypeList)
+entity makeXonoticGametypeList();
+#endif
+
+#ifdef IMPLEMENTATION
+
+entity makeXonoticGametypeList(void)
+{
+ entity me;
+ me = spawnXonoticGametypeList();
+ me.configureXonoticGametypeList(me);
+ return me;
+}
+void XonoticGametypeList_configureXonoticGametypeList(entity me)
+{
+ me.loadCvars(me);
+ me.configureXonoticListBox(me);
+ me.nItems = GameType_GetCount();
+}
+void XonoticGametypeList_setSelected(entity me, float i)
+{
+ SUPER(XonoticGametypeList).setSelected(me, i);
+ me.saveCvars(me);
+}
+
+void XonoticGametypeList_loadCvars(entity me)
+{
+ float t;
+ t = MapInfo_CurrentGametype();
+ float i;
+ for(i = 0; i < GameType_GetCount(); ++i)
+ if(t == GameType_GetID(i))
+ break;
+ if(i >= GameType_GetCount())
+ {
+ for(i = 0; i < GameType_GetCount(); ++i)
+ if(t == MAPINFO_TYPE_DEATHMATCH)
+ break;
+ if(i >= GameType_GetCount())
+ i = 0;
+ }
+ me.setSelected(me, i);
+ // do we need this: me.parent.gameTypeChangeNotify(me.parent); // to make sure
+}
+void XonoticGametypeList_saveCvars(entity me)
+{
+ float t;
+ t = GameType_GetID(me.selectedItem);
+ if(t == MapInfo_CurrentGametype())
+ return;
+ MapInfo_SwitchGameType(t);
+ me.parent.gameTypeChangeNotify(me.parent);
+}
+void XonoticGametypeList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+{
+ string s;
+ if(isSelected)
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ s = GameType_GetName(i);
+ draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+}
+void XonoticGametypeList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+ SUPER(XonoticServerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
+ me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+ me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+ me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+ me.columnNameOrigin = 0;
+ me.columnNameSize = 1;
+}
+#endif
METHOD(XonoticInputBox, loadCvars, void(entity))
METHOD(XonoticInputBox, saveCvars, void(entity))
METHOD(XonoticInputBox, keyDown, float(entity, float, float, float))
+
+ ATTRIB(XonoticInputBox, saveImmediately, float, 0)
ENDCLASS(XonoticInputBox)
entity makeXonoticInputBox(float, string);
#endif
{
SUPER(XonoticInputBox).setText(me, new);
me.onChange(me, me.onChangeEntity);
+ if(me.saveImmediately)
+ me.saveCvars(me);
}
else
SUPER(XonoticInputBox).setText(me, new);
#ifdef IMPLEMENTATION
+string KEY_NOT_BOUND_CMD = "// not bound";
+
#define MAX_KEYS_PER_FUNCTION 2
#define MAX_KEYBINDS 256
string Xonotic_KeyBinds_Functions[MAX_KEYBINDS];
string s;
Xonotic_KeyBinds_Count = 0;
- fh = fopen("keybinds.txt", FILE_READ);
+ fh = fopen(language_filename("keybinds.txt"), FILE_READ);
if(fh < 0)
return;
while((s = fgets(fh)))
{
k = stof(argv(j));
if(k != -1)
- localcmd("\nunbind \"", keynumtostring(k), "\"\n");
+ //localcmd("\nunbind \"", keynumtostring(k), "\"\n");
+ localcmd("\nbind \"", keynumtostring(k), "\" \"", KEY_NOT_BOUND_CMD, "\"\n");
}
}
localcmd("\nbind \"", keynumtostring(key), "\" \"", func, "\"\n");
+ localcmd("-zoom\n"); // to make sure we aren't in togglezoom'd state
}
void XonoticKeyBinder_editUserbind(entity me, string theName, string theCommandPress, string theCommandRelease)
{
{
k = stof(argv(j));
if(k != -1)
- localcmd("\nunbind \"", keynumtostring(k), "\"\n");
+ //localcmd("\nunbind \"", keynumtostring(k), "\"\n");
+ localcmd("\nbind \"", keynumtostring(k), "\" \"", KEY_NOT_BOUND_CMD, "\"\n");
}
-
+ localcmd("-zoom\n"); // to make sure we aren't in togglezoom'd state
}
void XonoticKeyBinder_clickListBoxItem(entity me, float i, vector where)
{
--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticLanguageList) EXTENDS(XonoticListBox)
+ METHOD(XonoticLanguageList, configureXonoticLanguageList, void(entity))
+ ATTRIB(XonoticLanguageList, rowsPerItem, float, 1)
+ METHOD(XonoticLanguageList, drawListBoxItem, void(entity, float, vector, float))
+ METHOD(XonoticLanguageList, resizeNotify, void(entity, vector, vector, vector, vector))
+ METHOD(XonoticLanguageList, setSelected, void(entity, float))
+ METHOD(XonoticLanguageList, loadCvars, void(entity))
+ METHOD(XonoticLanguageList, saveCvars, void(entity))
+
+ ATTRIB(XonoticLanguageList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticLanguageList, realUpperMargin, float, 0)
+ ATTRIB(XonoticLanguageList, columnNameOrigin, float, 0)
+ ATTRIB(XonoticLanguageList, columnNameSize, float, 0)
+
+ METHOD(XonoticLanguageList, clickListBoxItem, void(entity, float, vector)) // double click handling
+ METHOD(XonoticLanguageList, keyDown, float(entity, float, float, float)) // enter handling
+ ATTRIB(XonoticLanguageList, lastClickedLanguage, float, -1)
+ ATTRIB(XonoticLanguageList, lastClickedTime, float, 0)
+
+ METHOD(XonoticLanguageList, destroy, void(entity))
+
+ ATTRIB(XonoticLanguageList, languagelist, float, -1)
+ METHOD(XonoticLanguageList, getLanguages, void(entity))
+ METHOD(XonoticLanguageList, setLanguage, void(entity))
+ METHOD(XonoticLanguageList, languageParameter, string(entity, float, float))
+
+ ATTRIB(XonoticLanguageList, name, string, "languageselector") // change this to make it noninteractive (for first run dialog)
+
+ ATTRIB(XonoticLanguageList, doubleClickCommand, string, "menu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd languageselect\"")
+ENDCLASS(XonoticLanguageList)
+
+entity makeXonoticLanguageList();
+void SetLanguage_Click(entity btn, entity me);
+#endif
+
+#ifdef IMPLEMENTATION
+
+#define LANGPARM_ID 0
+#define LANGPARM_NAME 1
+#define LANGPARM_NAME_LOCALIZED 2
+#define LANGPARM_COUNT 3
+
+entity makeXonoticLanguageList()
+{
+ entity me;
+ me = spawnXonoticLanguageList();
+ me.configureXonoticLanguageList(me);
+ return me;
+}
+
+void XonoticLanguageList_configureXonoticLanguageList(entity me)
+{
+ me.configureXonoticListBox(me);
+ me.getLanguages(me);
+ me.loadCvars(me);
+}
+
+void XonoticLanguageList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+{
+ string s;
+ if(isSelected)
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
+ draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+}
+
+void XonoticLanguageList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+ SUPER(XonoticLanguageList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
+ me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+ me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+ me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+ me.columnNameOrigin = 0;
+ me.columnNameSize = 1;
+}
+
+void XonoticLanguageList_setSelected(entity me, float i)
+{
+ SUPER(XonoticLanguageList).setSelected(me, i);
+ me.saveCvars(me);
+}
+
+void XonoticLanguageList_loadCvars(entity me)
+{
+ string s;
+ float i, n;
+ s = cvar_string("prvm_language");
+ n = me.nItems;
+
+ // default to English
+ for(i = 0; i < n; ++i)
+ {
+ if(me.languageParameter(me, i, LANGPARM_ID) == "en")
+ {
+ me.selectedItem = i;
+ break;
+ }
+ }
+
+ // otherwise, find the language
+ for(i = 0; i < n; ++i)
+ {
+ if(me.languageParameter(me, i, LANGPARM_ID) == s)
+ {
+ me.selectedItem = i;
+ break;
+ }
+ }
+}
+
+void XonoticLanguageList_saveCvars(entity me)
+{
+ cvar_set("prvm_language", me.languageParameter(me, me.selectedItem, LANGPARM_ID));
+}
+
+void XonoticLanguageList_clickListBoxItem(entity me, float i, vector where)
+{
+ if(i == me.lastClickedLanguage)
+ if(time < me.lastClickedTime + 0.3)
+ {
+ // DOUBLE CLICK!
+ me.setSelected(me, i);
+ me.setLanguage(me);
+ }
+ me.lastClickedLanguage = i;
+ me.lastClickedTime = time;
+}
+
+float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
+{
+ if(scan == K_ENTER || scan == K_KP_ENTER) {
+ me.setLanguage(me);
+ return 1;
+ }
+ else
+ return SUPER(XonoticLanguageList).keyDown(me, scan, ascii, shift);
+}
+
+void XonoticLanguageList_destroy(entity me)
+{
+ buf_del(me.languagelist);
+}
+
+void XonoticLanguageList_getLanguages(entity me)
+{
+ float buf, i, n, fh;
+ string s;
+
+ buf = buf_create();
+
+ fh = fopen("languages.txt", FILE_READ);
+ while((s = fgets(fh)))
+ {
+ n = tokenize_console(s);
+ if(n < 3)
+ continue;
+ bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_ID, argv(0));
+ bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME, argv(1));
+ bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME_LOCALIZED, argv(2));
+ ++i;
+ }
+ fclose(fh);
+
+ me.languagelist = buf;
+ me.nItems = i;
+}
+
+void XonoticLanguageList_setLanguage(entity me)
+{
+ localcmd(sprintf("\n%s\n", me.doubleClickCommand));
+}
+
+string XonoticLanguageList_languageParameter(entity me, float i, float key)
+{
+ return bufstr_get(me.languagelist, i * LANGPARM_COUNT + key);
+}
+
+void SetLanguage_Click(entity btn, entity me)
+{
+ me.setLanguage(me);
+}
+
+#endif
#ifdef INTERFACE
CLASS(MainWindow) EXTENDS(ModalController)
METHOD(MainWindow, configureMainWindow, void(entity))
+ METHOD(MainWindow, draw, void(entity))
+ ATTRIB(MainWindow, firstRunDialog, entity, NULL)
ATTRIB(MainWindow, advancedDialog, entity, NULL)
ATTRIB(MainWindow, mutatorsDialog, entity, NULL)
ATTRIB(MainWindow, weaponsDialog, entity, NULL)
ATTRIB(MainWindow, cvarsDialog, entity, NULL)
ATTRIB(MainWindow, mainNexposee, entity, NULL)
ATTRIB(MainWindow, fadedAlpha, float, SKINALPHA_BEHIND)
+ ATTRIB(MainWindow, dialogToShow, entity, NULL)
ENDCLASS(MainWindow)
#endif
#ifdef IMPLEMENTATION
+void MainWindow_draw(entity me)
+{
+ SUPER(MainWindow).draw(me);
+
+ if(me.dialogToShow)
+ {
+ DialogOpenButton_Click_withCoords(world, me.dialogToShow, '0 0 0', eX * conwidth + eY * conheight);
+ me.dialogToShow = NULL;
+ }
+}
void DemoButton_Click(entity me, entity other)
{
- if(me.text == "Do not press this button again!")
+ if(me.text == _("Do not press this button again!"))
DialogOpenButton_Click(me, other);
else
- me.setText(me, "Do not press this button again!");
+ me.setText(me, _("Do not press this button again!"));
}
void MainWindow_configureMainWindow(entity me)
{
entity n, i;
+ me.firstRunDialog = i = spawnXonoticFirstRunDialog();
+ i.configureDialog(i);
+ me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
i = spawnXonoticTeamSelectDialog();
i.configureDialog(i);
me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
me.moveItemAfter(me, n, NULL);
me.initializeDialog(me, n);
+
+ if(cvar_string("_cl_name") == "Player")
+ me.dialogToShow = me.firstRunDialog;
}
#endif
m = MapInfo_BSPName_ByID(i);
if not(m)
{
- print("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n");
+ print(_("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"));
+ me.refilter(me);
return;
}
if(MapInfo_CheckMap(m))
{
localcmd("\nmenu_loadmap_prepare\n");
if(cvar("menu_use_default_hostname"))
- localcmd("hostname \"", strdecolorize(cvar_string("_cl_name")), "'s Xonotic server\"\n");
+ localcmd("hostname \"", sprintf(_("%s's Xonotic Server"), strdecolorize(cvar_string("_cl_name"))), "\"\n");
MapInfo_LoadMap(m);
}
else
{
- print("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n");
+ print(_("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n"));
me.refilter(me);
+ return;
}
}
float XonoticMapList_keyDown(entity me, float scan, float ascii, float shift)
{
string ch, save;
+ if(me.nItems <= 0)
+ return SUPER(XonoticMapList).keyDown(me, scan, ascii, shift);
if(scan == K_ENTER || scan == K_KP_ENTER)
{
// pop up map info screen
float sortbuf, glob, i;
string fn;
- glob = search_begin(get_model_datafilename(string_null, -1, "txt"), TRUE, TRUE);
+ glob = search_begin(language_filename(get_model_datafilename(string_null, -1, "txt")), TRUE, TRUE);
if (glob < 0)
return;
bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
if(get_model_parameters_sex)
- get_model_parameters_desc = strcat(get_model_parameters_desc, "\nSex: ", get_model_parameters_sex);
+ get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nSex: %s", get_model_parameters_sex));
if(get_model_parameters_weight)
- get_model_parameters_desc = strcat(get_model_parameters_desc, "\nWeight: ", ftos(get_model_parameters_weight), " kg");
+ get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nWeight: %g kg", get_model_parameters_weight));
if(get_model_parameters_age)
- get_model_parameters_desc = strcat(get_model_parameters_desc, "\nAge: ", ftos(get_model_parameters_age));
+ get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nAge: %g", get_model_parameters_age));
while(substring(get_model_parameters_desc, -1, 1) == "\n")
get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
if (me.numModels <= 0)
{
- draw_CenterText('0.5 0.5 0', "<no model found>", me.realFontSize, '1 1 1', 0.6, FALSE);
+ draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, '1 1 1', 0.6, FALSE);
return;
}
// still to be customized by user
/*
ATTRIB(XonoticDialog, closable, float, 1)
- ATTRIB(XonoticDialog, title, string, "Form1") // ;)
+ ATTRIB(XonoticDialog, title, string, _("Form1")) // ;)
ATTRIB(XonoticDialog, color, vector, '1 0.5 1')
ATTRIB(XonoticDialog, intendedWidth, float, 0)
ATTRIB(XonoticDialog, rows, float, 3)
METHOD(XonoticServerList, resizeNotify, void(entity, vector, vector, vector, vector))
METHOD(XonoticServerList, keyDown, float(entity, float, float, float))
+ ATTRIB(XonoticServerList, iconsSizeFactor, float, 0.85)
+
ATTRIB(XonoticServerList, realFontSize, vector, '0 0 0')
ATTRIB(XonoticServerList, realUpperMargin, float, 0)
ATTRIB(XonoticServerList, columnIconsOrigin, float, 0)
ATTRIB(XonoticServerList, lastClickedTime, float, 0)
ATTRIB(XonoticServerList, ipAddressBoxFocused, float, -1)
+
+ ATTRIB(XonoticServerList, seenIPv4, float, 0)
+ ATTRIB(XonoticServerList, seenIPv6, float, 0)
ENDCLASS(XonoticServerList)
entity makeXonoticServerList();
void ServerList_Connect_Click(entity btn, entity me);
void ServerList_Filter_Change(entity box, entity me);
void ServerList_Favorite_Click(entity btn, entity me);
void ServerList_Info_Click(entity btn, entity me);
+void ServerList_Update_favoriteButton(entity btn, entity me);
#endif
#ifdef IMPLEMENTATION
if(srv == "")
return FALSE;
srv = netaddress_resolve(srv, 26000);
+ if(srv == "")
+ return FALSE;
p = crypto_getidfp(srv);
n = tokenize_console(cvar_string("net_slist_favorites"));
for(i = 0; i < n; ++i)
resorthostcache();
}
+void ServerList_Update_favoriteButton(entity btn, entity me)
+{
+ if(IsFavorite(me.ipAddressBox.text))
+ me.favoriteButton.setText(me.favoriteButton, _("Remove"));
+ else
+ me.favoriteButton.setText(me.favoriteButton, _("Bookmark"));
+}
+
entity makeXonoticServerList()
{
entity me;
m = SLIST_MASK_AND - 1;
resethostcachemasks();
if(!me.filterShowFull)
- sethostcachemasknumber(++m, SLIST_FIELD_FREESLOTS, 1, SLIST_TEST_GREATEREQUAL);
+ {
+ sethostcachemasknumber(++m, SLIST_FIELD_FREESLOTS, 1, SLIST_TEST_GREATEREQUAL); // legacy
+ sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, ":S0:", SLIST_TEST_NOTCONTAIN); // g_maxplayers support
+ }
if(!me.filterShowEmpty)
sethostcachemasknumber(++m, SLIST_FIELD_NUMHUMANS, 1, SLIST_TEST_GREATEREQUAL);
if(typestr != "")
me.connectButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
me.infoButton.disabled = ((me.nItems == 0) || !owned);
+ me.favoriteButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
found = 0;
if(me.selectedServer)
if(me.ipAddressBoxFocused != me.ipAddressBox.focused)
{
if(me.ipAddressBox.focused || me.ipAddressBoxFocused < 0)
- {
- if(IsFavorite(me.ipAddressBox.text))
- me.favoriteButton.setText(me.favoriteButton, "Remove");
- else
- me.favoriteButton.setText(me.favoriteButton, "Bookmark");
- }
+ ServerList_Update_favoriteButton(NULL, me);
me.ipAddressBoxFocused = me.ipAddressBox.focused;
}
me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
me.columnIconsOrigin = 0;
- me.columnIconsSize = me.realFontSize_x * 2;
- me.columnPingSize = me.realFontSize_x * 4;
- me.columnMapSize = me.realFontSize_x * 12;
+ me.columnIconsSize = me.realFontSize_x * 3 * me.iconsSizeFactor;
+ me.columnPingSize = me.realFontSize_x * 3;
+ me.columnMapSize = me.realFontSize_x * 10;
me.columnTypeSize = me.realFontSize_x * 4;
- me.columnPlayersSize = me.realFontSize_x * 6;
+ me.columnPlayersSize = me.realFontSize_x * 5;
me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - me.columnIconsSize - me.columnTypeSize - 5 * me.realFontSize_x;
me.columnPingOrigin = me.columnIconsOrigin + me.columnIconsSize + me.realFontSize_x;
me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
me.columnTypeOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
me.columnPlayersOrigin = me.columnTypeOrigin + me.columnTypeSize + me.realFontSize_x;
- me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, "Ping", ServerList_PingSort_Click);
- me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, "Host name", ServerList_NameSort_Click);
- me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, "Map", ServerList_MapSort_Click);
- me.positionSortButton(me, me.sortButton4, me.columnTypeOrigin, me.columnTypeSize, "Type", ServerList_TypeSort_Click);
- me.positionSortButton(me, me.sortButton5, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
+ me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, _("Ping"), ServerList_PingSort_Click);
+ me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, _("Host name"), ServerList_NameSort_Click);
+ me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, _("Map"), ServerList_MapSort_Click);
+ me.positionSortButton(me, me.sortButton4, me.columnTypeOrigin, me.columnTypeSize, _("Type"), ServerList_TypeSort_Click);
+ me.positionSortButton(me, me.sortButton5, me.columnPlayersOrigin, me.columnPlayersSize, _("Players"), ServerList_PlayerSort_Click);
float f;
f = me.currentSortField;
// layout: Ping, Server name, Map name, NP, TP, MP
string s;
float p, q;
+ float isv4, isv6;
vector theColor;
float theAlpha;
if(isSelected)
draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
- if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
+ if(gethostcachenumber(SLIST_FIELD_FREESLOTS, i) <= 0)
theAlpha = SKINALPHA_SERVERLIST_FULL;
+ else if(strstrofs(gethostcachestring(SLIST_FIELD_QCSTATUS, i), ":S0:", 0) >= 0)
+ theAlpha = SKINALPHA_SERVERLIST_FULL; // g_maxplayers support
else if not(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
theAlpha = SKINALPHA_SERVERLIST_EMPTY;
else
}
s = gethostcachestring(SLIST_FIELD_CNAME, i);
+
+ isv4 = isv6 = 0;
+ if(substring(s, 0, 1) == "[")
+ {
+ isv6 = 1;
+ me.seenIPv6 += 1;
+ }
+ else if(strstrofs("0123456789", substring(s, 0, 1), 0) >= 0)
+ {
+ isv4 = 1;
+ me.seenIPv4 += 1;
+ }
+
q = stof(substring(crypto_getencryptlevel(s), 0, 1));
if((q <= 0 && cvar("crypto_aeslevel") >= 3) || (q >= 3 && cvar("crypto_aeslevel") <= 0))
{
s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
{
vector iconSize;
- iconSize_y = 1;
- iconSize_x = iconSize_y * (absSize_y / absSize_x);
+ iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
+ iconSize_x = me.realFontSize_x * me.iconsSizeFactor;
vector iconPos;
- iconPos_x = (me.columnIconsSize - 2 * iconSize_x) * 0.5;
+ iconPos_x = (me.columnIconsSize - 3 * iconSize_x) * 0.5;
iconPos_y = (1 - iconSize_y) * 0.5;
- draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_pure", ftos(strstrofs(s, ":P0:", 0) >= 0)), iconSize, '1 1 1', 1);
+ if not(me.seenIPv4 && me.seenIPv6)
+ {
+ iconPos_x += iconSize_x * 0.5;
+ }
+ else if(me.seenIPv4 && me.seenIPv6)
+ {
+ if(isv6)
+ draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_ipv6"), iconSize, '1 1 1', 1);
+ else if(isv4)
+ draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_ipv4"), iconSize, '1 1 1', 1);
+ iconPos_x += iconSize_x;
+ }
- iconPos_x += iconSize_x;
draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), iconSize, '1 1 1', 1);
+ iconPos_x += iconSize_x;
+
+ draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_pure", ftos(strstrofs(s, ":P0:", 0) >= 0)), iconSize, '1 1 1', 1);
+ iconPos_x += iconSize_x;
}
s = ftos(p);
- draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s, 0, me.realFontSize)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
+ draw_Text(me.realUpperMargin * eY + (me.columnPingOrigin + me.columnPingSize - draw_TextWidth(s, 0, me.realFontSize)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize, 0, me.realFontSize);
draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize, 0, me.realFontSize);
}
else if(scan == K_MOUSE2 || scan == K_SPACE)
{
- main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
- DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
+ if(me.nItems != 0)
+ {
+ main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
+ DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
+ }
}
else if(scan == K_INS || scan == K_MOUSE3 || scan == K_KP_INS)
{
{
s = search_getfilename(glob, i);
bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_NAME, substring(s, 9, strlen(s) - 24)); // the * part
- bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_TITLE, "<TITLE>");
- bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_AUTHOR, "<AUTHOR>");
+ bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_TITLE, _("<TITLE>"));
+ bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_AUTHOR, _("<AUTHOR>"));
bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_PREVIEW, strcat("/gfx/menu/", substring(s, 9, strlen(s) - 24), "/skinpreview"));
- fh = fopen(s, FILE_READ);
+ fh = fopen(language_filename(s), FILE_READ);
if(fh < 0)
{
print("Warning: can't open skinvalues.txt file\n");
draw_Picture(me.columnPreviewOrigin * eX, s, me.columnPreviewSize * eX + eY, '1 1 1', 1);
s = me.skinParameter(me, i, SKINPARM_NAME);
- s = strcat(s, ": ", me.skinParameter(me, i, SKINPARM_TITLE));
+ s = sprintf(_("%s: %s"), s, me.skinParameter(me, i, SKINPARM_TITLE));
s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);
draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_SKINLIST_TITLE, SKINALPHA_TEXT, 0);
string XonoticDecibelsSlider_valueToText(entity me, float v)
{
if(v < -33)
- return "OFF";
+ return CTX(_("VOL^OFF"));
else if(v >= -0.1)
- return "MAX";
- return strcat(SUPER(XonoticDecibelsSlider).valueToText(me, v), " dB");
+ return CTX(_("VOL^MAX"));
+ return sprintf(_("%s dB"), SUPER(XonoticDecibelsSlider).valueToText(me, v));
}
#endif
METHOD(XonoticPicmipSlider, configureXonoticPicmipSlider, void(entity))
METHOD(XonoticPicmipSlider, draw, void(entity))
METHOD(XonoticPicmipSlider, autofix, void(entity))
+ ATTRIB(XonoticPicmipSlider, have_s3tc, float, 0)
ENDCLASS(XonoticPicmipSlider)
entity makeXonoticPicmipSlider(); // note: you still need to call addValue and configureXonoticTextSliderValues!
#endif
{
me.configureXonoticTextSlider(me, "gl_picmip");
me.autofix(me);
+ me.have_s3tc = GL_Have_TextureCompression();
}
-float texmemsize()
+float texmemsize(float s3tc)
{
return
(
- 2500 * pow(0.5, max(0, cvar("gl_picmip") + cvar("gl_picmip_other")))
- + 1500 * pow(0.5, max(0, cvar("gl_picmip") + cvar("gl_picmip_world")))
- ) * ((cvar("r_texture_dds_load") || cvar("gl_texturecompression")) ? 0.4 : 1.0); // TC: normalmaps 50%, other 25%, few incompressible, guessing 40% as conservative average
+ 2500 * pow(0.25, max(0, cvar("gl_picmip") + cvar("gl_picmip_other")))
+ + 1500 * pow(0.25, max(0, cvar("gl_picmip") + cvar("gl_picmip_world")))
+ ) * ((s3tc && (cvar("r_texture_dds_load") || cvar("gl_texturecompression"))) ? 0.2 : 1.0); // TC: normalmaps 50%, other 25%, few incompressible, guessing 40% as conservative average
}
void XonoticPicmipSlider_autofix(entity me)
{
float max_hard, max_soft;
+ if(cvar("menu_picmip_bypass"))
+ return;
max_hard = cvar("sys_memsize_virtual");
max_soft = cvar("sys_memsize_physical");
if(max_hard > 0)
{
- while(me.value > 0 && texmemsize() > max_hard)
+ while(me.value > 0 && texmemsize(me.have_s3tc) > max_hard)
me.setValue(me, me.value - 1);
}
// TODO also check the soft limit!
}
void XonoticResolutionSlider_addResolution(entity me, float w, float h, float pixelheight)
{
- me.addValue(me, strzone(strcat(ftos(w), "x", ftos(h))), strzone(strcat(ftos(w), " ", ftos(h), " ", ftos(pixelheight))));
+ me.addValue(me, strzone(sprintf(_("%dx%d"), w, h)), strzone(strcat(ftos(w), " ", ftos(h), " ", ftos(pixelheight))));
// FIXME (in case you ever want to dynamically instantiate this): THIS IS NEVER FREED
}
void XonoticResolutionSlider_configureXonoticResolutionSlider(entity me)
if(r == r0)
continue;
r0 = r;
- if(r_x < 640 || r_y < 400)
+ if(r_x < 640 || r_y < 480)
+ continue;
+ if(r_x > 2 * r_y) // likely dualscreen resolution, skip this one
continue;
me.addResolution(me, r_x, r_y, r_z);
}
+ if(me.nValues == 0)
+ {
+ me.addResolution(me, 640, 480, 1);
+ me.addResolution(me, 800, 600, 1);
+ me.addResolution(me, 1024, 768, 1);
+ me.addResolution(me, 1280, 960, 1);
+ me.addResolution(me, 1280, 1024, 1);
+ me.addResolution(me, 1650, 1080, 1);
+ me.addResolution(me, 1920, 1080, 1);
+ }
+
me.configureXonoticTextSliderValues(me);
}
void XonoticResolutionSlider_loadCvars(entity me)
+float GL_CheckExtension(string ext)
+{
+ return (strstrofs(strcat(" ", cvar_string("gl_info_extensions"), " "), strcat(" ", ext, " "), 0) >= 0);
+}
+
+float GL_Have_TextureCompression()
+{
+ return (GL_CheckExtension("GL_EXT_texture_compression_s3tc") && GL_CheckExtension("GL_ARB_texture_compression"));
+}
+
float tooltipdb;
void loadTooltips()
{
- tooltipdb = db_load("tooltips.db");
+ tooltipdb = db_load(language_filename("tooltips.db"));
}
void unloadTooltips()
{
- db_close(tooltipdb);
+ if(tooltipdb >= 0)
+ db_close(tooltipdb);
tooltipdb = -1;
}
string getZonedTooltipForIdentifier(string s)
string t;
if(s == "")
return string_null;
- t = db_get(tooltipdb, s);
- if(t == "-")
- return string_null;
- if(t != "")
- return strzone(t);
- t = cvar_description(s);
- if(t != "" && t != "custom cvar")
- return strzone(t);
+ if(tooltipdb >= 0)
+ {
+ t = db_get(tooltipdb, s);
+ if(t == "-")
+ return string_null;
+ if(t != "")
+ return strzone(t);
+ }
+ if(prvm_language == "en" || prvm_language == "")
+ {
+ t = cvar_description(s);
+ if(t != "" && t != "custom cvar")
+ return strzone(t);
+ }
dprint("WARNING: no tooltip set for ", s, "\n");
return string_null;
}
setDependent_Check(e);
}
-// EXTRESPONSE SYSTEM ////////////////////////////////////////////////////////
+// URI SYSTEM ////////////////////////////////////////////////////////
-float _Nex_ExtResponseSystem_RequestsSent;
-float _Nex_ExtResponseSystem_VersionHandled;
+float _Nex_ExtResponseSystem_Queried;
string _Nex_ExtResponseSystem_UpdateTo;
-float _Nex_ExtResponseSystem_RetryTime;
-float _Nex_ExtResponseSystem_RetryTime_LastDelay;
-void() Item_Nex_ExtResponseSystem_SendQuery =
+void URI_Get_Callback(float id, float status, string data)
{
- dprint("Sending extended response requests...\n");
- localcmd(strcat("packet 64.22.107.122:27950 \"getExtResponse checkUpdates xonotic ", cvar_string("g_xonoticversion"), "\"\n"));
- _Nex_ExtResponseSystem_RequestsSent = TRUE;
- _Nex_ExtResponseSystem_RetryTime_LastDelay = _Nex_ExtResponseSystem_RetryTime_LastDelay * 2 + 1;
- _Nex_ExtResponseSystem_RetryTime = time + _Nex_ExtResponseSystem_RetryTime_LastDelay;
+ if (id == URI_GET_DISCARD)
+ {
+ // discard
+ }
+ else if(id == URI_GET_UPDATENOTIFICATION)
+ {
+ UpdateNotification_URI_Get_Callback(id, status, data);
+ }
+ else if(id >= URI_GET_CURL && id <= URI_GET_CURL_END)
+ {
+ Curl_URI_Get_Callback(id, status, data);
+ }
+ else
+ {
+ print(sprintf(_("Received HTTP request data for an invalid id %d.\n"), id));
+ }
}
-void(float argc) Item_Nex_ExtResponseSystem_Parse =
+void UpdateNotification_URI_Get_Callback(float id, float status, string data)
{
- dprint("Received extended response packet from ", argv(0), "\n");
- if(!_Nex_ExtResponseSystem_RequestsSent)
+ float n;
+
+ if(_Nex_ExtResponseSystem_UpdateTo)
{
- dprint(" But I haven't sent a request yet! Ignoring.\n");
+ dprint("error: UpdateNotification_URI_Get_Callback has been called before\n");
return;
}
- if(argv(1) == "noUpdateAvailable")
+ if(status != 0)
{
- if(_Nex_ExtResponseSystem_VersionHandled)
- {
- dprint(" duplicated update notice, ignored\n");
- return;
- }
- _Nex_ExtResponseSystem_VersionHandled = 1;
+ print(sprintf(_("error receiving update notification: status is %d\n"), status));
+ return;
}
- else if(argv(1) == "updateAvailable")
+ if(substring(data, 0, 1) == "<")
{
- if(_Nex_ExtResponseSystem_VersionHandled)
- {
- dprint(" duplicated update notice, ignored\n");
- return;
- }
- _Nex_ExtResponseSystem_VersionHandled = 1;
- _Nex_ExtResponseSystem_UpdateTo = strzone(argv(2)); // note: only one packet can be handled, so this can't be a leak
+ print(_("error: received HTML instead of an update notification\n"));
+ return;
+ }
+ if(strstrofs(data, "\r", 0) != -1)
+ {
+ print(_("error: received carriage returns from update notification server\n"));
+ return;
}
- else
- dprint(" UNKNOWN RESPONSE TYPE: ", argv(1), "\n");
-}
-void() Item_Nex_ExtResponseSystem_CheckForResponse =
-{
- local string s;
- local float argc;
- while(strlen((s = getextresponse())))
+ if(data == "")
+ n = 0;
+ else
+ n = tokenizebyseparator(data, "\n");
+
+ if(n >= 1)
{
- argc = tokenize_console(s);
- Item_Nex_ExtResponseSystem_Parse(argc);
+ _Nex_ExtResponseSystem_UpdateTo = argv(0);
+
+ if(vercmp(cvar_string("g_xonoticversion"), _Nex_ExtResponseSystem_UpdateTo) >= 0)
+ {
+ _Nex_ExtResponseSystem_UpdateTo = ""; // no update needed
+ }
+ else
+ {
+ // update needed
+ if(n >= 2)
+ print(sprintf(_("Update can be downloaded at:\n%s\n"), argv(1)));
+ }
+
+ _Nex_ExtResponseSystem_UpdateTo = strzone(_Nex_ExtResponseSystem_UpdateTo);
}
}
-// END OF EXTRESPONSE SYSTEM /////////////////////////////////////////////////
+// END OF URI SYSTEM ////////////////////////////////////////////////////////
float preMenuInit()
{
draw_reset_cropped();
sz = eX * 0.025 + eY * 0.025 * (draw_scale_x / draw_scale_y);
- draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, "Autogenerating mapinfo for newly added maps...", sz, '1 1 1', 1, 0);
+ draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, _("Autogenerating mapinfo for newly added maps..."), sz, '1 1 1', 1, 0);
boxA = '0.05 0.5 0' + 0.25 * sz_y * eY;
boxB = '0.95 0.5 0' + 1.25 * sz_y * eY;
if(cvar("menu_updatecheck"))
{
- Item_Nex_ExtResponseSystem_CheckForResponse();
- if(!_Nex_ExtResponseSystem_VersionHandled)
- if(time > _Nex_ExtResponseSystem_RetryTime)
- Item_Nex_ExtResponseSystem_SendQuery();
+ if(!_Nex_ExtResponseSystem_Queried)
+ {
+ _Nex_ExtResponseSystem_Queried = 1;
+ float startcnt;
+ string uri;
+
+ cvar_set("cl_startcount", ftos(startcnt = cvar("cl_startcount") + 1));
+
+ // for privacy, munge the start count a little
+ startcnt = floor((floor(startcnt / 10) + random()) * 10);
+ uri = sprintf("http://www.xonotic.org/dl/checkupdate.txt?version=%s&cnt=%d", uri_escape(cvar_string("g_xonoticversion")), startcnt);
+
+#ifdef CVAR_POPCON
+ float cvar_handle, popcon_handle;
+ float n, i, j;
+ string k, s;
+ cvar_handle = buf_create();
+ buf_cvarlist(cvar_handle, "", "");
+ n = buf_getsize(cvar_handle);
+ popcon_handle = buf_create();
+ for(i= 0, j = 0; i < n; ++i)
+ {
+ k = bufstr_get(cvar_handle, i);
+ if(!(cvar_type(k) & CVAR_TYPEFLAG_SAVED))
+ continue;
+ s = sprintf("%s=%d", uri_escape(k), cvar_string(k) != cvar_defstring(k));
+ bufstr_set(popcon_handle, j, s);
+ ++j;
+ }
+ buf_del(cvar_handle);
+ uri_postbuf(
+ uri, URI_GET_UPDATENOTIFICATION,
+ "application/x-www-form-urlencoded",
+ "&",
+ popcon_handle
+ );
+ buf_del(popcon_handle);
+#else
+ uri_get(uri, URI_GET_UPDATENOTIFICATION);
+#endif
+ }
}
if(_Nex_ExtResponseSystem_UpdateTo != "")
{
+ // TODO rather turn this into a dialog
fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;
line = eY * fs_y;
- sz_x = draw_TextWidth(" http://www.xonotic.com/ ", 0, fs);
+ sz_x = draw_TextWidth(" http://www.xonotic.org/ ", 0, fs);
sz_y = 3 * fs_y;
- draw_alpha = sin(time * 0.112 - 0.3) * 0.7;
+ draw_alpha = sin(time * 0.112 - 0.3) * 10;
mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))
+ eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));
draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);
- draw_CenterText(mid - 1 * line, strcat("Update to ", _Nex_ExtResponseSystem_UpdateTo, " now!"), fs, '1 0 0', 1, 0);
- draw_CenterText(mid - 0 * line, "http://www.xonotic.com/", fs, '0 0 1', 1, 0);
+ draw_CenterText(mid - 1 * line, sprintf(_("Update to %s now!"), _Nex_ExtResponseSystem_UpdateTo), fs, '1 0 0', 1, 0);
+ draw_CenterText(mid - 0 * line, "http://www.xonotic.org/", fs, '0 0 1', 1, 0);
}
if not(campaign_name_previous)
campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal
default: return "";
}
}
+
+float updateCompression()
+{
+ float fh;
+ float have_dds, have_jpg, have_tga;
+ float can_dds;
+ if((have_dds = ((fh = fopen("dds/particles/particlefont.dds", FILE_READ)) >= 0)))
+ fclose(fh);
+ if((have_jpg = ((fh = fopen("particles/particlefont.jpg", FILE_READ)) >= 0)))
+ fclose(fh);
+ if((have_tga = ((fh = fopen("particles/particlefont.tga", FILE_READ)) >= 0)))
+ fclose(fh);
+ can_dds = GL_Have_TextureCompression();
+ if(have_dds && (have_jpg || have_tga))
+ {
+ // both? Let's only use good quality precompressed files
+ // but ONLY if we actually support it!
+ if(can_dds)
+ {
+ cvar_set("gl_texturecompression", "0");
+ return 1;
+ }
+ else
+ {
+ cvar_set("gl_texturecompression", "0");
+ cvar_set("r_texture_dds_load", "0");
+ return 0;
+ }
+ }
+ else if(have_dds)
+ {
+ // DDS only? We probably always want texture compression
+ cvar_set("gl_texturecompression", "1");
+ cvar_set("r_texture_dds_load", "1");
+ if(!can_dds)
+ print(_("^1ERROR: Texture compression is required but not supported.\n^1Expect visual problems.\n"));
+ return 0;
+ }
+ else
+ {
+ // TGA only? Allow runtime compression
+ if(can_dds)
+ {
+ cvar_set("gl_texturecompression", cvar_string("r_texture_dds_load"));
+ return 2;
+ }
+ else
+ {
+ cvar_set("gl_texturecompression", "0");
+ cvar_set("r_texture_dds_load", "0");
+ return 0;
+ }
+ }
+}
+
+// note: include only those that should be in the menu!
+#define GAMETYPES \
+ GAMETYPE(MAPINFO_TYPE_ARENA, _("Arena")) \
+ GAMETYPE(MAPINFO_TYPE_ASSAULT, _("Assault")) \
+ GAMETYPE(MAPINFO_TYPE_CTF, _("Capture The Flag")) \
+ GAMETYPE(MAPINFO_TYPE_CA, _("Clan Arena")) \
+ GAMETYPE(MAPINFO_TYPE_DEATHMATCH, _("Deathmatch")) \
+ GAMETYPE(MAPINFO_TYPE_DOMINATION, _("Domination")) \
+ GAMETYPE(MAPINFO_TYPE_FREEZETAG, _("Freeze Tag")) \
+ GAMETYPE(MAPINFO_TYPE_KEEPAWAY, _("Keepaway")) \
+ GAMETYPE(MAPINFO_TYPE_KEYHUNT, _("Key Hunt")) \
+ GAMETYPE(MAPINFO_TYPE_LMS, _("Last Man Standing")) \
+ GAMETYPE(MAPINFO_TYPE_NEXBALL, _("Nexball")) \
+ GAMETYPE(MAPINFO_TYPE_ONSLAUGHT, _("Onslaught")) \
+ GAMETYPE(MAPINFO_TYPE_RACE, _("Race")) \
+ GAMETYPE(MAPINFO_TYPE_CTS, _("Race CTS")) \
+ GAMETYPE(MAPINFO_TYPE_RUNEMATCH, _("Runematch")) \
+ GAMETYPE(MAPINFO_TYPE_TEAM_DEATHMATCH, _("Team Deathmatch")) \
+ /* nothing */
+
+float GameType_GetID(float cnt)
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) if(i++ == cnt) return id;
+ GAMETYPES
+#undef GAMETYPE
+ return 0;
+}
+string GameType_GetName(float cnt)
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) if(i++ == cnt) return name;
+ GAMETYPES
+#undef GAMETYPE
+ return _("@!#%'n Tuba Throwing");
+}
+float GameType_GetCount()
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) ++i;
+ GAMETYPES
+#undef GAMETYPE
+ return i;
+}
+
+void dialog_hudpanel_common_notoggle(entity me, string panelname)
+{
+ float i;
+ entity e;
+
+ me.TR(me);
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Background:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg"))));
+ e.addValue(e, _("Default"), "");
+ e.addValue(e, _("Disable"), "0");
+ e.addValue(e, strzone(strcat("border_", panelname)), strzone(strcat("border_", panelname)));
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Color:")));
+ me.TD(me, 2, 2.6, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color"));
+ setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), "");
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.0, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), _("Use default")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Border size:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_border"))));
+ e.addValue(e, _("Default"), "");
+ e.addValue(e, _("Disable"), "0");
+ for(i = 1; i <= 10; ++i)
+ e.addValue(e, strzone(ftos_decimals(i * 2, 0)), strzone(ftos(i * 2)));
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Alpha:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_alpha"))));
+ e.addValue(e, _("Default"), "");
+ for(i = 1; i <= 10; ++i)
+ e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Team Color:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_color_team"))));
+ e.addValue(e, _("Default"), "");
+ e.addValue(e, _("Disable"), "0");
+ for(i = 1; i <= 10; ++i)
+ e.addValue(e, strzone(ftos_decimals(i/10, 1)), strzone(ftos(i/10)));
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TDempty(me, 0.4);
+ me.TD(me, 1, 3.6, e = makeXonoticCheckBox(0, "hud_configure_teamcolorforced", _("Test team color in configure mode")));
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Padding:")));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_bg_padding"))));
+ e.addValue(e, _("Default"), "");
+ for(i = 0; i <= 10; ++i)
+ e.addValue(e, strzone(ftos_decimals(i - 5, 0)), strzone(ftos(i - 5)));
+ e.configureXonoticTextSliderValues(e);
+}
+float GL_CheckExtension(string ext);
+float GL_Have_TextureCompression();
+
void forAllDescendants(entity root, void(entity, entity) funcPre, void(entity, entity) funcPost, entity pass);
void saveAllCvars(entity root);
void loadAllCvars(entity root);
string resolvemod(string m);
string HUD_Panel_GetSettingName(float setting);
+
+float URI_GET_DISCARD = 0;
+
+float URI_GET_UPDATENOTIFICATION = 1;
+void UpdateNotification_URI_Get_Callback(float id, float status, string data);
+
+float URI_GET_CURL = 2;
+float URI_GET_CURL_END = 9;
+void Curl_URI_Get_Callback(float id, float status, string data);
+
+void URI_Get_Callback(float id, float status, string data);
+
+// game type list box stuff (does not NEED to contain all game types, other
+// types stay available via console)
+float GameType_GetID(float cnt);
+string GameType_GetName(float cnt);
+float GameType_GetCount();
+
+void dialog_hudpanel_common_notoggle(entity me, string panelname);
+#define DIALOG_HUDPANEL_COMMON_NOTOGGLE() \
+ dialog_hudpanel_common_notoggle(me, panelname)
+#define DIALOG_HUDPANEL_COMMON() \
+ me.TR(me); \
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, strzone(strcat("hud_panel_", panelname)), _("Enable panel"))); \
+ DIALOG_HUDPANEL_COMMON_NOTOGGLE()
--- /dev/null
+.entity accuracy;
+.float accuracy_hit[WEP_MAXCOUNT];
+.float accuracy_fired[WEP_MAXCOUNT];
+FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_hit);
+FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_fired);
+
+float accuracy_byte(float n, float d)
+{
+ //print(sprintf("accuracy: %d / %d\n", n, d));
+ if(n <= 0)
+ return 0;
+ if(n > d)
+ return 255;
+ return 1 + rint(n * 100.0 / d);
+}
+
+float accuracy_send(entity to, float sf)
+{
+ float w, f;
+ entity a;
+ WriteByte(MSG_ENTITY, ENT_CLIENT_ACCURACY);
+
+ a = self.owner;
+ if(a.classname == "spectator")
+ a = a.enemy;
+ a = a.accuracy;
+
+ if(to != a.owner)
+ if not(self.owner.cvar_cl_accuracy_data_share && autocvar_sv_accuracy_data_share)
+ sf = 0;
+ // note: zero sendflags can never be sent... so we can use that to say that we send no accuracy!
+ WriteInt24_t(MSG_ENTITY, sf);
+ if(sf == 0)
+ return TRUE;
+ // note: we know that client and server agree about SendFlags...
+ for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
+ {
+ if(sf & f)
+ WriteByte(MSG_ENTITY, accuracy_byte(self.(accuracy_hit[w]), self.(accuracy_fired[w])));
+ }
+ return TRUE;
+}
+
+// init/free
+void accuracy_init(entity e)
+{
+ e.accuracy = spawn();
+ e.accuracy.owner = e;
+ e.accuracy.classname = "accuracy";
+ e.accuracy.drawonlytoclient = e;
+ Net_LinkEntity(e.accuracy, FALSE, 0, accuracy_send);
+}
+
+void accuracy_free(entity e)
+{
+ remove(e.accuracy);
+}
+
+// force a resend of a player's accuracy stats
+void accuracy_resend(entity e)
+{
+ e.accuracy.SendFlags = 0xFFFFFF;
+}
+
+// update accuracy stats
+void accuracy_set(entity e, float w, float fired, float hit)
+{
+ entity a;
+ float b;
+ a = e.accuracy;
+ if(!a)
+ return;
+ w -= WEP_FIRST;
+ b = accuracy_byte(a.(accuracy_hit[w]), a.(accuracy_fired[w]));
+ a.(accuracy_hit[w]) = hit;
+ a.(accuracy_fired[w]) = fired;
+ if(b == accuracy_byte(hit, fired))
+ return;
+ w = pow(2, w);
+ a.SendFlags |= w;
+ FOR_EACH_CLIENT(a)
+ if(a.classname == "spectator")
+ if(a.enemy == e)
+ a.SendFlags |= w;
+}
+
+void accuracy_add(entity e, float w, float fired, float hit)
+{
+ entity a;
+ float b;
+ a = e.accuracy;
+ if(!a || !(hit || fired))
+ return;
+ w -= WEP_FIRST;
+ b = accuracy_byte(a.(accuracy_hit[w]), a.(accuracy_fired[w]));
+ if(hit)
+ a.(accuracy_hit[w]) += hit;
+ if(fired)
+ a.(accuracy_fired[w]) += fired;
+ if(b == accuracy_byte(a.(accuracy_hit[w]), a.(accuracy_fired[w])))
+ return;
+ w = pow(2, w);
+ a.SendFlags |= w;
+ FOR_EACH_CLIENT(a)
+ if(a.classname == "spectator")
+ if(a.enemy == e)
+ a.SendFlags |= w;
+}
+
+float accuracy_isgooddamage(entity attacker, entity targ)
+{
+ if(!inWarmupStage)
+ if(targ.flags & FL_CLIENT)
+ if(targ.deadflag == DEAD_NO)
+ if(IsDifferentTeam(attacker, targ))
+ return TRUE;
+ return FALSE;
+}
+
+float accuracy_canbegooddamage(entity attacker)
+{
+ if(!inWarmupStage)
+ return TRUE;
+ return FALSE;
+}
--- /dev/null
+.float cvar_cl_accuracy_data_share;
+
+// init/free
+void accuracy_init(entity e);
+void accuracy_free(entity e);
+
+// force a resend of a player's accuracy stats
+void accuracy_resend(entity e);
+
+// update accuracy stats
+void accuracy_set(entity e, float w, float fired, float hit);
+void accuracy_add(entity e, float w, float fired, float hit);
+
+// helper
+float accuracy_isgooddamage(entity attacker, entity targ);
+float accuracy_canbegooddamage(entity attacker);
+.float anticheat_jointime;
+
void mean_accumulate(entity e, .float a, .float c, float mean, float value, float weight)
{
if(weight == 0)
{
if(time < self.anticheat_div0_evade_offset)
self.anticheat_div0_evade_v_angle = self.v_angle;
- MEAN_ACCUMULATE(anticheat_div0_evade, 1 - (self.anticheat_div0_evade_forward_initial * v_forward), 1);
+ MEAN_ACCUMULATE(anticheat_div0_evade, 0.5 - 0.5 * (self.anticheat_div0_evade_forward_initial * v_forward), 1);
}
- MEAN_ACCUMULATE(anticheat_div0_strafebot_old, movement_oddity(self.movement, self.anticheat_div0_strafebot_movement_prev), max(0, sys_frametime - frametime));
+ MEAN_ACCUMULATE(anticheat_div0_strafebot_old, movement_oddity(self.movement, self.anticheat_div0_strafebot_movement_prev), 1);
self.anticheat_div0_strafebot_movement_prev = self.movement;
if(vlen(self.anticheat_div0_strafebot_forward_prev))
- MEAN_ACCUMULATE(anticheat_div0_strafebot_new, 1 - (self.anticheat_div0_strafebot_forward_prev * v_forward), max(0, sys_frametime - frametime));
+ MEAN_ACCUMULATE(anticheat_div0_strafebot_new, 0.5 - 0.5 * (self.anticheat_div0_strafebot_forward_prev * v_forward), 1);
self.anticheat_div0_strafebot_forward_prev = v_forward;
// generic speedhack detection: correlate anticheat_speedhack_movetime (UPDATED BEFORE THIS) and server time
self.anticheat_speedhack_offset = f;
else
{
- MEAN_ACCUMULATE(anticheat_speedhack, fabs(f - self.anticheat_speedhack_offset), 1);
+ MEAN_ACCUMULATE(anticheat_speedhack, max(0, f - self.anticheat_speedhack_offset), 1);
self.anticheat_speedhack_offset += (f - self.anticheat_speedhack_offset) * frametime * 0.1;
}
self.anticheat_div0_evade_offset = 0;
}
+string anticheat_display(float f, float tmin, float mi, float ma)
+{
+ string s;
+ s = ftos(f);
+ if(f <= mi)
+ return strcat(s, ":N");
+ if(f >= ma)
+ return strcat(s, ":Y");
+ return strcat(s, ":-");
+}
+
void anticheat_report()
{
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
- GameLogEcho(strcat(":anticheat:speedhack:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_speedhack))));
- GameLogEcho(strcat(":anticheat:div0_strafebot_old:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_strafebot_old))));
- GameLogEcho(strcat(":anticheat:div0_strafebot_new:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_strafebot_new))));
- GameLogEcho(strcat(":anticheat:div0_evade:", ftos(self.playerid), ":", ftos(MEAN_EVALUATE(anticheat_div0_evade))));
+ GameLogEcho(strcat(":anticheat:_time:", ftos(self.playerid), ":", ftos(servertime - self.anticheat_jointime)));
+ GameLogEcho(strcat(":anticheat:speedhack:", ftos(self.playerid), ":", anticheat_display(MEAN_EVALUATE(anticheat_speedhack), 240, 0.1, 0.15)));
+ GameLogEcho(strcat(":anticheat:div0_strafebot_old:", ftos(self.playerid), ":", anticheat_display(MEAN_EVALUATE(anticheat_div0_strafebot_old), 120, 0.3, 0.4)));
+ GameLogEcho(strcat(":anticheat:div0_strafebot_new:", ftos(self.playerid), ":", anticheat_display(MEAN_EVALUATE(anticheat_div0_strafebot_new), 120, 0.3, 0.4)));
+ GameLogEcho(strcat(":anticheat:div0_evade:", ftos(self.playerid), ":", anticheat_display(MEAN_EVALUATE(anticheat_div0_evade), 120, 0.1, 0.2)));
}
void anticheat_serverframe()
void anticheat_init()
{
self.anticheat_speedhack_offset = 0;
+ self.anticheat_jointime = servertime;
}
void anticheat_shutdown()
void assault_objective_reset();
void target_assault_roundend_reset();
+float next_round;
+float stopalivecheck;
+float redalive, bluealive, yellowalive, pinkalive;
+float totalalive;
+.float redalive_stat, bluealive_stat, yellowalive_stat, pinkalive_stat;
+float redspawned, bluespawned, yellowspawned, pinkspawned;
+float totalspawned;
+
/**
* Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map.
* Sets the 'warmup' global variable.
entity oldself;
oldself = self;
- if(g_arena && cvar("g_arena_warmup"))
- warmup = time + cvar("g_arena_warmup");
+ if(g_arena && autocvar_g_arena_warmup)
+ warmup = time + autocvar_g_arena_warmup;
else if(g_ca) {
- warmup = time + cvar("g_ca_warmup");
+ warmup = time + autocvar_g_ca_warmup;
allowed_to_spawn = 1;
}
+ else if(g_freezetag)
+ {
+ warmup = time + autocvar_g_freezetag_warmup;
+ }
lms_lowest_lives = 999;
lms_next_place = player_count;
race_ReadyRestart();
for(self = world; (self = nextent(self)); )
- if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+ if(clienttype(self) == CLIENTTYPE_NOTACLIENT && self.items != IT_STRENGTH && self.items != IT_INVINCIBLE) // don't respawn strength or shield, that will only lead to them spawning very early each match
{
if(self.reset)
{
self.classname = "player";
PutClientInServer();
}
+ else if(g_freezetag)
+ {
+ if(self.classname == "player")
+ PutClientInServer();
+ }
else
{
/*
}
if(g_keyhunt)
- kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round")+(game_starttime - time), "", kh_StartRound);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round+(game_starttime - time), "", kh_StartRound);
if(g_arena)
if(champion && champion.classname == "player" && player_count > 1)
{
float f;
string msg;
+ entity e;
- if((!g_arena && !g_ca) || (g_arena && !arena_roundbased) || (time < game_starttime))
+ if((!g_arena && !g_ca && !g_freezetag) || (g_arena && !arena_roundbased) || (time < game_starttime))
return;
f = ceil(warmup - time);
else if(f == 1)
Announce("1");
- centerprint(self, msg);
+ FOR_EACH_PLAYER(e)
+ centerprint(e, msg);
}
if (g_arena) {
if(g_ca) {
ca_players = 0;
- FOR_EACH_PLAYER(self)
+ FOR_EACH_PLAYER(e)
ca_players += 1;
}
+
+ if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE)
+ self.movetype = MOVETYPE_WALK;
+ }
+}
+
+void count_spawned_players()
+{
+ // TODO fix "*spawned" name, it should rather be "*players" or so
+ // not doing this now to prevent merge hell with Tag
+ // fix after merging with Tag
+
+ // count amount of players in each team
+ totalspawned = redspawned = bluespawned = yellowspawned = pinkspawned = 0;
+ FOR_EACH_PLAYER(self) {
+ if (self.team == COLOR_TEAM1)
+ {
+ redspawned += 1;
+ totalspawned += 1;
+ }
+ else if (self.team == COLOR_TEAM2)
+ {
+ bluespawned += 1;
+ totalspawned += 1;
+ }
+ else if (self.team == COLOR_TEAM3)
+ {
+ yellowspawned += 1;
+ totalspawned += 1;
+ }
+ else if (self.team == COLOR_TEAM4)
+ {
+ pinkspawned += 1;
+ totalspawned += 1;
+ }
+ }
+}
+
+void count_alive_players()
+{
+ totalalive = redalive = bluealive = yellowalive = pinkalive = 0;
+ if(g_ca)
+ {
+ FOR_EACH_PLAYER(self) {
+ if (self.team == COLOR_TEAM1 && self.health >= 1)
+ {
+ redalive += 1;
+ totalalive += 1;
+ }
+ else if (self.team == COLOR_TEAM2 && self.health >= 1)
+ {
+ bluealive += 1;
+ totalalive += 1;
+ }
+ }
+ FOR_EACH_PLAYER(self) {
+ self.redalive_stat = redalive;
+ self.bluealive_stat = bluealive;
+ }
+ }
+ else if(g_freezetag)
+ {
+ // count amount of alive players in each team
+ FOR_EACH_PLAYER(self) {
+ if (self.team == COLOR_TEAM1 && self.freezetag_frozen == 0 && self.health >= 1)
+ {
+ redalive += 1;
+ totalalive += 1;
+ }
+ else if (self.team == COLOR_TEAM2 && self.freezetag_frozen == 0 && self.health >= 1)
+ {
+ bluealive += 1;
+ totalalive += 1;
+ }
+ else if (self.team == COLOR_TEAM3 && self.freezetag_frozen == 0 && self.health >= 1)
+ {
+ yellowalive += 1;
+ totalalive += 1;
+ }
+ else if (self.team == COLOR_TEAM4 && self.freezetag_frozen == 0 && self.health >= 1)
+ {
+ pinkalive += 1;
+ totalalive += 1;
+ }
+ }
+ FOR_EACH_PLAYER(self) {
+ self.redalive_stat = redalive;
+ self.bluealive_stat = bluealive;
+ self.yellowalive_stat = yellowalive;
+ self.pinkalive_stat = pinkalive;
+ }
}
- if(self.classname == "player" && self.health > 0)
- self.movetype = MOVETYPE_WALK;
}
-float next_round;
-float stopalivecheck;
-float redalive, bluealive;
-.float redalive_stat, bluealive_stat;
/**
* This function finds out whether an arena round is over 1 player is left.
* It determines the last player who's still alive and saves it's entity reference
*/
void Spawnqueue_Check()
{
- if(g_ca) // we want to perform this before the return block below...
+ count_spawned_players();
+ if(g_ca || g_freezetag) // we want to perform this before the return block below (CA)...
{
- // this is STUPID to perform again, but has to be done so that we can give instant feedback when a round ends
- // and so the code won't start searching for a champion using find() before all players are actually REMOVED
- redalive = 0; bluealive = 0;
- FOR_EACH_PLAYER(self) {
- if (self.team == COLOR_TEAM1 && self.health >= 1) redalive += 1;
- else if (self.team == COLOR_TEAM2 && self.health >= 1) bluealive += 1;
- }
- // as if the above stuff wasn't stupid enough, let's run it a third time! :D
- // (so that we can send redalive/bluealive as a stat)
- FOR_EACH_PLAYER(self) {
- self.redalive_stat = redalive;
- self.bluealive_stat = bluealive;
- }
+ count_alive_players();
}
- if(time < warmup + 1 || inWarmupStage)
+ if(time < warmup + 1 || inWarmupStage || intermission_running)
return;
if(g_ca) {
- // check the amount of spawned players in each team
- float redspawned, bluespawned;
- FOR_EACH_PLAYER(self) {
- if (self.team == COLOR_TEAM1) redspawned += 1;
- else if (self.team == COLOR_TEAM2) bluespawned += 1;
- }
-
- required_ca_players = max(2, fabs(cvar("bot_vs_human") + 1));
+ required_ca_players = max(2, fabs(autocvar_bot_vs_human + 1));
if(ca_players < required_ca_players && (redspawned && bluespawned)) {
reset_map(TRUE);
strunzone(champion_name);
champion_name = strzone(champion.netname);
}
- else if((!redspawned && !bluespawned) || time - warmup > cvar("g_ca_round_timelimit")) {
+ else if((!redspawned && !bluespawned) || time - warmup > autocvar_g_ca_round_timelimit) {
FOR_EACH_CLIENT(self) centerprint(self, strcat("^7Round tied.", "^7\n"));
next_round = time + 5;
}
next_round = 0;
reset_map(TRUE);
}
+ } else if(g_freezetag) {
+ if((next_round && next_round < time))
+ {
+ next_round = 0;
+ reset_map(TRUE);
+ }
} else { // arena
//extend next_round if it isn't set yet and only 1 player is spawned
if(!next_round)
}
if(other.assault_sprite)
+ {
WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
+ if(other.classname == "func_assault_destructible")
+ other.sprite = world;
+ }
else
return; // already activated! cannot activate again!
oldself = self;
self = oldself.enemy;
+ if(self.message)
+ {
+ entity player;
+ string s;
+ FOR_EACH_PLAYER(player)
+ {
+ s = strcat(self.message, "\n");
+ centerprint(player, s);
+ }
+ }
+
oldactivator = activator;
activator = oldself;
SUB_UseTargets();
for(ent = world; (ent = find(ent, target, self.targetname)); )
{
if(ent.assault_sprite != world)
+ {
WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
+ if(ent.classname == "func_assault_destructible")
+ ent.sprite = world;
+ }
spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
spr.assault_decreaser = self;
spr.classname = "sprite_waypoint";
WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY);
if(ent.classname == "func_assault_destructible")
+ {
WaypointSprite_UpdateSprites(spr, "as-defend", "as-destroy", "as-destroy");
+ WaypointSprite_UpdateMaxHealth(spr, ent.max_health);
+ WaypointSprite_UpdateHealth(spr, ent.health);
+ ent.sprite = spr;
+ }
else
WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
activator = self;
SUB_UseTargets();
- /*
+
#ifdef TTURRETS_ENABLED
-entity ent,oldself;
+ entity ent, oldself;
//(Re)spawn all turrets
oldself = self;
ent = find(world, classname, "turret_main");
while(ent) {
- // Swap turret teams
- if(ent.team == COLOR_TEAM1)
- ent.team = COLOR_TEAM2;
- else
- ent.team = COLOR_TEAM1;
+ // Swap turret teams
+ if(ent.team == COLOR_TEAM1)
+ ent.team = COLOR_TEAM2;
+ else
+ ent.team = COLOR_TEAM1;
- self = ent;
+ self = ent;
- // Dubbles as teamchange
- turret_stdproc_respawn();
- //ent.turret_spawnfunc();
+ // Dubbles as teamchange
+ turret_stdproc_respawn();
- ent = find(ent, classname, "turret_main");
+ ent = find(ent, classname, "turret_main");
}
self = oldself;
#endif
-*/
+
}
-float autocvar_sv_cheats;
+float autocvar__campaign_index;
+string autocvar__campaign_name;
+float autocvar__sv_init;
+float autocvar_bot_ai_aimskill_blendrate;
+float autocvar_bot_ai_aimskill_firetolerance_distdegrees;
+float autocvar_bot_ai_aimskill_firetolerance_maxdegrees;
+float autocvar_bot_ai_aimskill_firetolerance_mindegrees;
+float autocvar_bot_ai_aimskill_fixedrate;
+float autocvar_bot_ai_aimskill_mouse;
+float autocvar_bot_ai_aimskill_offset;
+float autocvar_bot_ai_aimskill_order_filter_1st;
+float autocvar_bot_ai_aimskill_order_filter_2nd;
+float autocvar_bot_ai_aimskill_order_filter_3th;
+float autocvar_bot_ai_aimskill_order_filter_4th;
+float autocvar_bot_ai_aimskill_order_filter_5th;
+float autocvar_bot_ai_aimskill_order_mix_1st;
+float autocvar_bot_ai_aimskill_order_mix_2nd;
+float autocvar_bot_ai_aimskill_order_mix_3th;
+float autocvar_bot_ai_aimskill_order_mix_4th;
+float autocvar_bot_ai_aimskill_order_mix_5th;
+float autocvar_bot_ai_aimskill_think;
+float autocvar_bot_ai_bunnyhop_firstjumpdelay;
+float autocvar_bot_ai_bunnyhop_skilloffset;
+float autocvar_bot_ai_bunnyhop_startdistance;
+float autocvar_bot_ai_bunnyhop_stopdistance;
+float autocvar_bot_ai_chooseweaponinterval;
+string autocvar_bot_ai_custom_weapon_priority_close;
+string autocvar_bot_ai_custom_weapon_priority_distances;
+string autocvar_bot_ai_custom_weapon_priority_far;
+string autocvar_bot_ai_custom_weapon_priority_mid;
+float autocvar_bot_ai_dangerdetectioninterval;
+float autocvar_bot_ai_dangerdetectionupdates;
+float autocvar_bot_ai_enemydetectioninterval;
+float autocvar_bot_ai_enemydetectionradius;
+float autocvar_bot_ai_friends_aware_pickup_radius;
+float autocvar_bot_ai_ignoregoal_timeout;
+float autocvar_bot_ai_keyboard_distance;
+float autocvar_bot_ai_keyboard_threshold;
+float autocvar_bot_ai_navigation_jetpack;
+float autocvar_bot_ai_navigation_jetpack_mindistance;
+float autocvar_bot_ai_strategyinterval;
+float autocvar_bot_ai_thinkinterval;
+float autocvar_bot_ai_weapon_combo;
+float autocvar_bot_ai_weapon_combo_threshold;
+string autocvar_bot_config_file;
+float autocvar_bot_god;
+float autocvar_bot_ignore_bots;
+float autocvar_bot_join_empty;
+float autocvar_bot_navigation_ignoreplayers;
+float autocvar_bot_nofire;
+#define autocvar_bot_number cvar("bot_number")
+#define autocvar_bot_prefix cvar_string("bot_prefix")
+float autocvar_bot_sound_monopoly;
+#define autocvar_bot_suffix cvar_string("bot_suffix")
+float autocvar_bot_usemodelnames;
+float autocvar_bot_vs_human;
+float autocvar_captureleadlimit_override;
+#define autocvar_capturelimit_override cvar("capturelimit_override")
+float autocvar_deathmatch_force_teamplay;
+#define autocvar_developer cvar("developer")
+float autocvar_developer_fteqccbugs;
+float autocvar_ekg;
+#define autocvar_fraglimit cvar("fraglimit")
+#define autocvar_fraglimit_override cvar("fraglimit_override")
+float autocvar_g_allow_oldnexbeam;
+float autocvar_g_antilag;
+float autocvar_g_antilag_bullets;
+float autocvar_g_antilag_nudge;
+float autocvar_g_arena_maxspawned;
+float autocvar_g_arena_point_leadlimit;
+float autocvar_g_arena_point_limit;
+float autocvar_g_arena_powerups;
+float autocvar_g_arena_roundbased;
+float autocvar_g_arena_warmup;
+float autocvar_g_assault;
+float autocvar_g_balance_armor_blockpercent;
+float autocvar_g_balance_armor_limit;
+float autocvar_g_balance_armor_regen;
+float autocvar_g_balance_armor_regenlinear;
+float autocvar_g_balance_armor_regenstable;
+float autocvar_g_balance_armor_rot;
+float autocvar_g_balance_armor_rotlinear;
+float autocvar_g_balance_armor_rotstable;
+float autocvar_g_balance_armor_start;
+float autocvar_g_balance_sniperrifle_auto_reload_on_switch;
+float autocvar_g_balance_sniperrifle_bursttime;
+float autocvar_g_balance_sniperrifle_magazinecapacity;
+float autocvar_g_balance_sniperrifle_primary_ammo;
+float autocvar_g_balance_sniperrifle_primary_animtime;
+float autocvar_g_balance_sniperrifle_primary_bulletconstant;
+float autocvar_g_balance_sniperrifle_primary_bullethail;
+float autocvar_g_balance_sniperrifle_primary_burstcost;
+float autocvar_g_balance_sniperrifle_primary_damage;
+float autocvar_g_balance_sniperrifle_primary_force;
+float autocvar_g_balance_sniperrifle_primary_headshotaddeddamage;
+float autocvar_g_balance_sniperrifle_primary_lifetime;
+float autocvar_g_balance_sniperrifle_primary_refire;
+float autocvar_g_balance_sniperrifle_primary_speed;
+float autocvar_g_balance_sniperrifle_primary_spread;
+float autocvar_g_balance_sniperrifle_primary_tracer;
+float autocvar_g_balance_sniperrifle_reloadtime;
+float autocvar_g_balance_sniperrifle_secondary;
+float autocvar_g_balance_sniperrifle_secondary_ammo;
+float autocvar_g_balance_sniperrifle_secondary_animtime;
+float autocvar_g_balance_sniperrifle_secondary_bulletconstant;
+float autocvar_g_balance_sniperrifle_secondary_bullethail;
+float autocvar_g_balance_sniperrifle_secondary_burstcost;
+float autocvar_g_balance_sniperrifle_secondary_damage;
+float autocvar_g_balance_sniperrifle_secondary_force;
+float autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage;
+float autocvar_g_balance_sniperrifle_secondary_lifetime;
+float autocvar_g_balance_sniperrifle_secondary_reload;
+float autocvar_g_balance_sniperrifle_secondary_refire;
+float autocvar_g_balance_sniperrifle_secondary_speed;
+float autocvar_g_balance_sniperrifle_secondary_spread;
+float autocvar_g_balance_sniperrifle_secondary_tracer;
+float autocvar_g_balance_cloaked_alpha;
+float autocvar_g_balance_crylink_primary_ammo;
+float autocvar_g_balance_crylink_primary_animtime;
+float autocvar_g_balance_crylink_primary_bouncedamagefactor;
+float autocvar_g_balance_crylink_primary_bounces;
+float autocvar_g_balance_crylink_primary_damage;
+float autocvar_g_balance_crylink_primary_edgedamage;
+float autocvar_g_balance_crylink_primary_force;
+float autocvar_g_balance_crylink_primary_joindelay;
+float autocvar_g_balance_crylink_primary_joinexplode;
+float autocvar_g_balance_crylink_primary_joinexplode_damage;
+float autocvar_g_balance_crylink_primary_joinexplode_edgedamage;
+float autocvar_g_balance_crylink_primary_joinexplode_force;
+float autocvar_g_balance_crylink_primary_joinexplode_radius;
+float autocvar_g_balance_crylink_primary_joinspread;
+float autocvar_g_balance_crylink_primary_jointime;
+float autocvar_g_balance_crylink_primary_linkexplode;
+float autocvar_g_balance_crylink_primary_middle_fadetime;
+float autocvar_g_balance_crylink_primary_middle_lifetime;
+float autocvar_g_balance_crylink_primary_other_fadetime;
+float autocvar_g_balance_crylink_primary_other_lifetime;
+float autocvar_g_balance_crylink_primary_radius;
+float autocvar_g_balance_crylink_primary_refire;
+float autocvar_g_balance_crylink_primary_shots;
+float autocvar_g_balance_crylink_primary_speed;
+float autocvar_g_balance_crylink_primary_spread;
+float autocvar_g_balance_crylink_secondary;
+float autocvar_g_balance_crylink_secondary_ammo;
+float autocvar_g_balance_crylink_secondary_animtime;
+float autocvar_g_balance_crylink_secondary_bouncedamagefactor;
+float autocvar_g_balance_crylink_secondary_bounces;
+float autocvar_g_balance_crylink_secondary_damage;
+float autocvar_g_balance_crylink_secondary_edgedamage;
+float autocvar_g_balance_crylink_secondary_force;
+float autocvar_g_balance_crylink_secondary_joindelay;
+float autocvar_g_balance_crylink_secondary_joinexplode;
+float autocvar_g_balance_crylink_secondary_joinexplode_damage;
+float autocvar_g_balance_crylink_secondary_joinexplode_edgedamage;
+float autocvar_g_balance_crylink_secondary_joinexplode_force;
+float autocvar_g_balance_crylink_secondary_joinexplode_radius;
+float autocvar_g_balance_crylink_secondary_joinspread;
+float autocvar_g_balance_crylink_secondary_jointime;
+float autocvar_g_balance_crylink_secondary_line_fadetime;
+float autocvar_g_balance_crylink_secondary_line_lifetime;
+float autocvar_g_balance_crylink_secondary_linkexplode;
+float autocvar_g_balance_crylink_secondary_middle_fadetime;
+float autocvar_g_balance_crylink_secondary_middle_lifetime;
+float autocvar_g_balance_crylink_secondary_radius;
+float autocvar_g_balance_crylink_secondary_refire;
+float autocvar_g_balance_crylink_secondary_shots;
+float autocvar_g_balance_crylink_secondary_speed;
+float autocvar_g_balance_crylink_secondary_spread;
+float autocvar_g_balance_ctf_damageforcescale;
+float autocvar_g_balance_ctf_delay_collect;
+float autocvar_g_balance_curse_empathy_minhealth;
+float autocvar_g_balance_curse_empathy_takedamage;
+float autocvar_g_balance_curse_slow_atkrate;
+float autocvar_g_balance_curse_slow_highspeed;
+float autocvar_g_balance_curse_venom_hpmod;
+float autocvar_g_balance_curse_venom_limitmod;
+float autocvar_g_balance_curse_venom_rotrate;
+float autocvar_g_balance_curse_vulner_takedamage;
+float autocvar_g_balance_curse_weak_damage;
+float autocvar_g_balance_curse_weak_force;
+float autocvar_g_balance_electro_combo_comboradius;
+float autocvar_g_balance_electro_combo_damage;
+float autocvar_g_balance_electro_combo_edgedamage;
+float autocvar_g_balance_electro_combo_force;
+float autocvar_g_balance_electro_combo_radius;
+float autocvar_g_balance_electro_combo_speed;
+float autocvar_g_balance_electro_lightning;
+float autocvar_g_balance_electro_primary_ammo;
+float autocvar_g_balance_electro_primary_animtime;
+float autocvar_g_balance_electro_primary_comboradius;
+float autocvar_g_balance_electro_primary_damage;
+float autocvar_g_balance_electro_primary_edgedamage;
+float autocvar_g_balance_electro_primary_falloff_halflifedist;
+float autocvar_g_balance_electro_primary_falloff_maxdist;
+float autocvar_g_balance_electro_primary_falloff_mindist;
+float autocvar_g_balance_electro_primary_force;
+float autocvar_g_balance_electro_primary_force_up;
+float autocvar_g_balance_electro_primary_lifetime;
+float autocvar_g_balance_electro_primary_radius;
+float autocvar_g_balance_electro_primary_range;
+float autocvar_g_balance_electro_primary_refire;
+float autocvar_g_balance_electro_primary_speed;
+float autocvar_g_balance_electro_secondary_ammo;
+float autocvar_g_balance_electro_secondary_animtime;
+float autocvar_g_balance_electro_secondary_bouncefactor;
+float autocvar_g_balance_electro_secondary_bouncestop;
+float autocvar_g_balance_electro_secondary_count;
+float autocvar_g_balance_electro_secondary_damage;
+float autocvar_g_balance_electro_secondary_damageforcescale;
+float autocvar_g_balance_electro_secondary_edgedamage;
+float autocvar_g_balance_electro_secondary_force;
+float autocvar_g_balance_electro_secondary_health;
+float autocvar_g_balance_electro_secondary_lifetime;
+float autocvar_g_balance_electro_secondary_radius;
+float autocvar_g_balance_electro_secondary_refire;
+float autocvar_g_balance_electro_secondary_refire2;
+float autocvar_g_balance_electro_secondary_speed;
+float autocvar_g_balance_falldamage_deadminspeed;
+float autocvar_g_balance_falldamage_factor;
+float autocvar_g_balance_falldamage_maxdamage;
+float autocvar_g_balance_falldamage_minspeed;
+float autocvar_g_balance_fireball_primary_ammo;
+float autocvar_g_balance_fireball_primary_animtime;
+float autocvar_g_balance_fireball_primary_bfgdamage;
+float autocvar_g_balance_fireball_primary_bfgforce;
+float autocvar_g_balance_fireball_primary_bfgradius;
+float autocvar_g_balance_fireball_primary_damage;
+float autocvar_g_balance_fireball_primary_damageforcescale;
+float autocvar_g_balance_fireball_primary_edgedamage;
+float autocvar_g_balance_fireball_primary_force;
+float autocvar_g_balance_fireball_primary_health;
+float autocvar_g_balance_fireball_primary_laserburntime;
+float autocvar_g_balance_fireball_primary_laserdamage;
+float autocvar_g_balance_fireball_primary_laseredgedamage;
+float autocvar_g_balance_fireball_primary_laserradius;
+float autocvar_g_balance_fireball_primary_lifetime;
+float autocvar_g_balance_fireball_primary_radius;
+float autocvar_g_balance_fireball_primary_refire;
+float autocvar_g_balance_fireball_primary_refire2;
+float autocvar_g_balance_fireball_primary_speed;
+float autocvar_g_balance_fireball_secondary_ammo;
+float autocvar_g_balance_fireball_secondary_animtime;
+float autocvar_g_balance_fireball_secondary_damage;
+float autocvar_g_balance_fireball_secondary_damageforcescale;
+float autocvar_g_balance_fireball_secondary_damagetime;
+float autocvar_g_balance_fireball_secondary_laserburntime;
+float autocvar_g_balance_fireball_secondary_laserdamage;
+float autocvar_g_balance_fireball_secondary_laseredgedamage;
+float autocvar_g_balance_fireball_secondary_laserradius;
+float autocvar_g_balance_fireball_secondary_lifetime;
+float autocvar_g_balance_fireball_secondary_refire;
+float autocvar_g_balance_fireball_secondary_speed;
+float autocvar_g_balance_fireball_secondary_speed_up;
+float autocvar_g_balance_firetransfer_damage;
+float autocvar_g_balance_firetransfer_time;
+float autocvar_g_balance_fuel_limit;
+float autocvar_g_balance_fuel_regen;
+float autocvar_g_balance_fuel_regenlinear;
+float autocvar_g_balance_fuel_regenstable;
+float autocvar_g_balance_fuel_rot;
+float autocvar_g_balance_fuel_rotlinear;
+float autocvar_g_balance_fuel_rotstable;
+float autocvar_g_balance_grapplehook_airfriction;
+float autocvar_g_balance_grapplehook_force_rubber;
+float autocvar_g_balance_grapplehook_force_rubber_overstretch;
+float autocvar_g_balance_grapplehook_health;
+float autocvar_g_balance_grapplehook_length_min;
+float autocvar_g_balance_grapplehook_speed_fly;
+float autocvar_g_balance_grapplehook_speed_pull;
+float autocvar_g_balance_grapplehook_stretch;
+float autocvar_g_balance_grenadelauncher_bouncefactor;
+float autocvar_g_balance_grenadelauncher_bouncestop;
+float autocvar_g_balance_grenadelauncher_primary_ammo;
+float autocvar_g_balance_grenadelauncher_primary_animtime;
+float autocvar_g_balance_grenadelauncher_primary_damage;
+float autocvar_g_balance_grenadelauncher_primary_damageforcescale;
+float autocvar_g_balance_grenadelauncher_primary_edgedamage;
+float autocvar_g_balance_grenadelauncher_primary_force;
+float autocvar_g_balance_grenadelauncher_primary_health;
+float autocvar_g_balance_grenadelauncher_primary_lifetime;
+float autocvar_g_balance_grenadelauncher_primary_lifetime2;
+float autocvar_g_balance_grenadelauncher_primary_radius;
+float autocvar_g_balance_grenadelauncher_primary_refire;
+float autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt;
+float autocvar_g_balance_grenadelauncher_primary_speed;
+float autocvar_g_balance_grenadelauncher_primary_speed_up;
+float autocvar_g_balance_grenadelauncher_primary_type;
+float autocvar_g_balance_grenadelauncher_secondary_ammo;
+float autocvar_g_balance_grenadelauncher_secondary_animtime;
+float autocvar_g_balance_grenadelauncher_secondary_damage;
+float autocvar_g_balance_grenadelauncher_secondary_damageforcescale;
+float autocvar_g_balance_grenadelauncher_secondary_edgedamage;
+float autocvar_g_balance_grenadelauncher_secondary_force;
+float autocvar_g_balance_grenadelauncher_secondary_health;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime2;
+float autocvar_g_balance_grenadelauncher_secondary_radius;
+float autocvar_g_balance_grenadelauncher_secondary_refire;
+float autocvar_g_balance_grenadelauncher_secondary_speed;
+float autocvar_g_balance_grenadelauncher_secondary_speed_up;
+float autocvar_g_balance_grenadelauncher_secondary_type;
+float autocvar_g_balance_hagar_primary_ammo;
+float autocvar_g_balance_hagar_primary_damage;
+float autocvar_g_balance_hagar_primary_edgedamage;
+float autocvar_g_balance_hagar_primary_force;
+float autocvar_g_balance_hagar_primary_lifetime;
+float autocvar_g_balance_hagar_primary_radius;
+float autocvar_g_balance_hagar_primary_refire;
+float autocvar_g_balance_hagar_primary_speed;
+float autocvar_g_balance_hagar_secondary;
+float autocvar_g_balance_hagar_secondary_ammo;
+float autocvar_g_balance_hagar_secondary_damage;
+float autocvar_g_balance_hagar_secondary_edgedamage;
+float autocvar_g_balance_hagar_secondary_force;
+float autocvar_g_balance_hagar_secondary_lifetime_min;
+float autocvar_g_balance_hagar_secondary_lifetime_rand;
+float autocvar_g_balance_hagar_secondary_radius;
+float autocvar_g_balance_hagar_secondary_refire;
+float autocvar_g_balance_health_limit;
+float autocvar_g_balance_health_regen;
+float autocvar_g_balance_health_regenlinear;
+float autocvar_g_balance_health_regenstable;
+float autocvar_g_balance_health_rot;
+float autocvar_g_balance_health_rotlinear;
+float autocvar_g_balance_health_rotstable;
+float autocvar_g_balance_health_start;
+float autocvar_g_balance_hlac_primary_ammo;
+float autocvar_g_balance_hlac_primary_animtime;
+float autocvar_g_balance_hlac_primary_damage;
+float autocvar_g_balance_hlac_primary_edgedamage;
+float autocvar_g_balance_hlac_primary_force;
+float autocvar_g_balance_hlac_primary_lifetime;
+float autocvar_g_balance_hlac_primary_radius;
+float autocvar_g_balance_hlac_primary_refire;
+float autocvar_g_balance_hlac_primary_speed;
+float autocvar_g_balance_hlac_primary_spread_add;
+float autocvar_g_balance_hlac_primary_spread_crouchmod;
+float autocvar_g_balance_hlac_primary_spread_max;
+float autocvar_g_balance_hlac_primary_spread_min;
+float autocvar_g_balance_hlac_secondary;
+float autocvar_g_balance_hlac_secondary_ammo;
+float autocvar_g_balance_hlac_secondary_animtime;
+float autocvar_g_balance_hlac_secondary_damage;
+float autocvar_g_balance_hlac_secondary_edgedamage;
+float autocvar_g_balance_hlac_secondary_force;
+float autocvar_g_balance_hlac_secondary_lifetime;
+float autocvar_g_balance_hlac_secondary_radius;
+float autocvar_g_balance_hlac_secondary_refire;
+float autocvar_g_balance_hlac_secondary_shots;
+float autocvar_g_balance_hlac_secondary_speed;
+float autocvar_g_balance_hlac_secondary_spread;
+float autocvar_g_balance_hlac_secondary_spread_crouchmod;
+float autocvar_g_balance_hook_primary_animtime;
+float autocvar_g_balance_hook_primary_fuel;
+float autocvar_g_balance_hook_primary_hooked_fuel;
+float autocvar_g_balance_hook_primary_hooked_time_free;
+float autocvar_g_balance_hook_primary_hooked_time_max;
+float autocvar_g_balance_hook_primary_refire;
+float autocvar_g_balance_hook_secondary_ammo;
+float autocvar_g_balance_hook_secondary_animtime;
+float autocvar_g_balance_hook_secondary_damage;
+float autocvar_g_balance_hook_secondary_duration;
+float autocvar_g_balance_hook_secondary_edgedamage;
+float autocvar_g_balance_hook_secondary_force;
+float autocvar_g_balance_hook_secondary_gravity;
+float autocvar_g_balance_hook_secondary_lifetime;
+float autocvar_g_balance_hook_secondary_power;
+float autocvar_g_balance_hook_secondary_radius;
+float autocvar_g_balance_hook_secondary_refire;
+float autocvar_g_balance_hook_secondary_speed;
+float autocvar_g_balance_keyhunt_damageforcescale;
+float autocvar_g_balance_keyhunt_delay_collect;
+float autocvar_g_balance_keyhunt_delay_drop;
+float autocvar_g_balance_keyhunt_delay_return;
+float autocvar_g_balance_keyhunt_delay_round;
+float autocvar_g_balance_keyhunt_delay_tracking;
+float autocvar_g_balance_keyhunt_dropvelocity;
+float autocvar_g_balance_keyhunt_maxdist;
+float autocvar_g_balance_keyhunt_protecttime;
+float autocvar_g_balance_keyhunt_score_capture;
+float autocvar_g_balance_keyhunt_score_carrierfrag;
+float autocvar_g_balance_keyhunt_score_collect;
+float autocvar_g_balance_keyhunt_score_destroyed;
+float autocvar_g_balance_keyhunt_score_destroyed_ownfactor;
+float autocvar_g_balance_keyhunt_score_push;
+float autocvar_g_balance_keyhunt_throwvelocity;
+float autocvar_g_balance_kill_delay;
+float autocvar_g_balance_kill_antispam;
+float autocvar_g_balance_laser_primary_animtime;
+float autocvar_g_balance_laser_primary_damage;
+float autocvar_g_balance_laser_primary_delay;
+float autocvar_g_balance_laser_primary_edgedamage;
+float autocvar_g_balance_laser_primary_force;
+float autocvar_g_balance_laser_primary_force_other_scale;
+float autocvar_g_balance_laser_primary_force_velocitybias;
+float autocvar_g_balance_laser_primary_force_zscale;
+float autocvar_g_balance_laser_primary_lifetime;
+float autocvar_g_balance_laser_primary_radius;
+float autocvar_g_balance_laser_primary_refire;
+float autocvar_g_balance_laser_primary_shotangle;
+float autocvar_g_balance_laser_primary_speed;
+float autocvar_g_balance_laser_secondary;
+float autocvar_g_balance_laser_secondary_animtime;
+float autocvar_g_balance_laser_secondary_damage;
+float autocvar_g_balance_laser_secondary_edgedamage;
+float autocvar_g_balance_laser_secondary_force;
+float autocvar_g_balance_laser_secondary_force_other_scale;
+float autocvar_g_balance_laser_secondary_force_velocitybias;
+float autocvar_g_balance_laser_secondary_force_zscale;
+float autocvar_g_balance_laser_secondary_lifetime;
+float autocvar_g_balance_laser_secondary_radius;
+float autocvar_g_balance_laser_secondary_speed;
+float autocvar_g_balance_minelayer_ammo;
+float autocvar_g_balance_minelayer_animtime;
+float autocvar_g_balance_minelayer_damage;
+float autocvar_g_balance_minelayer_damageforcescale;
+float autocvar_g_balance_minelayer_detonatedelay;
+float autocvar_g_balance_minelayer_edgedamage;
+float autocvar_g_balance_minelayer_force;
+float autocvar_g_balance_minelayer_health;
+float autocvar_g_balance_minelayer_lifetime;
+float autocvar_g_balance_minelayer_lifetime_countdown;
+float autocvar_g_balance_minelayer_limit;
+float autocvar_g_balance_minelayer_protection;
+float autocvar_g_balance_minelayer_proximityradius;
+float autocvar_g_balance_minelayer_radius;
+float autocvar_g_balance_minelayer_refire;
+float autocvar_g_balance_minelayer_remote_damage;
+float autocvar_g_balance_minelayer_remote_edgedamage;
+float autocvar_g_balance_minelayer_remote_force;
+float autocvar_g_balance_minelayer_remote_radius;
+float autocvar_g_balance_minelayer_speed;
+float autocvar_g_balance_minelayer_time;
+float autocvar_g_balance_minstanex_ammo;
+float autocvar_g_balance_minstanex_animtime;
+float autocvar_g_balance_minstanex_refire;
+float autocvar_g_balance_nex_charge;
+float autocvar_g_balance_nex_charge_animlimit;
+float autocvar_g_balance_nex_charge_limit;
+float autocvar_g_balance_nex_charge_maxspeed;
+float autocvar_g_balance_nex_charge_mindmg;
+float autocvar_g_balance_nex_charge_minspeed;
+float autocvar_g_balance_nex_charge_rate;
+float autocvar_g_balance_nex_charge_rot_pause;
+float autocvar_g_balance_nex_charge_rot_rate;
+float autocvar_g_balance_nex_charge_shot_multiplier;
+float autocvar_g_balance_nex_charge_start;
+float autocvar_g_balance_nex_charge_velocity_rate;
+float autocvar_g_balance_nex_primary_ammo;
+float autocvar_g_balance_nex_primary_animtime;
+float autocvar_g_balance_nex_primary_damage;
+float autocvar_g_balance_nex_primary_damagefalloff_forcehalflife;
+float autocvar_g_balance_nex_primary_damagefalloff_halflife;
+float autocvar_g_balance_nex_primary_damagefalloff_maxdist;
+float autocvar_g_balance_nex_primary_damagefalloff_mindist;
+float autocvar_g_balance_nex_primary_force;
+float autocvar_g_balance_nex_primary_refire;
+float autocvar_g_balance_nex_secondary;
+float autocvar_g_balance_nex_secondary_ammo;
+float autocvar_g_balance_nex_secondary_animtime;
+float autocvar_g_balance_nex_secondary_charge;
+float autocvar_g_balance_nex_secondary_charge_rate;
+float autocvar_g_balance_nex_secondary_chargepool;
+float autocvar_g_balance_nex_secondary_chargepool_pause_health_regen;
+float autocvar_g_balance_nex_secondary_chargepool_pause_regen;
+float autocvar_g_balance_nex_secondary_chargepool_regen;
+float autocvar_g_balance_nex_secondary_damage;
+float autocvar_g_balance_nex_secondary_damagefalloff_forcehalflife;
+float autocvar_g_balance_nex_secondary_damagefalloff_halflife;
+float autocvar_g_balance_nex_secondary_damagefalloff_maxdist;
+float autocvar_g_balance_nex_secondary_damagefalloff_mindist;
+float autocvar_g_balance_nex_secondary_force;
+float autocvar_g_balance_nex_secondary_refire;
+float autocvar_g_balance_nexball_primary_animtime;
+float autocvar_g_balance_nexball_primary_refire;
+float autocvar_g_balance_nexball_primary_speed;
+float autocvar_g_balance_nexball_secondary_animtime;
+float autocvar_g_balance_nexball_secondary_force;
+float autocvar_g_balance_nexball_secondary_lifetime;
+float autocvar_g_balance_nexball_secondary_refire;
+float autocvar_g_balance_nexball_secondary_speed;
+float autocvar_g_balance_nix_ammo_cells;
+float autocvar_g_balance_nix_ammo_fuel;
+float autocvar_g_balance_nix_ammo_nails;
+float autocvar_g_balance_nix_ammo_rockets;
+float autocvar_g_balance_nix_ammo_shells;
+float autocvar_g_balance_nix_ammoincr_cells;
+float autocvar_g_balance_nix_ammoincr_fuel;
+float autocvar_g_balance_nix_ammoincr_nails;
+float autocvar_g_balance_nix_ammoincr_rockets;
+float autocvar_g_balance_nix_ammoincr_shells;
+float autocvar_g_balance_nix_incrtime;
+float autocvar_g_balance_nix_roundtime;
+float autocvar_g_balance_pause_armor_rot;
+float autocvar_g_balance_pause_armor_rot_spawn;
+float autocvar_g_balance_pause_fuel_regen;
+float autocvar_g_balance_pause_fuel_rot;
+float autocvar_g_balance_pause_fuel_rot_spawn;
+float autocvar_g_balance_pause_health_regen;
+float autocvar_g_balance_pause_health_regen_spawn;
+float autocvar_g_balance_pause_health_rot;
+float autocvar_g_balance_pause_health_rot_spawn;
+float autocvar_g_balance_portal_health;
+float autocvar_g_balance_portal_lifetime;
+float autocvar_g_balance_porto_primary_animtime;
+float autocvar_g_balance_porto_primary_lifetime;
+float autocvar_g_balance_porto_primary_refire;
+float autocvar_g_balance_porto_primary_speed;
+float autocvar_g_balance_powerup_invincible_takedamage;
+float autocvar_g_balance_powerup_invincible_time;
+float autocvar_g_balance_powerup_strength_damage;
+float autocvar_g_balance_powerup_strength_force;
+float autocvar_g_balance_powerup_strength_selfdamage;
+float autocvar_g_balance_powerup_strength_selfforce;
+float autocvar_g_balance_powerup_strength_time;
+float autocvar_g_balance_powerup_timer;
+float autocvar_g_balance_rocketlauncher_ammo;
+float autocvar_g_balance_rocketlauncher_animtime;
+float autocvar_g_balance_rocketlauncher_damage;
+float autocvar_g_balance_rocketlauncher_damageforcescale;
+float autocvar_g_balance_rocketlauncher_detonatedelay;
+float autocvar_g_balance_rocketlauncher_edgedamage;
+float autocvar_g_balance_rocketlauncher_force;
+float autocvar_g_balance_rocketlauncher_guidedelay;
+float autocvar_g_balance_rocketlauncher_guidegoal;
+float autocvar_g_balance_rocketlauncher_guiderate;
+float autocvar_g_balance_rocketlauncher_guideratedelay;
+float autocvar_g_balance_rocketlauncher_guidestop;
+float autocvar_g_balance_rocketlauncher_health;
+float autocvar_g_balance_rocketlauncher_lifetime;
+float autocvar_g_balance_rocketlauncher_radius;
+float autocvar_g_balance_rocketlauncher_refire;
+float autocvar_g_balance_rocketlauncher_remote_damage;
+float autocvar_g_balance_rocketlauncher_remote_edgedamage;
+float autocvar_g_balance_rocketlauncher_remote_force;
+float autocvar_g_balance_rocketlauncher_remote_radius;
+float autocvar_g_balance_rocketlauncher_speed;
+float autocvar_g_balance_rocketlauncher_speedaccel;
+float autocvar_g_balance_rocketlauncher_speedstart;
+float autocvar_g_balance_rune_defense_combo_takedamage;
+float autocvar_g_balance_rune_defense_takedamage;
+float autocvar_g_balance_rune_regen_combo_hpmod;
+float autocvar_g_balance_rune_regen_combo_limitmod;
+float autocvar_g_balance_rune_regen_combo_regenrate;
+float autocvar_g_balance_rune_regen_combo_rotrate;
+float autocvar_g_balance_rune_regen_hpmod;
+float autocvar_g_balance_rune_regen_limitmod;
+float autocvar_g_balance_rune_regen_regenrate;
+float autocvar_g_balance_rune_speed_atkrate;
+float autocvar_g_balance_rune_speed_combo_atkrate;
+float autocvar_g_balance_rune_speed_combo_highspeed;
+float autocvar_g_balance_rune_speed_highspeed;
+float autocvar_g_balance_rune_strength_combo_damage;
+float autocvar_g_balance_rune_strength_combo_force;
+float autocvar_g_balance_rune_strength_damage;
+float autocvar_g_balance_rune_strength_force;
+float autocvar_g_balance_rune_vampire_absorb;
+float autocvar_g_balance_rune_vampire_combo_absorb;
+float autocvar_g_balance_rune_vampire_maxhealth;
+float autocvar_g_balance_seeker_flac_ammo;
+float autocvar_g_balance_seeker_flac_animtime;
+float autocvar_g_balance_seeker_flac_damage;
+float autocvar_g_balance_seeker_flac_edgedamage;
+float autocvar_g_balance_seeker_flac_force;
+float autocvar_g_balance_seeker_flac_lifetime;
+float autocvar_g_balance_seeker_flac_lifetime_rand;
+float autocvar_g_balance_seeker_flac_radius;
+float autocvar_g_balance_seeker_flac_refire;
+float autocvar_g_balance_seeker_missile_accel;
+float autocvar_g_balance_seeker_missile_ammo;
+float autocvar_g_balance_seeker_missile_count;
+float autocvar_g_balance_seeker_missile_damage;
+float autocvar_g_balance_seeker_missile_damageforcescale;
+float autocvar_g_balance_seeker_missile_decel;
+float autocvar_g_balance_seeker_missile_delay;
+float autocvar_g_balance_seeker_missile_edgedamage;
+float autocvar_g_balance_seeker_missile_force;
+float autocvar_g_balance_seeker_missile_health;
+float autocvar_g_balance_seeker_missile_lifetime;
+float autocvar_g_balance_seeker_missile_proxy;
+float autocvar_g_balance_seeker_missile_proxy_delay;
+float autocvar_g_balance_seeker_missile_proxy_maxrange;
+float autocvar_g_balance_seeker_missile_radius;
+float autocvar_g_balance_seeker_missile_smart;
+float autocvar_g_balance_seeker_missile_smart_mindist;
+float autocvar_g_balance_seeker_missile_smart_trace_max;
+float autocvar_g_balance_seeker_missile_smart_trace_min;
+float autocvar_g_balance_seeker_missile_speed_max;
+float autocvar_g_balance_seeker_missile_turnrate;
+float autocvar_g_balance_seeker_tag_ammo;
+float autocvar_g_balance_seeker_tag_animtime;
+float autocvar_g_balance_seeker_tag_damageforcescale;
+float autocvar_g_balance_seeker_tag_health;
+float autocvar_g_balance_seeker_tag_lifetime;
+float autocvar_g_balance_seeker_tag_refire;
+float autocvar_g_balance_seeker_tag_speed;
+float autocvar_g_balance_selfdamagepercent;
+float autocvar_g_balance_shotgun_primary_ammo;
+float autocvar_g_balance_shotgun_primary_animtime;
+float autocvar_g_balance_shotgun_primary_bulletconstant;
+float autocvar_g_balance_shotgun_primary_bullets;
+float autocvar_g_balance_shotgun_primary_damage;
+float autocvar_g_balance_shotgun_primary_force;
+float autocvar_g_balance_shotgun_primary_refire;
+float autocvar_g_balance_shotgun_primary_speed;
+float autocvar_g_balance_shotgun_primary_spread;
+float autocvar_g_balance_shotgun_secondary;
+float autocvar_g_balance_shotgun_secondary_animtime;
+float autocvar_g_balance_shotgun_secondary_damage;
+float autocvar_g_balance_shotgun_secondary_force;
+float autocvar_g_balance_shotgun_secondary_melee_delay;
+float autocvar_g_balance_shotgun_secondary_melee_range;
+float autocvar_g_balance_shotgun_secondary_melee_swing;
+float autocvar_g_balance_shotgun_secondary_melee_time;
+float autocvar_g_balance_shotgun_secondary_refire;
+float autocvar_g_balance_teams;
+float autocvar_g_balance_teams_force;
+float autocvar_g_balance_teams_prevent_imbalance;
+float autocvar_g_balance_tuba_animtime;
+float autocvar_g_balance_tuba_attenuation;
+float autocvar_g_balance_tuba_damage;
+float autocvar_g_balance_tuba_edgedamage;
+float autocvar_g_balance_tuba_force;
+float autocvar_g_balance_tuba_radius;
+float autocvar_g_balance_tuba_refire;
+float autocvar_g_balance_uzi_bulletconstant;
+float autocvar_g_balance_uzi_burst;
+float autocvar_g_balance_uzi_burst_ammo;
+float autocvar_g_balance_uzi_burst_animtime;
+float autocvar_g_balance_uzi_burst_refire;
+float autocvar_g_balance_uzi_burst_refire2;
+float autocvar_g_balance_uzi_burst_spread;
+float autocvar_g_balance_uzi_first;
+float autocvar_g_balance_uzi_first_ammo;
+float autocvar_g_balance_uzi_first_damage;
+float autocvar_g_balance_uzi_first_force;
+float autocvar_g_balance_uzi_first_refire;
+float autocvar_g_balance_uzi_first_spread;
+float autocvar_g_balance_uzi_mode;
+float autocvar_g_balance_uzi_speed;
+float autocvar_g_balance_uzi_spread_add;
+float autocvar_g_balance_uzi_spread_max;
+float autocvar_g_balance_uzi_spread_min;
+float autocvar_g_balance_uzi_sustained_ammo;
+float autocvar_g_balance_uzi_sustained_damage;
+float autocvar_g_balance_uzi_sustained_force;
+float autocvar_g_balance_uzi_sustained_refire;
+float autocvar_g_balance_uzi_sustained_spread;
+float autocvar_g_balance_weaponswitchdelay;
+float autocvar_g_ballistics_density_corpse;
+float autocvar_g_ballistics_density_player;
+float autocvar_g_ballistics_materialconstant;
+float autocvar_g_ballistics_mindistance;
+float autocvar_g_ban_default_bantime;
+float autocvar_g_ban_default_masksize;
+float autocvar_g_ban_sync_interval;
+float autocvar_g_ban_sync_timeout;
+string autocvar_g_ban_sync_trusted_servers;
+float autocvar_g_ban_sync_trusted_servers_verify;
+string autocvar_g_ban_sync_uri;
+string autocvar_g_banned_list;
+float autocvar_g_banned_list_idmode;
float autocvar_g_bastet;
+float autocvar_g_botclip_collisions;
+float autocvar_g_bugrigs;
+float autocvar_g_ca_damage2score_multiplier;
+float autocvar_g_ca_point_leadlimit;
+float autocvar_g_ca_point_limit;
+float autocvar_g_ca_round_timelimit;
+float autocvar_g_ca_warmup;
+float autocvar_g_campaign;
+float autocvar_g_campaign_forceteam;
+float autocvar_g_campaign_skill;
+float autocvar_g_casings;
+float autocvar_g_changeteam_banned;
+float autocvar_g_chat_flood_burst;
+float autocvar_g_chat_flood_burst_team;
+float autocvar_g_chat_flood_burst_tell;
+float autocvar_g_chat_flood_lmax;
+float autocvar_g_chat_flood_lmax_team;
+float autocvar_g_chat_flood_lmax_tell;
+float autocvar_g_chat_flood_notify_flooder;
+float autocvar_g_chat_flood_spl;
+float autocvar_g_chat_flood_spl_team;
+float autocvar_g_chat_flood_spl_tell;
+float autocvar_g_chat_nospectators;
+float autocvar_g_chat_teamcolors;
+float autocvar_g_ctf_allow_drop;
+float autocvar_g_ctf_captimerecord_always;
+float autocvar_g_ctf_capture_leadlimit;
+float autocvar_g_ctf_capture_limit;
+float autocvar_g_ctf_dynamiclights;
+string autocvar_g_ctf_flag_blue_model;
+float autocvar_g_ctf_flag_blue_skin;
+float autocvar_g_ctf_flag_capture_effects;
+float autocvar_g_ctf_flag_glowtrails;
+float autocvar_g_ctf_flag_pickup_effects;
+string autocvar_g_ctf_flag_red_model;
+float autocvar_g_ctf_flag_red_skin;
+float autocvar_g_ctf_flag_returntime;
+float autocvar_g_ctf_flagcarrier_selfdamage;
+float autocvar_g_ctf_flagcarrier_selfforce;
+float autocvar_g_ctf_fullbrightflags;
+float autocvar_g_ctf_ignore_frags;
+float autocvar_g_ctf_shield_force;
+float autocvar_g_ctf_shield_max_ratio;
+float autocvar_g_ctf_shield_min_negscore;
+float autocvar_g_cts_finish_kill_delay;
+float autocvar_g_cts_selfdamage;
+float autocvar_g_deathglow;
+float autocvar_g_debug_bot_commands;
+float autocvar_g_domination_default_teams;
+float autocvar_g_domination_disable_frags;
+float autocvar_g_domination_point_amt;
+float autocvar_g_domination_point_fullbright;
+float autocvar_g_domination_point_leadlimit;
+#define autocvar_g_domination_point_limit cvar("g_domination_point_limit")
+float autocvar_g_domination_point_rate;
+float autocvar_g_domination_teams_override;
+float autocvar_g_forced_respawn;
+string autocvar_g_forced_team_blue;
+string autocvar_g_forced_team_otherwise;
+string autocvar_g_forced_team_pink;
+string autocvar_g_forced_team_red;
+string autocvar_g_forced_team_yellow;
+float autocvar_g_freezetag_frozen_force;
+float autocvar_g_freezetag_point_leadlimit;
+float autocvar_g_freezetag_point_limit;
+float autocvar_g_freezetag_revive_extra_size;
+float autocvar_g_freezetag_revive_speed;
+float autocvar_g_freezetag_revive_clearspeed;
+float autocvar_g_freezetag_warmup;
+#define autocvar_g_friendlyfire cvar("g_friendlyfire")
+#define autocvar_g_friendlyfire_virtual cvar("g_friendlyfire_virtual")
+#define autocvar_g_friendlyfire_virtual_force cvar("g_friendlyfire_virtual_force")
+float autocvar_g_full_getstatus_responses;
+float autocvar_g_fullbrightitems;
+float autocvar_g_fullbrightplayers;
+string autocvar_g_ghost_items_color;
+#define autocvar_g_grappling_hook cvar("g_grappling_hook")
+float autocvar_g_grappling_hook_tarzan;
+float autocvar_g_hitplots;
+string autocvar_g_hitplots_individuals;
+float autocvar_g_jetpack_acceleration_side;
+float autocvar_g_jetpack_acceleration_up;
+float autocvar_g_jetpack_antigravity;
+float autocvar_g_jetpack_attenuation;
+float autocvar_g_jetpack_fuel;
+float autocvar_g_jetpack_maxspeed_side;
+float autocvar_g_jetpack_maxspeed_up;
+float autocvar_g_keepaway_ballcarrier_effects;
+float autocvar_g_keepaway_ballcarrier_damage;
+float autocvar_g_keepaway_ballcarrier_force;
+float autocvar_g_keepaway_ballcarrier_highspeed;
+float autocvar_g_keepaway_ballcarrier_selfdamage;
+float autocvar_g_keepaway_ballcarrier_selfforce;
+float autocvar_g_keepaway_noncarrier_damage;
+float autocvar_g_keepaway_noncarrier_force;
+float autocvar_g_keepaway_noncarrier_selfdamage;
+float autocvar_g_keepaway_noncarrier_selfforce;
+float autocvar_g_keepaway_noncarrier_warn;
+float autocvar_g_keepaway_score_bckill;
+float autocvar_g_keepaway_score_killac;
+float autocvar_g_keepaway_score_timepoints;
+float autocvar_g_keepaway_score_timeinterval;
+float autocvar_g_keepawayball_damageforcescale;
+float autocvar_g_keepawayball_effects;
+float autocvar_g_keepawayball_respawntime;
+float autocvar_g_keepawayball_trail_color;
+float autocvar_g_keyhunt_point_leadlimit;
+#define autocvar_g_keyhunt_point_limit cvar("g_keyhunt_point_limit")
+float autocvar_g_keyhunt_teams;
+float autocvar_g_keyhunt_teams_override;
+float autocvar_g_lms_campcheck_damage;
+float autocvar_g_lms_campcheck_distance;
+float autocvar_g_lms_campcheck_interval;
+string autocvar_g_lms_campcheck_message;
+float autocvar_g_lms_join_anytime;
+float autocvar_g_lms_last_join;
+#define autocvar_g_lms_lives_override cvar("g_lms_lives_override")
+float autocvar_g_lms_regenerate;
+#define autocvar_g_maplist cvar_string("g_maplist")
+float autocvar_g_maplist_check_waypoints;
+float autocvar_g_maplist_index;
+string autocvar_g_maplist_mostrecent;
+float autocvar_g_maplist_mostrecent_count;
+float autocvar_g_maplist_selectrandom;
+float autocvar_g_maplist_shuffle;
+#define autocvar_g_maplist_votable cvar("g_maplist_votable")
+float autocvar_g_maplist_votable_abstain;
+float autocvar_g_maplist_votable_keeptwotime;
+float autocvar_g_maplist_votable_nodetail;
+string autocvar_g_maplist_votable_screenshot_dir;
+float autocvar_g_maplist_votable_suggestions;
+float autocvar_g_maplist_votable_suggestions_override_mostrecent;
+float autocvar_g_maplist_votable_timeout;
+float autocvar_g_maxplayers;
+float autocvar_g_maxplayers_spectator_blocktime;
+float autocvar_g_maxpushtime;
+float autocvar_g_maxspeed;
+#define autocvar_g_midair cvar("g_midair")
+float autocvar_g_midair_shieldtime;
+#define autocvar_g_minstagib cvar("g_minstagib")
+float autocvar_g_minstagib_ammo_drop;
+float autocvar_g_minstagib_extralives;
+float autocvar_g_minstagib_speed_highspeed;
+#define autocvar_g_mirrordamage cvar("g_mirrordamage")
+#define autocvar_g_mirrordamage_virtual cvar("g_mirrordamage_virtual")
+float autocvar_g_monster_zombie_attack_run_damage;
+float autocvar_g_monster_zombie_attack_run_delay;
+float autocvar_g_monster_zombie_attack_run_force;
+float autocvar_g_monster_zombie_attack_run_hitrange;
+float autocvar_g_monster_zombie_attack_run_range;
+float autocvar_g_monster_zombie_attack_stand_damage;
+float autocvar_g_monster_zombie_attack_stand_delay;
+float autocvar_g_monster_zombie_attack_stand_force;
+float autocvar_g_monster_zombie_attack_stand_range;
+float autocvar_g_monster_zombie_health;
+float autocvar_g_monster_zombie_idle_timer_max;
+float autocvar_g_monster_zombie_idle_timer_min;
+float autocvar_g_monster_zombie_movespeed;
+float autocvar_g_monster_zombie_respawntime;
+float autocvar_g_monster_zombie_stopspeed;
+float autocvar_g_monster_zombie_targetrange;
+float autocvar_g_monster_zombie_turnspeed;
+float autocvar_g_monsters;
var float autocvar_g_movement_highspeed = 1;
+float autocvar_g_multijump;
+float autocvar_g_multijump_add;
+float autocvar_g_multijump_speed;
+string autocvar_g_mutatormsg;
+float autocvar_g_nexball_basketball_bouncefactor;
+float autocvar_g_nexball_basketball_bouncestop;
+float autocvar_g_nexball_basketball_carrier_highspeed;
+float autocvar_g_nexball_basketball_meter;
+float autocvar_g_nexball_basketball_meter_maxpower;
+float autocvar_g_nexball_basketball_meter_minpower;
+float autocvar_g_nexball_delay_collect;
+float autocvar_g_nexball_delay_goal;
+float autocvar_g_nexball_delay_start;
+float autocvar_g_nexball_football_bouncefactor;
+float autocvar_g_nexball_football_bouncestop;
+float autocvar_g_nexball_goalleadlimit;
+#define autocvar_g_nexball_goallimit cvar("g_nexball_goallimit")
+float autocvar_g_nexball_radar_showallplayers;
+float autocvar_g_nexball_sound_bounce;
+float autocvar_g_nexball_trail_color;
+float autocvar_g_nick_flood_penalty;
+float autocvar_g_nick_flood_penalty_red;
+float autocvar_g_nick_flood_penalty_yellow;
+float autocvar_g_nick_flood_timeout;
+float autocvar_g_nix_with_healtharmor;
+float autocvar_g_nix_with_laser;
+float autocvar_g_nix_with_powerups;
+float autocvar_g_nodepthtestitems;
+float autocvar_g_nodepthtestplayers;
+float autocvar_g_norecoil;
+float autocvar_g_onslaught_cp_buildhealth;
+float autocvar_g_onslaught_cp_buildtime;
+float autocvar_g_onslaught_cp_health;
+float autocvar_g_onslaught_cp_regen;
+float autocvar_g_onslaught_gen_health;
+float autocvar_g_pickup_cells_max;
+float autocvar_g_pickup_fuel_max;
+float autocvar_g_pickup_items;
+float autocvar_g_pickup_nails_max;
+float autocvar_g_pickup_rockets_max;
+float autocvar_g_pickup_shells_max;
+float autocvar_g_player_alpha;
+float autocvar_g_player_brightness;
+float autocvar_g_playerclip_collisions;
+string autocvar_g_playerstats_uri;
+float autocvar_g_playerstats_debug;
+float autocvar_g_powerup_shield;
+float autocvar_g_powerup_strength;
+float autocvar_g_powerup_superhealth;
+float autocvar_g_projectiles_newton_style;
+float autocvar_g_projectiles_newton_style_2_maxfactor;
+float autocvar_g_projectiles_newton_style_2_minfactor;
+float autocvar_g_projectiles_spread_style;
+#define autocvar_g_race_laps_limit cvar("g_race_laps_limit")
+float autocvar_g_race_qualifying_timelimit;
+float autocvar_g_race_qualifying_timelimit_override;
+float autocvar_g_race_teams;
+float autocvar_g_respawn_delay;
+float autocvar_g_respawn_ghosts;
+float autocvar_g_respawn_ghosts_maxtime;
+float autocvar_g_respawn_ghosts_speed;
+float autocvar_g_respawn_waves;
+float autocvar_g_runematch_allow_same;
+float autocvar_g_runematch_drop_runes_max;
+float autocvar_g_runematch_fixedspawns;
+float autocvar_g_runematch_frags_killed_runeholder;
+float autocvar_g_runematch_frags_killedby_runeholder;
+float autocvar_g_runematch_frags_norune;
+float autocvar_g_runematch_point_leadlimit;
+#define autocvar_g_runematch_point_limit cvar("g_runematch_point_limit")
+float autocvar_g_runematch_pointamt;
+float autocvar_g_runematch_pointrate;
+float autocvar_g_runematch_respawntime;
+float autocvar_g_runematch_rune_alpha;
+float autocvar_g_runematch_rune_color_strength;
+float autocvar_g_runematch_rune_effects;
+float autocvar_g_runematch_shuffletime;
+float autocvar_g_running_guns;
+float autocvar_g_shootfromcenter;
+float autocvar_g_shootfromclient;
+float autocvar_g_shootfromeye;
+string autocvar_g_shootfromfixedorigin;
+float autocvar_g_showweaponspawns;
+float autocvar_g_spawn_furthest;
+float autocvar_g_spawnpoints_auto_move_out_of_solid;
+#define autocvar_g_spawnshieldtime cvar("g_spawnshieldtime")
+float autocvar_g_spawnsound;
+float autocvar_g_start_delay;
+#define autocvar_g_start_weapon_laser cvar("g_start_weapon_laser")
+float autocvar_g_tdm_team_spawns;
+float autocvar_g_tdm_teams;
+float autocvar_g_tdm_teams_override;
+float autocvar_g_teamdamage_resetspeed;
+float autocvar_g_teamdamage_threshold;
+float autocvar_g_telefrags;
+float autocvar_g_telefrags_avoid;
+float autocvar_g_telefrags_teamplay;
+float autocvar_g_teleport_maxspeed;
+float autocvar_g_throughfloor_damage;
+float autocvar_g_throughfloor_force;
+float autocvar_g_triggerimpulse_accel_multiplier;
+float autocvar_g_triggerimpulse_accel_power;
+float autocvar_g_triggerimpulse_directional_multiplier;
+float autocvar_g_triggerimpulse_radial_multiplier;
+float autocvar_g_turrets;
+float autocvar_g_turrets_aimidle_delay;
+float autocvar_g_turrets_nofire;
+float autocvar_g_turrets_reloadcvars;
+float autocvar_g_turrets_targetscan_maxdelay;
+float autocvar_g_turrets_targetscan_mindelay;
+float autocvar_g_turrets_unit_ewheel_speed_fast;
+float autocvar_g_turrets_unit_ewheel_speed_slow;
+float autocvar_g_turrets_unit_ewheel_speed_slower;
+float autocvar_g_turrets_unit_ewheel_speed_stop;
+float autocvar_g_turrets_unit_ewheel_turnrate;
+float autocvar_g_turrets_unit_hellion_std_shot_speed_gain;
+float autocvar_g_turrets_unit_hellion_std_shot_speed_max;
+float autocvar_g_turrets_unit_hk_std_shot_speed;
+float autocvar_g_turrets_unit_hk_std_shot_speed_accel;
+float autocvar_g_turrets_unit_hk_std_shot_speed_accel2;
+float autocvar_g_turrets_unit_hk_std_shot_speed_decel;
+float autocvar_g_turrets_unit_hk_std_shot_speed_max;
+float autocvar_g_turrets_unit_hk_std_shot_speed_turnrate;
+float autocvar_g_turrets_unit_walker_speed_jump;
+float autocvar_g_turrets_unit_walker_speed_roam;
+float autocvar_g_turrets_unit_walker_speed_run;
+float autocvar_g_turrets_unit_walker_speed_stop;
+float autocvar_g_turrets_unit_walker_speed_swim;
+float autocvar_g_turrets_unit_walker_speed_walk;
+float autocvar_g_turrets_unit_walker_std_meele_dmg;
+float autocvar_g_turrets_unit_walker_std_meele_force;
+float autocvar_g_turrets_unit_walker_std_meele_range;
+float autocvar_g_turrets_unit_walker_std_rocket_dmg;
+float autocvar_g_turrets_unit_walker_std_rocket_force;
+float autocvar_g_turrets_unit_walker_std_rocket_radius;
+float autocvar_g_turrets_unit_walker_std_rocket_refire;
+float autocvar_g_turrets_unit_walker_std_rocket_speed;
+float autocvar_g_turrets_unit_walker_std_rocket_turnrate;
+float autocvar_g_turrets_unit_walker_std_rockets_range;
+float autocvar_g_turrets_unit_walker_std_rockets_range_min;
+float autocvar_g_use_ammunition;
+float autocvar_g_vehicle_racer_afterburn_cost;
+float autocvar_g_vehicle_racer_anglestabilizer;
+float autocvar_g_vehicle_racer_downforce;
+float autocvar_g_vehicle_racer_energy;
+float autocvar_g_vehicle_racer_energy_usepause;
+float autocvar_g_vehicle_racer_health;
+float autocvar_g_vehicle_racer_laser_cost;
+float autocvar_g_vehicle_racer_laser_damage;
+float autocvar_g_vehicle_racer_laser_radius;
+float autocvar_g_vehicle_racer_laser_refire;
+float autocvar_g_vehicle_racer_laser_speed;
+float autocvar_g_vehicle_racer_pitchspeed;
+float autocvar_g_vehicle_racer_power_air;
+float autocvar_g_vehicle_racer_power_min;
+float autocvar_g_vehicle_racer_power_solid;
+float autocvar_g_vehicle_racer_reload;
+float autocvar_g_vehicle_racer_respawntime;
+float autocvar_g_vehicle_racer_rocket_accel;
+float autocvar_g_vehicle_racer_rocket_damage;
+float autocvar_g_vehicle_racer_rocket_radius;
+float autocvar_g_vehicle_racer_rocket_refire;
+float autocvar_g_vehicle_racer_rocket_speed;
+float autocvar_g_vehicle_racer_rocket_turnrate;
+float autocvar_g_vehicle_racer_shield;
+float autocvar_g_vehicle_racer_speed_afterburn;
+float autocvar_g_vehicle_racer_speed_forward;
+float autocvar_g_vehicle_racer_speed_strafe;
+float autocvar_g_vehicle_racer_springlength;
+float autocvar_g_vehicle_racer_turnroll;
+float autocvar_g_vehicle_racer_turnspeed;
+float autocvar_g_vehicle_raptor_reload;
+float autocvar_g_vehicle_spiderbot_crush_dmg;
+float autocvar_g_vehicle_spiderbot_crush_force;
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
+float autocvar_g_vehicle_spiderbot_head_pitchspeed;
+float autocvar_g_vehicle_spiderbot_head_turnlimit;
+float autocvar_g_vehicle_spiderbot_head_turnspeed;
+float autocvar_g_vehicle_spiderbot_health;
+float autocvar_g_vehicle_spiderbot_minigun_cooldown;
+float autocvar_g_vehicle_spiderbot_minigun_damage;
+float autocvar_g_vehicle_spiderbot_minigun_heat;
+float autocvar_g_vehicle_spiderbot_minigun_refire;
+float autocvar_g_vehicle_spiderbot_minigun_spread;
+float autocvar_g_vehicle_spiderbot_movement_inertia;
+float autocvar_g_vehicle_spiderbot_respawntime;
+float autocvar_g_vehicle_spiderbot_rocket_damage;
+float autocvar_g_vehicle_spiderbot_rocket_edgedamage;
+float autocvar_g_vehicle_spiderbot_rocket_force;
+float autocvar_g_vehicle_spiderbot_rocket_health;
+float autocvar_g_vehicle_spiderbot_rocket_lifetime;
+float autocvar_g_vehicle_spiderbot_rocket_noise;
+float autocvar_g_vehicle_spiderbot_rocket_radius;
+float autocvar_g_vehicle_spiderbot_rocket_refire;
+float autocvar_g_vehicle_spiderbot_rocket_reload;
+float autocvar_g_vehicle_spiderbot_rocket_speed;
+float autocvar_g_vehicle_spiderbot_rocket_turnrate;
+float autocvar_g_vehicle_spiderbot_shield;
+float autocvar_g_vehicle_spiderbot_speed_stop;
+float autocvar_g_vehicle_spiderbot_speed_strafe;
+float autocvar_g_vehicle_spiderbot_speed_walk;
+float autocvar_g_vehicle_spiderbot_turnspeed;
+float autocvar_g_waypointeditor;
+float autocvar_g_waypoints_for_items;
+float autocvar_g_waypointsprite_deadlifetime;
+float autocvar_g_waypointsprite_deployed_lifetime;
+float autocvar_g_waypointsprite_limitedrange;
+float autocvar_g_weapon_charge_colormod_blue_full;
+float autocvar_g_weapon_charge_colormod_blue_half;
+float autocvar_g_weapon_charge_colormod_green_full;
+float autocvar_g_weapon_charge_colormod_green_half;
+float autocvar_g_weapon_charge_colormod_hdrmultiplier;
+float autocvar_g_weapon_charge_colormod_red_full;
+float autocvar_g_weapon_charge_colormod_red_half;
+#define autocvar_g_weapon_stay cvar("g_weapon_stay")
+float autocvar_g_weapon_throwable;
+#define autocvar_g_weaponarena cvar_string("g_weaponarena")
+string autocvar_g_xonoticversion;
+float autocvar_gamecfg;
+float autocvar_gameversion;
+float autocvar_gameversion_min;
+float autocvar_gameversion_max;
+string autocvar_hostname;
+float autocvar_lastlevel;
+float autocvar_leadlimit;
+float autocvar_leadlimit_and_fraglimit;
+float autocvar_leadlimit_override;
+float autocvar_loddebug;
+float autocvar_minplayers;
+string autocvar_nextmap;
+float autocvar_prvm_backtraceforwarnings;
+string autocvar_quit_and_redirect;
+float autocvar_quit_when_empty;
+float autocvar_r_showbboxes;
+float autocvar_rescan_pending;
+float autocvar_samelevel;
+#define autocvar_skill cvar("skill")
+float autocvar_skill_auto;
+#define autocvar_slowmo cvar("slowmo")
+float autocvar_snd_soundradius;
+float autocvar_spawn_debug;
+float autocvar_spawn_debugview;
+float autocvar_speedmeter;
+float autocvar_sv_accelerate;
+var float autocvar_sv_accuracy_data_share = 1;
+string autocvar_sv_adminnick;
+float autocvar_sv_airaccel_qw;
+float autocvar_sv_airaccel_sideways_friction;
+float autocvar_sv_airaccelerate;
+float autocvar_sv_aircontrol;
+float autocvar_sv_aircontrol_penalty;
+float autocvar_sv_aircontrol_power;
+float autocvar_sv_airspeedlimit_nonqw;
+float autocvar_sv_airstopaccelerate;
+float autocvar_sv_airstrafeaccel_qw;
+float autocvar_sv_airstrafeaccelerate;
+float autocvar_sv_allow_shownames;
+float autocvar_sv_autoscreenshot;
+float autocvar_sv_cheats;
+float autocvar_sv_curl_serverpackages_auto;
+float autocvar_sv_db_saveasdump;
+float autocvar_sv_defaultcharacter;
+string autocvar_sv_defaultplayercolors;
+string autocvar_sv_defaultplayermodel;
+string autocvar_sv_defaultplayermodel_blue;
+string autocvar_sv_defaultplayermodel_pink;
+string autocvar_sv_defaultplayermodel_red;
+string autocvar_sv_defaultplayermodel_yellow;
+float autocvar_sv_defaultplayerskin;
+float autocvar_sv_dodging_delay;
+float autocvar_sv_dodging_height_threshold;
+float autocvar_sv_dodging_horiz_speed;
+float autocvar_sv_dodging_ramp_time;
+float autocvar_sv_dodging_sound;
+float autocvar_sv_dodging_up_speed;
+float autocvar_sv_dodging_wall_distance_threshold;
+float autocvar_sv_dodging_wall_dodging;
+float autocvar_sv_doublejump;
+float autocvar_sv_eventlog;
+float autocvar_sv_eventlog_console;
+float autocvar_sv_eventlog_files;
+float autocvar_sv_eventlog_files_counter;
+string autocvar_sv_eventlog_files_nameprefix;
+string autocvar_sv_eventlog_files_namesuffix;
+float autocvar_sv_eventlog_files_timestamps;
+float autocvar_sv_fragmessage_information_handicap;
+float autocvar_sv_fragmessage_information_ping;
+float autocvar_sv_fragmessage_information_stats;
+float autocvar_sv_fragmessage_information_typefrag;
+float autocvar_sv_friction;
+float autocvar_sv_friction_on_land;
+float autocvar_sv_gameplayfix_q2airaccelerate;
+#define autocvar_sv_gravity cvar("sv_gravity")
+string autocvar_sv_intermission_cdtrack;
+string autocvar_sv_jumpspeedcap_max;
+float autocvar_sv_jumpspeedcap_max_disable_on_ramps;
+string autocvar_sv_jumpspeedcap_min;
+float autocvar_sv_jumpvelocity;
+float autocvar_sv_logscores_bots;
+float autocvar_sv_logscores_console;
+float autocvar_sv_logscores_file;
+string autocvar_sv_logscores_filename;
+float autocvar_sv_mapchange_delay;
+float autocvar_sv_maxairspeed;
+float autocvar_sv_maxairstrafespeed;
+float autocvar_sv_maxspeed;
+string autocvar_sv_motd;
+string autocvar_sv_player_crouch_maxs;
+string autocvar_sv_player_crouch_mins;
+string autocvar_sv_player_crouch_viewoffset;
+string autocvar_sv_player_headsize;
+string autocvar_sv_player_maxs;
+string autocvar_sv_player_mins;
+string autocvar_sv_player_viewoffset;
+float autocvar_sv_precacheplayermodels;
+float autocvar_sv_precacheweapons;
+float autocvar_sv_q3acompat_machineshotgunswap;
+float autocvar_sv_qcweaponanimation;
+float autocvar_sv_ready_restart;
+float autocvar_sv_ready_restart_after_countdown;
+float autocvar_sv_ready_restart_repeatable;
+float autocvar_sv_servermodelsonly;
+float autocvar_sv_spectate;
+float autocvar_sv_spectator_speed_multiplier;
+float autocvar_sv_stepheight;
+float autocvar_sv_stopspeed;
+float autocvar_sv_strengthsound_antispam_refire_threshold;
+float autocvar_sv_strengthsound_antispam_time;
+float autocvar_sv_teamnagger;
+float autocvar_sv_timeout;
+float autocvar_sv_timeout_leadtime;
+float autocvar_sv_timeout_length;
+float autocvar_sv_timeout_number;
+float autocvar_sv_timeout_resumetime;
+float autocvar_sv_vote_call;
+float autocvar_sv_vote_change;
+string autocvar_sv_vote_commands;
+float autocvar_sv_vote_majority_factor;
+float autocvar_sv_vote_master;
+string autocvar_sv_vote_master_commands;
+string autocvar_sv_vote_master_password;
+float autocvar_sv_vote_nospectators;
+string autocvar_sv_vote_only_commands;
+float autocvar_sv_vote_override_mostrecent;
+float autocvar_sv_vote_simple_majority_factor;
+float autocvar_sv_vote_singlecount;
+float autocvar_sv_vote_stop;
+float autocvar_sv_vote_timeout;
+float autocvar_sv_vote_wait;
+float autocvar_sv_warsowbunny_accel;
+float autocvar_sv_warsowbunny_airforwardaccel;
+float autocvar_sv_warsowbunny_backtosideratio;
+float autocvar_sv_warsowbunny_topspeed;
+float autocvar_sv_warsowbunny_turnaccel;
+string autocvar_sv_weaponstats_file;
+float autocvar_sys_ticrate;
+float autocvar_teamplay_lockonrestart;
+float autocvar_teamplay_mode;
+#define autocvar_timelimit cvar("timelimit")
+#define autocvar_timelimit_override cvar("timelimit_override")
+float autocvar_timelimit_increment;
+float autocvar_timelimit_decrement;
+float autocvar_timelimit_min;
+float autocvar_timelimit_max;
+float autocvar_timelimit_overtime;
+float autocvar_timelimit_overtimes;
+float autocvar_timelimit_suddendeath;
+#define autocvar_utf8_enable cvar("utf8_enable")
+float autocvar_waypoint_benchmark;
+float autocvar_welcome_message_time;
+float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
+float autocvar_g_trueaim_minrange;
return FALSE;
}
+ if(g_freezetag)
+ if(e.freezetag_frozen)
+ return FALSE;
+
if(teams_matter)
{
if(e.team==0)
if (time >= self.bot_badaimtime)
{
self.bot_badaimtime = max(self.bot_badaimtime + 0.3, time);
- self.bot_badaimoffset = randomvec() * bound(0, 5 - 0.5 * (skill+self.bot_offsetskill), 5) * cvar("bot_ai_aimskill_offset");
+ self.bot_badaimoffset = randomvec() * bound(0, 5 - 0.5 * (skill+self.bot_offsetskill), 5) * autocvar_bot_ai_aimskill_offset;
}
desiredang = vectoangles(v) + self.bot_badaimoffset;
//dprint(" desired:", vtos(desiredang));
self.bot_prevaimtime = time;
// Here we will try to anticipate the comming aiming direction
self.bot_1st_order_aimfilter= self.bot_1st_order_aimfilter
- + (diffang * (1 / delta_t) - self.bot_1st_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_1st"),1);
+ + (diffang * (1 / delta_t) - self.bot_1st_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_1st,1);
self.bot_2nd_order_aimfilter= self.bot_2nd_order_aimfilter
- + (self.bot_1st_order_aimfilter - self.bot_2nd_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_2nd"),1);
+ + (self.bot_1st_order_aimfilter - self.bot_2nd_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_2nd,1);
self.bot_3th_order_aimfilter= self.bot_3th_order_aimfilter
- + (self.bot_2nd_order_aimfilter - self.bot_3th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_3th"),1);
+ + (self.bot_2nd_order_aimfilter - self.bot_3th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_3th,1);
self.bot_4th_order_aimfilter= self.bot_4th_order_aimfilter
- + (self.bot_3th_order_aimfilter - self.bot_4th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_4th"),1);
+ + (self.bot_3th_order_aimfilter - self.bot_4th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_4th,1);
self.bot_5th_order_aimfilter= self.bot_5th_order_aimfilter
- + (self.bot_4th_order_aimfilter - self.bot_5th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_5th"),1);
+ + (self.bot_4th_order_aimfilter - self.bot_5th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_5th,1);
//blend = (bound(0,skill,10)*0.1)*pow(1-bound(0,skill,10)*0.05,2.5)*5.656854249; //Plot formule before changing !
blend = bound(0,skill+self.bot_aimskill,10)*0.1;
desiredang = desiredang + blend *
(
- self.bot_1st_order_aimfilter * cvar("bot_ai_aimskill_order_mix_1st")
- + self.bot_2nd_order_aimfilter * cvar("bot_ai_aimskill_order_mix_2nd")
- + self.bot_3th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_3th")
- + self.bot_4th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_4th")
- + self.bot_5th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_5th")
+ self.bot_1st_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_1st
+ + self.bot_2nd_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_2nd
+ + self.bot_3th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_3th
+ + self.bot_4th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_4th
+ + self.bot_5th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_5th
);
// calculate turn angles
diffang_y = diffang_y - floor(diffang_y / 360) * 360;
if (diffang_y >= 180)
diffang_y = diffang_y - 360;
- desiredang = desiredang + diffang * bound(0,cvar("bot_ai_aimskill_think"),1);
+ desiredang = desiredang + diffang * bound(0,autocvar_bot_ai_aimskill_think,1);
// calculate turn angles
diffang = desiredang - self.v_angle;
// turn
local float r, fixedrate, blendrate;
- fixedrate = cvar("bot_ai_aimskill_fixedrate") / bound(1,dist,1000);
- blendrate = cvar("bot_ai_aimskill_blendrate");
+ fixedrate = autocvar_bot_ai_aimskill_fixedrate / bound(1,dist,1000);
+ blendrate = autocvar_bot_ai_aimskill_blendrate;
r = max(fixedrate, blendrate);
//self.v_angle = self.v_angle + diffang * bound(frametime, r * frametime * (2+skill*skill*0.05-random()*0.05*(10-skill)), 1);
self.v_angle = self.v_angle + diffang * bound(delta_t, r * delta_t * (2+pow(skill+self.bot_mouseskill,3)*0.005-random()), 1);
- self.v_angle = self.v_angle * bound(0,cvar("bot_ai_aimskill_mouse"),1) + desiredang * bound(0,(1-cvar("bot_ai_aimskill_mouse")),1);
+ self.v_angle = self.v_angle * bound(0,autocvar_bot_ai_aimskill_mouse,1) + desiredang * bound(0,(1-autocvar_bot_ai_aimskill_mouse),1);
//self.v_angle = self.v_angle + diffang * bound(0, r * frametime * (skill * 0.5 + 2), 1);
//self.v_angle = self.v_angle + diffang * (1/ blendrate);
self.v_angle_z = 0;
shotdir = v_forward;
v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency);
local float distanceratio;
- distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/cvar("bot_ai_aimskill_firetolerance_distdegrees");
+ distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
distanceratio = bound(0,distanceratio,1);
- r = (cvar("bot_ai_aimskill_firetolerance_maxdegrees")-cvar("bot_ai_aimskill_firetolerance_mindegrees"))
- * (1-distanceratio) + cvar("bot_ai_aimskill_firetolerance_mindegrees");
+ r = (autocvar_bot_ai_aimskill_firetolerance_maxdegrees-autocvar_bot_ai_aimskill_firetolerance_mindegrees)
+ * (1-distanceratio) + autocvar_bot_ai_aimskill_firetolerance_mindegrees;
if (applygravity && self.bot_aimtarg)
{
if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self))
{
f = bot_aimdir(v - shotorg, r);
//dprint("AIM: ");dprint(vtos(self.bot_aimtargorigin));dprint(" + ");dprint(vtos(self.bot_aimtargvelocity));dprint(" * ");dprint(ftos(self.bot_aimlatency + vlen(self.bot_aimtargorigin - shotorg) / shotspeed));dprint(" = ");dprint(vtos(v));dprint(" : aimdir = ");dprint(vtos(normalize(v - shotorg)));dprint(" : ");dprint(vtos(shotdir));dprint("\n");
- traceline(shotorg, shotorg + shotdir * 10000, FALSE, self);
- if (trace_ent.takedamage)
- if (trace_fraction < 1)
- if (!bot_shouldattack(trace_ent))
- return FALSE;
+ //traceline(shotorg, shotorg + shotdir * 10000, FALSE, self);
+ //if (trace_ent.takedamage)
+ //if (trace_fraction < 1)
+ //if (!bot_shouldattack(trace_ent))
+ // return FALSE;
traceline(shotorg, self.bot_aimtargorigin, FALSE, self);
if (trace_fraction < 1)
if (trace_ent != self.enemy)
if (!bot_shouldattack(trace_ent))
return FALSE;
}
- if (r > maxshottime * shotspeed)
- return FALSE;
- return f;
+
+ //if (r > maxshottime * shotspeed)
+ // return FALSE;
+ return TRUE;
};
return;
self.flags &~= FL_GODMODE;
- if(cvar("bot_god"))
+ if(autocvar_bot_god)
self.flags |= FL_GODMODE;
- self.bot_nextthink = self.bot_nextthink + cvar("bot_ai_thinkinterval") * pow(0.5, self.bot_aiskill);
+ self.bot_nextthink = self.bot_nextthink + autocvar_bot_ai_thinkinterval * pow(0.5, self.bot_aiskill);
//if (self.bot_painintensity > 0)
// self.bot_painintensity = self.bot_painintensity - (skill + 1) * 40 * frametime;
//self.bot_painintensity = self.bot_painintensity + self.bot_oldhealth - self.health;
//self.bot_painintensity = bound(0, self.bot_painintensity, 100);
- if (cvar("g_campaign") && !campaign_bots_may_start)
+ if (autocvar_g_campaign && !campaign_bots_may_start)
{
self.nextthink = time + 0.5;
return;
string bot_name, bot_model, bot_skin, bot_shirt, bot_pants;
string name, prefix, suffix;
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
{
prefix = "";
suffix = "";
}
else
{
- prefix = cvar_string("bot_prefix");
- suffix = cvar_string("bot_suffix");
+ prefix = autocvar_bot_prefix;
+ suffix = autocvar_bot_suffix;
}
- file = fopen(cvar_string("bot_config_file"), FILE_READ);
+ file = fopen(autocvar_bot_config_file, FILE_READ);
if(file < 0)
- print(strcat("Error: Can not open the bot configuration file '",cvar_string("bot_config_file"),"'\n"));
+ print(strcat("Error: Can not open the bot configuration file '",autocvar_bot_config_file,"'\n"));
else
{
RandomSelection_Init();
prio = 6;
- #define READSKILL(f,w,r) if(argv(prio) != "") self.f = stof(argv(prio)) * (w); else self.f = (!cvar("g_campaign")) * (2 * random() - 1) * (r) * (w); ++prio
+ #define READSKILL(f,w,r) if(argv(prio) != "") self.f = stof(argv(prio)) * (w); else self.f = (!autocvar_g_campaign) * (2 * random() - 1) * (r) * (w); ++prio
//print(bot_name, ": ping=", argv(9), "\n");
READSKILL(havocbot_keyboardskill, 0.5, 0.5); // keyboard skill
self.bot_preferredcolors = self.clientcolors;
// pick the name
- if (cvar("bot_usemodelnames"))
+ if (autocvar_bot_usemodelnames)
name = bot_model;
else
name = bot_name;
bot_custom_weapon = FALSE;
- if( cvar_string("bot_ai_custom_weapon_priority_far") == "" ||
- cvar_string("bot_ai_custom_weapon_priority_mid") == "" ||
- cvar_string("bot_ai_custom_weapon_priority_close") == "" ||
- cvar_string("bot_ai_custom_weapon_priority_distances") == ""
+ if( autocvar_bot_ai_custom_weapon_priority_far == "" ||
+ autocvar_bot_ai_custom_weapon_priority_mid == "" ||
+ autocvar_bot_ai_custom_weapon_priority_close == "" ||
+ autocvar_bot_ai_custom_weapon_priority_distances == ""
)
return;
// Parse distances
- tokens = tokenizebyseparator(cvar_string("bot_ai_custom_weapon_priority_distances")," ");
+ tokens = tokenizebyseparator(autocvar_bot_ai_custom_weapon_priority_distances," ");
if (tokens!=2)
return;
bot_weapons_close[0] = -1;
// Parse far distance weapon priorities
- tokens = tokenizebyseparator(W_NumberWeaponOrder(cvar_string("bot_ai_custom_weapon_priority_far"))," ");
+ tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_far)," ");
c = 0;
for(i=0; i < tokens && c < WEP_COUNT; ++i){
bot_weapons_far[c] = -1;
// Parse mid distance weapon priorities
- tokens = tokenizebyseparator(W_NumberWeaponOrder(cvar_string("bot_ai_custom_weapon_priority_mid"))," ");
+ tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_mid)," ");
c = 0;
for(i=0; i < tokens && c < WEP_COUNT; ++i){
bot_weapons_mid[c] = -1;
// Parse close distance weapon priorities
- tokens = tokenizebyseparator(W_NumberWeaponOrder(cvar_string("bot_ai_custom_weapon_priority_close"))," ");
+ tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_close)," ");
c = 0;
for(i=0; i < tokens && i < WEP_COUNT; ++i){
}
else if(bestbot <= bestplayer * factor - 2)
{
- if(cvar("skill") < 17)
+ if(autocvar_skill < 17)
{
dprint("2 frags difference, increasing skill\n");
- cvar_set("skill", ftos(cvar("skill") + 1));
- bprint("^2SKILL UP!^7 Now at level ", ftos(cvar("skill")), "\n");
+ cvar_set("skill", ftos(autocvar_skill + 1));
+ bprint("^2SKILL UP!^7 Now at level ", ftos(autocvar_skill), "\n");
}
}
else if(bestbot >= bestplayer * factor + 2)
{
- if(cvar("skill") > 0)
+ if(autocvar_skill > 0)
{
dprint("2 frags difference, decreasing skill\n");
- cvar_set("skill", ftos(cvar("skill") - 1));
- bprint("^1SKILL DOWN!^7 Now at level ", ftos(cvar("skill")), "\n");
+ cvar_set("skill", ftos(autocvar_skill - 1));
+ bprint("^1SKILL DOWN!^7 Now at level ", ftos(autocvar_skill), "\n");
}
}
else
if (time < 2)
return;
- stepheightvec = cvar("sv_stepheight") * '0 0 1';
- bot_navigation_movemode = ((cvar("bot_navigation_ignoreplayers")) ? MOVE_NOMONSTERS : MOVE_NORMAL);
+ stepheightvec = autocvar_sv_stepheight * '0 0 1';
+ bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
if(time > autoskill_nextthink)
{
float a;
- a = cvar("skill_auto");
+ a = autocvar_skill_auto;
if(a)
autoskill(a);
autoskill_nextthink = time + 5;
// But don't remove bots immediately on level change, as the real players
// usually haven't rejoined yet
bots_would_leave = FALSE;
- if (teamplay && cvar("bot_vs_human") && (c3==-1 && c4==-1))
- bots = min(ceil(fabs(cvar("bot_vs_human")) * activerealplayers), maxclients - realplayers);
- else if ((realplayers || cvar("bot_join_empty") || (currentbots > 0 && time < 5)))
+ if (teams_matter && autocvar_bot_vs_human && (c3==-1 && c4==-1))
+ bots = min(ceil(fabs(autocvar_bot_vs_human) * activerealplayers), maxclients - realplayers);
+ else if ((realplayers || autocvar_bot_join_empty || (currentbots > 0 && time < 5)))
{
float realminplayers, minplayers;
- realminplayers = cvar("minplayers");
+ realminplayers = autocvar_minplayers;
minplayers = max(0, floor(realminplayers));
float realminbots, minbots;
- realminbots = cvar("bot_number");
+ realminbots = autocvar_bot_number;
minbots = max(0, floor(realminbots));
bots = min(max(minbots, minplayers - activerealplayers), maxclients - realplayers);
bots = 0;
}
- bot_ignore_bots = cvar("bot_ignore_bots");
+ bot_ignore_bots = autocvar_bot_ignore_bots;
// only add one bot per frame to avoid utter chaos
if(time > botframe_nextthink)
if(botframe_spawnedwaypoints)
{
- if(cvar("waypoint_benchmark"))
+ if(autocvar_waypoint_benchmark)
localcmd("quit\n");
}
- if (currentbots > 0 || cvar("g_waypointeditor"))
+ if (currentbots > 0 || autocvar_g_waypointeditor)
if (botframe_spawnedwaypoints)
{
if(botframe_cachedwaypointlinks)
if (botframe_nextdangertime < time)
{
local float interval;
- interval = cvar("bot_ai_dangerdetectioninterval");
+ interval = autocvar_bot_ai_dangerdetectioninterval;
if (botframe_nextdangertime < time - interval * 1.5)
botframe_nextdangertime = time;
botframe_nextdangertime = botframe_nextdangertime + interval;
- botframe_updatedangerousobjects(cvar("bot_ai_dangerdetectionupdates"));
+ botframe_updatedangerousobjects(autocvar_bot_ai_dangerdetectionupdates);
}
}
- if (cvar("g_waypointeditor"))
+ if (autocvar_g_waypointeditor)
botframe_showwaypointlinks();
if(time > bot_cvar_nextthink)
* Imports
*/
-float sv_maxspeed;
-
void() havocbot_setupbot;
float c1, c2, c3, c4;
}
else
{
- self.havocbot_role();
+ if not(self.jumppadcount)
+ self.havocbot_role();
}
// TODO: tracewalk() should take care of this job (better path finding under water)
havocbot_chooseenemy();
if (self.bot_chooseweapontime < time )
{
- self.bot_chooseweapontime = time + cvar("bot_ai_chooseweaponinterval");
+ self.bot_chooseweapontime = time + autocvar_bot_ai_chooseweaponinterval;
havocbot_chooseweapon();
}
havocbot_aim();
if(self.weapons)
{
weapon_action(self.weapon, WR_AIM);
- if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
+ if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
{
self.BUTTON_ATCK = FALSE;
self.BUTTON_ATCK2 = FALSE;
next = self.goalstack01.origin - (self.origin + self.view_ofs);
skillblend=bound(0,(skill+self.bot_moveskill-2.5)*0.5,1); //lower skill player can't preturn
- distanceblend=bound(0,aimdistance/cvar("bot_ai_keyboard_distance"),1);
+ distanceblend=bound(0,aimdistance/autocvar_bot_ai_keyboard_distance,1);
blend = skillblend * (1-distanceblend);
//v = (now * (distanceblend) + next * (1-distanceblend)) * (skillblend) + now * (1-skillblend);
//v = now * (distanceblend) * (skillblend) + next * (1-distanceblend) * (skillblend) + now * (1-skillblend);
sk = skill + self.bot_moveskill;
- maxspeed = cvar("sv_maxspeed");
+ maxspeed = autocvar_sv_maxspeed;
if (time < self.havocbot_keyboardtime)
return;
local float trigger, trigger1;
blend = bound(0,sk*0.1,1);
- trigger = cvar("bot_ai_keyboard_treshold");
+ trigger = autocvar_bot_ai_keyboard_threshold;
trigger1 = 0 - trigger;
// categorize forward movement
if (self.havocbot_ducktime>time) self.BUTTON_CROUCH=TRUE;
keyboard = self.havocbot_keyboard;
- blend = bound(0,vlen(destorg-self.origin)/cvar("bot_ai_keyboard_distance"),1); // When getting close move with 360 degree
+ blend = bound(0,vlen(destorg-self.origin)/autocvar_bot_ai_keyboard_distance,1); // When getting close move with 360 degree
//dprint("movement ", vtos(self.movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
self.movement = self.movement + (keyboard - self.movement) * blend;
};
local vector deviation;
local float maxspeed;
- if(cvar("g_midair"))
+ if(autocvar_g_midair)
return;
// Don't jump when using some weapons
+ /*
if(self.aistatus & AI_STATUS_ATTACKING)
- if(self.weapon & WEP_CAMPINGRIFLE)
+ if(self.weapon == WEP_SNIPERRIFLE)
return;
if(self.goalcurrent.classname == "player")
return;
+ */
- maxspeed = cvar("sv_maxspeed");
+ maxspeed = autocvar_sv_maxspeed;
if(self.aistatus & AI_STATUS_DANGER_AHEAD)
{
if(self.bot_timelastseengoal)
{
// for a period of time
- if(time - self.bot_timelastseengoal > cvar("bot_ai_bunnyhop_firstjumpdelay"))
+ if(time - self.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay)
{
local float checkdistance;
checkdistance = TRUE;
// don't run if it is too close
if(self.bot_canruntogoal==0)
{
- if(bunnyhopdistance > cvar("bot_ai_bunnyhop_startdistance"))
+ if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_startdistance)
self.bot_canruntogoal = 1;
else
self.bot_canruntogoal = -1;
if(bunnyhopdistance < vlen(self.origin - self.goalstack01.origin))
if(fabs(self.goalstack01.origin_z - self.goalcurrent.origin_z) < self.maxs_z - self.mins_z)
{
- if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > cvar("bot_ai_bunnyhop_startdistance"))
+ if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > autocvar_bot_ai_bunnyhop_startdistance)
if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
{
checkdistance = FALSE;
if(checkdistance)
{
self.aistatus &~= AI_STATUS_RUNNING;
- if(bunnyhopdistance > cvar("bot_ai_bunnyhop_stopdistance"))
+ if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_stopdistance)
self.BUTTON_JUMP = TRUE;
}
else
}
// Release jump button
+ if(!cvar("sv_pogostick"))
if(self.flags & FL_ONGROUND == 0)
{
if(self.velocity_z < 0 || vlen(self.velocity)<maxspeed)
//if (self.goalentity)
// te_lightning2(self, self.origin, (self.goalentity.absmin + self.goalentity.absmax) * 0.5);
self.movement = '0 0 0';
- maxspeed = cvar("sv_maxspeed");
+ maxspeed = autocvar_sv_maxspeed;
// Jetpack navigation
if(self.goalcurrent)
dxy = self.origin - self.goalcurrent.origin; dxy_z = 0;
d = vlen(dxy);
v = vlen(self.velocity - self.velocity_z * '0 0 1');
- db = (pow(v,2) / (cvar("g_jetpack_acceleration_side") * 2)) + 100;
+ db = (pow(v,2) / (autocvar_g_jetpack_acceleration_side * 2)) + 100;
// dprint("distance ", ftos(ceil(d)), " velocity ", ftos(ceil(v)), " brake at ", ftos(ceil(db)), "\n");
if(d < db || d < 500)
{
// Handling of jump pads
if(self.jumppadcount)
{
- if(self.flags & FL_ONGROUND)
- {
- self.jumppadcount = FALSE;
- if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
- self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
- }
-
- // If got stuck on the jump pad try to reach the farther visible item
+ // If got stuck on the jump pad try to reach the farthest visible item
if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
{
if(fabs(self.velocity_z)<50)
if(newgoal)
{
self.ignoregoal = self.goalcurrent;
- self.ignoregoaltime = time + cvar("bot_ai_ignoregoal_timeout");
+ self.ignoregoaltime = time + autocvar_bot_ai_ignoregoal_timeout;
navigation_clearroute();
navigation_routetogoal(newgoal, self.origin);
self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
local float threshold;
threshold = maxspeed * 0.2;
if(fabs(self.velocity_x) < threshold && fabs(self.velocity_y) < threshold)
+ {
+ dprint("Warning: ", self.netname, " got stuck on a jumppad, trying to get out of it now\n");
self.aistatus |= AI_STATUS_OUT_JUMPPAD;
+ }
return;
}
+
+ // Don't chase players while using a jump pad
+ if(self.goalcurrent.classname=="player" || self.goalstack01.classname=="player")
+ return;
}
}
+ else if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
+ self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
// If there is a trigger_hurt right below try to use the jetpack or make a rocketjump
if(skill>6)
return;
}
- else if(self.health>cvar("g_balance_rocketlauncher_damage")*0.5)
+ else if(self.health>autocvar_g_balance_rocketlauncher_damage*0.5)
{
if(self.velocity_z < 0)
if(client_hasweapon(self, WEP_ROCKET_LAUNCHER, TRUE, FALSE))
self.switchweapon = WEP_ROCKET_LAUNCHER;
self.v_angle_x = 90;
self.BUTTON_ATCK = TRUE;
- self.rocketjumptime = time + cvar("g_balance_rocketlauncher_detonatedelay");
+ self.rocketjumptime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
return;
}
}
if(self.facingwalltime && time > self.facingwalltime)
{
self.ignoregoal = self.goalcurrent;
- self.ignoregoaltime = time + cvar("bot_ai_ignoregoal_timeout");
+ self.ignoregoaltime = time + autocvar_bot_ai_ignoregoal_timeout;
self.bot_strategytime = 0;
return;
}
// (only when the bot is on the ground or jumping intentionally)
self.aistatus &~= AI_STATUS_DANGER_AHEAD;
- if(trace_fraction == 1)
+ if(trace_fraction == 1 && self.jumppadcount == 0)
if(self.flags & FL_ONGROUND || self.aistatus & AI_STATUS_RUNNING || self.BUTTON_JUMP == TRUE)
{
// Look downwards
// Bunnyhop!
// if(self.aistatus & AI_STATUS_ROAMING)
if(self.goalcurrent)
- if(skill+self.bot_moveskill >= cvar("bot_ai_bunnyhop_skilloffset"))
+ if(skill+self.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
havocbot_bunnyhop(dir);
- if ((dir * v_up) >= cvar("sv_jumpvelocity")*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
+ if ((dir * v_up) >= autocvar_sv_jumpvelocity*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.BUTTON_JUMP=TRUE;
if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill+self.bot_dodgeskill,10);
};
local entity head, best, head2;
local float rating, bestrating, i, f;
local vector eye, v;
- if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
+ if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
{
self.enemy = world;
return;
if (self.health > 30)
{
// remain tracking him for a shot while (case he went after a small corner or pilar
- self.havocbot_chooseenemy_finished = time + cvar("bot_ai_enemydetectioninterval");
+ self.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
return;
}
// enemy isn't visible, or is far away, or we're injured severely
}
if (time < self.havocbot_chooseenemy_finished)
return;
- self.havocbot_chooseenemy_finished = time + cvar("bot_ai_enemydetectioninterval");
+ self.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
eye = self.origin + self.view_ofs;
best = world;
bestrating = 100000000;
{
v = (head.absmin + head.absmax) * 0.5;
rating = vlen(v - eye);
- if (rating<cvar("bot_ai_enemydetectionradius"))
+ if (rating<autocvar_bot_ai_enemydetectionradius)
if (bestrating > rating)
if (bot_shouldattack(head))
{
// I want to do a second scan if no enemy was found or I don't have weapons
// TODO: Perform the scan when using the rifle (requires changes on the rifle code)
- if(best || self.weapons) // || self.weapon == WEP_CAMPINGRIFLE
+ if(best || self.weapons) // || self.weapon == WEP_SNIPERRIFLE
break;
if(i)
break;
return;
// Workaround for rifle reloading (..)
- if(self.weapon == WEP_CAMPINGRIFLE)
- if(i < cvar("g_balance_campingrifle_reloadtime") + 1)
+ if(self.weapon == WEP_SNIPERRIFLE)
+ if(i < autocvar_g_balance_sniperrifle_reloadtime + 1)
return;
local float w;
- local float rocket ; rocket =-1000;
- local float nex ; nex =-1000;
- local float hagar ; hagar =-1000;
- local float grenade ; grenade =-1000;
- local float mine ; mine =-1000;
- local float electro ; electro =-1000;
- local float crylink ; crylink =-1000;
- local float uzi ; uzi =-1000;
- local float shotgun ; shotgun =-1000;
- local float campingrifle ; campingrifle =-1000;
- local float laser ; laser =-1000;
- local float minstanex ; minstanex =-1000;
- local float bestscore; bestscore = 0;
- local float bestweapon; bestweapon=self.switchweapon;
local float distance; distance=bound(10,vlen(self.origin-self.enemy.origin)-200,10000);
- local float maxdelaytime=0.5;
- local float spreadpenalty=10;
// Should it do a weapon combo?
local float af, ct, combo_time, combo;
af = ATTACK_FINISHED(self);
- ct = cvar("bot_ai_weapon_combo_threshold");
+ ct = autocvar_bot_ai_weapon_combo_threshold;
// Bots with no skill will be 4 times more slower than "godlike" bots when doing weapon combos
// Ideally this 4 should be calculated as longest_weapon_refire / bot_ai_weapon_combo_threshold
combo = FALSE;
- if(cvar("bot_ai_weapon_combo"))
+ if(autocvar_bot_ai_weapon_combo)
if(self.weapon == self.lastfiredweapon)
if(af > combo_time)
{
}
}
}
-
-#ifdef 0
- // TODO: This disabled code is not working well and got replaced by custom weapon priorities.
- // However, this logic should be refactored and moved to weapons code so each new weapon can be
- // evaluated dynamically by bots without updating the "ai" or config files. --mand1nga
- float s, distancefromfloor, currentscore;
-
-
- // Formula:
- // (Damage/Sec * Weapon spefic change to get that damage)
- // *(Time to get to target * weapon specfic hitchange bonus) / (in a time of maxdelaytime)
- // *(Spread change of hit) // if it applies
- // *(Penality for target beeing in air)
- // %weaponaddpoint
-
- traceline(self.enemy.origin,self.enemy.origin-'0 0 1000',TRUE,world);
- distancefromfloor = self.enemy.origin_z - trace_endpos_z;
-
- if (client_hasweapon(self, WEP_MINSTANEX, TRUE, FALSE))
- minstanex = (1000/cvar("g_balance_minstanex_refire")*1.0)
- * (0.5);
-
- if (client_hasweapon(self, WEP_ROCKET_LAUNCHER, TRUE, FALSE) &&
- !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_ROCKET_LAUNCHER &&
- af > combo_time
- )
- )
- rocket = (cvar("g_balance_rocketlauncher_damage")/cvar("g_balance_rocketlauncher_refire")*0.75)
- * bound(0,(cvar("g_balance_rocketlauncher_speed")/distance*maxdelaytime),1)*1.5;
-
- if (client_hasweapon(self, WEP_NEX, TRUE, FALSE) &&
- !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_NEX &&
- af > combo_time
- )
- )
- nex = (cvar("g_balance_nex_damage")/cvar("g_balance_nex_refire")*1.0)
- * (0.5);
-
- if (client_hasweapon(self, WEP_HAGAR, TRUE, FALSE) ) // &&
- // !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_HAGAR && time < self.bot_lastshot + cvar("g_balance_hagar_primary_refire") ))
- hagar = (cvar("g_balance_hagar_primary_damage")/cvar("g_balance_hagar_primary_refire")*1.0)
- * bound(0,(cvar("g_balance_hagar_primary_speed")/distance*maxdelaytime),1)*0.2;
-
- if (client_hasweapon(self, WEP_GRENADE_LAUNCHER, TRUE, FALSE) &&
- !(
- cvar("bot_ai_weapon_combo") && self.weapon == WEP_GRENADE_LAUNCHER &&
- af > combo_time
- )
- )
- grenade = (cvar("g_balance_grenadelauncher_primary_damage")/cvar("g_balance_grenadelauncher_primary_refire")*1.0)
- * bound(0,(cvar("g_balance_grenadelauncher_primary_speed")/distance*maxdelaytime),1)*1.1;
-
- if (client_hasweapon(self, WEP_MINE_LAYER, TRUE, FALSE) &&
- !(
- cvar("bot_ai_weapon_combo") && self.weapon == WEP_MINE_LAYER &&
- af > combo_time
- )
- )
- mine = (cvar("g_balance_minelayer_damage")/cvar("g_balance_minelayer_refire")*1.0)
- * bound(0,(cvar("g_balance_minelayer_speed")/distance*maxdelaytime),1)*1.1;
-
- if (client_hasweapon(self, WEP_ELECTRO, TRUE, FALSE) &&
- !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_ELECTRO &&
- af > combo_time
- )
- )
- electro = (cvar("g_balance_electro_primary_damage")/cvar("g_balance_electro_primary_refire")*0.75)
- * bound(0,(cvar("g_balance_electro_primary_speed")/distance*maxdelaytime),1)*1.0;
-
- if (client_hasweapon(self, WEP_CRYLINK, TRUE, FALSE) ) // &&
- // !( self.weapon == WEP_CRYLINK && time < self.bot_lastshot + cvar("g_balance_crylink_primary_refire") ))
- crylink = (cvar("g_balance_crylink_primary_damage")/cvar("g_balance_crylink_primary_refire")*1.0)
- * bound(0,(cvar("g_balance_crylink_primary_speed")/distance*maxdelaytime),1)*(64/(32+cvar("g_balance_crylink_primary_spread")*distance))*1.0;
-
- if (client_hasweapon(self, WEP_UZI, TRUE, FALSE) ) // &&
- // !( self.weapon == WEP_UZI && time < self.bot_lastshot + cvar("g_balance_uzi_sustained_refire") ))
- uzi = (cvar("g_balance_uzi_sustained_damage")/cvar("g_balance_uzi_sustained_refire")*1.0)
- * bound(0,32/(32+cvar("g_balance_uzi_sustained_spread")*distance),1);
-
- if (client_hasweapon(self, WEP_SHOTGUN, TRUE, FALSE) &&
- !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_SHOTGUN &&
- af > combo_time
- )
- )
- shotgun = (cvar("g_balance_shotgun_primary_damage")*cvar("g_balance_shotgun_primary_bullets")/cvar("g_balance_shotgun_primary_refire")*1.0)
- * bound(0,32/(32+cvar("g_balance_shotgun_primary_spread")*distance),1);
-
- if (client_hasweapon(self, WEP_LASER, FALSE, FALSE) &&
- !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_LASER &&
- af > combo_time
- )
- )
- laser = (cvar("g_balance_laser_primary_damage")/cvar("g_balance_laser_primary_refire")*1.0)
- * bound(0,cvar("g_balance_laser_primary_speed")/distance*maxdelaytime,1);
-
- if((self.enemy.flags & FL_ONGROUND)==FALSE){
- rocket = rocket * (1.5-bound(0, distancefromfloor/cvar("g_balance_rocketlauncher_radius" ),0.9)); //slight bigger change
- grenade = grenade * (1.5-bound(0,distancefromfloor/cvar("g_balance_grenadelauncher_primary_radius"),0.95));
- electro = electro * (1.5-bound(0,distancefromfloor/cvar("g_balance_electro_primary_radius" ),0.95));
- laser = laser * (1.5-bound(0,distancefromfloor/cvar("g_balance_laser_primary_radius" ),0.95));
- }
- /*
- dprint("Floor distance: ",ftos(distancefromfloor),"\n");
- dprint("Rocket: " , ftos(rocket ), "\n");
- dprint("Nex: " , ftos(nex ), "\n");
- dprint("Hagar: " , ftos(hagar ), "\n");
- dprint("Grenade: ", ftos(grenade ), "\n");
- dprint("Mine: " , ftos(mine ), "\n");
- dprint("Electro: ", ftos(electro ), "\n");
- dprint("Crylink: ", ftos(crylink ), "\n");
- dprint("Uzi: " , ftos(uzi ), "\n");
- dprint("Shotgun :", ftos(shotgun ), "\n");
- dprint("Laser :", ftos(laser ), "\n\n");
- */
- currentscore = -1;
- w = WEP_MINSTANEX ;s = minstanex;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_ROCKET_LAUNCHER ;s = rocket ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_NEX ;s = nex ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_HAGAR ;s = hagar ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_GRENADE_LAUNCHER ;s = grenade ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_MINE_LAYER ;s = mine ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_ELECTRO ;s = electro ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_CRYLINK ;s = crylink ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_UZI ;s = uzi ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_SHOTGUN ;s = shotgun ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
- w = WEP_LASER ;s = laser ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
-
- // switch if the best weapon would provide a significant damage increase
- if (bestscore > currentscore*1.5){
- self.switchweapon = bestweapon;
-
- // buys time for detonating the rocket. not tested yet
- if ( cvar("bot_ai_weapon_combo") && bestweapon == WEP_ROCKET_LAUNCHER )
- self.bot_chooseweapontime += (distance / cvar("g_balance_rocketlauncher_speed"));
- }
-#endif
};
void havocbot_aim()
{
// LordHavoc: disabled because this is too expensive
return '0 0 0';
- /*
+#if 0
local entity head;
local vector dodge, v, n;
local float danger, bestdanger, vl, d;
if (head.owner != self)
{
vl = vlen(head.velocity);
- if (vl > sv_maxspeed * 0.3)
+ if (vl > autocvar_sv_maxspeed * 0.3)
{
n = normalize(head.velocity);
v = self.origin - head.origin;
head = head.chain;
}
return dodge;
- */
+#endif
};
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_ctf_ourbase(50000);
// Chase the flag carrier
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_ctf_enemyflag(30000);
havocbot_goalrating_ctf_ourstolenflag(40000);
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_ctf_ourstolenflag(50000);
havocbot_goalrating_ctf_enemybase(20000);
local float radius;
radius = 10000;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_ctf_ourstolenflag(50000);
havocbot_goalrating_ctf_droppedflags(40000, self.origin, radius);
org = havocbot_ctf_middlepoint;
org_z = self.origin_z;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_ctf_ourstolenflag(50000);
havocbot_goalrating_ctf_droppedflags(30000, self.origin, 10000);
org = mf.dropped_origin;
radius = havocbot_ctf_middlepoint_radius;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
// if enemies are closer to our base, go there
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
if(kh_Key_AllOwnedByWhichTeam() == self.team)
if (self.bot_strategytime < time)
{
float key_owner_team;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
key_owner_team = kh_Key_AllOwnedByWhichTeam();
{
float key_owner_team;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
key_owner_team = kh_Key_AllOwnedByWhichTeam();
{
float key_owner_team;
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
key_owner_team = kh_Key_AllOwnedByWhichTeam();
needarmor = TRUE;
// Needs weapons?
- for(i = WEP_FIRST; i < WEP_LAST ; ++i)
+ for(i = WEP_FIRST; i <= WEP_LAST ; ++i)
{
// Find weapon
if(power2of(i-1) & self.weapons)
havocbot_goalrating_ons_offenseitems(10000, self.origin, 10000);
navigation_goalrating_end();
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
}
};
// Rate the item only if no one needs it, or if an enemy is closer to it
if ( (enemy_distance < friend_distance && distance < enemy_distance) ||
- (friend_distance > cvar("bot_ai_friends_aware_pickup_radius") ) || !discard )
+ (friend_distance > autocvar_bot_ai_friends_aware_pickup_radius ) || !discard )
rating = head.bot_pickupevalfunc(self, head);
}
local float t, noteam, distance;
noteam = ((self.team == 0) || !teams_matter); // fteqcc sucks
- if (cvar("bot_nofire"))
+ if (autocvar_bot_nofire)
return;
// don't chase players if we're under water
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_controlpoints(10000, self.origin, 15000);
havocbot_goalrating_items(8000, self.origin, 8000);
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
havocbot_goalrating_items(10000, self.origin, 10000);
havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
entity e;
if (self.bot_strategytime < time)
{
- self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
navigation_goalrating_start();
/*
havocbot_goalrating_items(100, self.origin, 10000);
}
};
+// Keepaway
+// If you don't have the ball, get it; if you do, kill people.
+void havocbot_role_ka()
+{
+ if(self.deadflag != DEAD_NO)
+ return;
+
+ if (self.bot_strategytime < time)
+ {
+ self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+ navigation_goalrating_start();
+ havocbot_goalrating_items(10000, self.origin, 10000);
+ havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+ //havocbot_goalrating_waypoints(1, self.origin, 1000);
+ navigation_goalrating_end();
+ }
+}
+
void havocbot_chooserole_dm()
{
self.havocbot_role = havocbot_role_dm;
self.havocbot_role = havocbot_role_dom;
};
+void havocbot_chooserole_ka()
+{
+ self.havocbot_role = havocbot_role_ka;
+}
+
void havocbot_chooserole()
{
dprint("choosing a role...\n");
- navigation_clearroute();
self.bot_strategytime = 0;
if (g_ctf)
havocbot_chooserole_ctf();
havocbot_chooserole_race();
else if (g_onslaught)
havocbot_chooserole_ons();
+ else if (g_keepaway)
+ havocbot_chooserole_ka();
else // assume anything else is deathmatch
havocbot_chooserole_dm();
};
// Evaluate path using jetpack
if(g_jetpack)
if(self.items & IT_JETPACK)
- if(cvar("bot_ai_navigation_jetpack"))
- if(vlen(self.origin - e.origin) > cvar("bot_ai_navigation_jetpack_mindistance"))
+ if(autocvar_bot_ai_navigation_jetpack)
+ if(vlen(self.origin - e.origin) > autocvar_bot_ai_navigation_jetpack_mindistance)
{
vector pointa, pointb;
xydistance = vlen(pointa - pointb);
zdistance = fabs(pointa_z - self.origin_z);
- t = zdistance / cvar("g_jetpack_maxspeed_up");
- t += xydistance / cvar("g_jetpack_maxspeed_side");
- fuel = t * cvar("g_jetpack_fuel") * 0.8;
+ t = zdistance / autocvar_g_jetpack_maxspeed_up;
+ t += xydistance / autocvar_g_jetpack_maxspeed_side;
+ fuel = t * autocvar_g_jetpack_fuel * 0.8;
// dprint("jetpack ai: required fuel ", ftos(fuel), " self.ammo_fuel ", ftos(self.ammo_fuel),"\n");
// (as onground costs calculation is mostly based on distances, here we do the same establishing some relationship
// - between air and ground speeds)
- cost = xydistance / (cvar("g_jetpack_maxspeed_side")/cvar("sv_maxspeed"));
- cost += zdistance / (cvar("g_jetpack_maxspeed_up")/cvar("sv_maxspeed"));
+ cost = xydistance / (autocvar_g_jetpack_maxspeed_side/autocvar_sv_maxspeed);
+ cost += zdistance / (autocvar_g_jetpack_maxspeed_up/autocvar_sv_maxspeed);
cost *= 1.5;
// Compare against other goals
self.navigation_jetpack_goal = world;
navigation_bestrating = -1;
self.navigation_hasgoals = FALSE;
+ navigation_clearroute();
navigation_bestgoal = world;
navigation_markroutes(world);
};
return FALSE;
if(self.bot_cmd_keys & BOT_CMD_KEY_FORWARD)
- self.movement_x = cvar("sv_maxspeed");
+ self.movement_x = autocvar_sv_maxspeed;
else if(self.bot_cmd_keys & BOT_CMD_KEY_BACKWARD)
- self.movement_x = -cvar("sv_maxspeed");
+ self.movement_x = -autocvar_sv_maxspeed;
if(self.bot_cmd_keys & BOT_CMD_KEY_RIGHT)
- self.movement_y = cvar("sv_maxspeed");
+ self.movement_y = autocvar_sv_maxspeed;
else if(self.bot_cmd_keys & BOT_CMD_KEY_LEFT)
- self.movement_y = -cvar("sv_maxspeed");
+ self.movement_y = -autocvar_sv_maxspeed;
if(self.bot_cmd_keys & BOT_CMD_KEY_JUMP)
self.BUTTON_JUMP = TRUE;
}
else
{
- if(cvar("g_debug_bot_commands"))
+ if(autocvar_g_debug_bot_commands)
{
local string parms;
}
else
{
- if(cvar("developer"))
+ if(autocvar_developer)
{
print("A generated waypoint is stuck in solid at ", vtos(w.origin), "\n");
backtrace("Waypoint stuck");
waypoint_clearlinks(w);
//waypoint_schedulerelink(w);
- if (cvar("g_waypointeditor"))
+ if (autocvar_g_waypointeditor)
{
m1 = w.mins;
m2 = w.maxs;
local entity e;
local vector sv, sm1, sm2, ev, em1, em2, dv;
- stepheightvec = cvar("sv_stepheight") * '0 0 1';
- bot_navigation_movemode = ((cvar("bot_navigation_ignoreplayers")) ? MOVE_NOMONSTERS : MOVE_NORMAL);
+ stepheightvec = autocvar_sv_stepheight * '0 0 1';
+ bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
//dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n");
sm1 = self.origin + self.mins;
if (wp == world)
return;
// TODO: add some sort of visible box in edit mode for box waypoints
- if (cvar("g_waypointeditor"))
+ if (autocvar_g_waypointeditor)
{
local vector m1, m2;
m1 = wp.mins;
{
float baseskill;
string title;
- if(cvar("sv_cheats"))
+ if(autocvar_sv_cheats)
{
CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))");
return;
}
- campaign_level = cvar("_campaign_index");
- campaign_name = strzone(cvar_string("_campaign_name"));
+ campaign_level = autocvar__campaign_index;
+ campaign_name = strzone(autocvar__campaign_name);
campaign_index_var = strzone(strcat("g_campaign", campaign_name, "_index"));
CampaignFile_Load(campaign_level, 2);
if(campaign_entries < 1)
return;
}
- baseskill = cvar("g_campaign_skill");
+ baseskill = autocvar_g_campaign_skill;
baseskill = baseskill + campaign_botskill[0];
if(baseskill < 0)
baseskill = 0;
// copy sv_gravity cvar, as the engine needs it too (sorry, this will mess
// with the menu a little still...)
- cvar_set_normal("sv_gravity", cvar_string("sv_gravity"));
+ cvar_set_normal("sv_gravity", ftos(autocvar_sv_gravity));
if(Campaign_Invalid())
return;
if(won == 1 && lost == 0 && checkrules_equality == 0 && cheatcount_total == 0)
{
- if(cvar("timelimit") != 0 && time > cvar("timelimit") * 60) // checks if the timelimit has expired.
+ if(autocvar_timelimit != 0 && autocvar_fraglimit != 0 && time > autocvar_timelimit * 60) // checks if the timelimit has expired.
{
campaign_won = 0;
bprint("Time's up! The current level has been LOST.\n");
}
else
{
- campaign_won = 1;
- bprint("The current level has been WON.\n");
- // sound!
+ campaign_won = 1;
+ bprint("The current level has been WON.\n");
+ // sound!
}
}
- else if(cvar("timelimit") != 0 && time > cvar("timelimit") * 60)
+ else if(autocvar_timelimit != 0 && time > autocvar_timelimit * 60)
{
campaign_won = 0;
bprint("Time's up! The current level has been LOST.\n");
#else
.float maycheat;
-float sv_cheats;
+float gamestart_sv_cheats;
#define CHIMPULSE_SPEEDRUN_INIT 30
#define CHIMPULSE_GIVE_ALL 99
void CheatInit()
{
- sv_cheats = cvar("sv_cheats");
+ gamestart_sv_cheats = autocvar_sv_cheats;
}
void CheatShutdown()
return 1;
// sv_cheats
- if(sv_cheats && autocvar_sv_cheats)
+ if(gamestart_sv_cheats && autocvar_sv_cheats)
return 1;
// if we get here, player is not allowed to cheat. Log it.
self.health = start_health;
self.armorvalue = start_armorvalue;
self.weapons |= weaponsInMap;
- self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
- self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
- self.pauserotfuel_finished = time + cvar("g_balance_pause_fuel_rot_spawn");
- self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
+ self.pauserotarmor_finished = time + autocvar_g_balance_pause_armor_rot_spawn;
+ self.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot_spawn;
+ self.pauserotfuel_finished = time + autocvar_g_balance_pause_fuel_rot_spawn;
+ self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen_spawn;
self.strength_finished = 0;
self.invincible_finished = 0;
}
break;
case CHIMPULSE_TELEPORT:
IS_CHEAT(i, 0, 0);
- if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((sv_cheats >= 2) ? 100000 : 100), 1024, 256))
+ if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((gamestart_sv_cheats >= 2) ? 100000 : 100), 1024, 256))
{
self.angles_x = -self.angles_x;
self.fixangle = TRUE;
// arguments:
// effectname
effectnum = particleeffectnum(argv(1));
- W_SetupShot(self, FALSE, FALSE, "",0);
+ W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
traceline(w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, MOVE_NORMAL, self);
trailparticles(self, effectnum, w_shotorg, trace_endpos);
DID_CHEAT();
// arguments:
// modelname mode
f = stof(argv(2));
- W_SetupShot(self, FALSE, FALSE, "", 0);
+ W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
traceline(w_shotorg, w_shotorg + w_shotdir * 2048, MOVE_NORMAL, self);
if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || trace_fraction == 1)
{
break;
case "warp":
IS_CHEAT(0, argc, 0);
- if(argc == 2) if(cvar("g_campaign"))
+ if(argc == 2) if(autocvar_g_campaign)
{
CampaignLevelWarp(stof(argv(1)));
DID_CHEAT();
+float autocvar_sv_cheats; // must... declare... global
+
float cheatcount_total;
.float cheatcount;
void CheatInit();
void race_SendRankings(float pos, float prevpos, float del, float msg);
void send_CSQC_teamnagger() {
- WriteByte(0, SVC_TEMPENTITY);
- WriteByte(0, TE_CSQC_TEAMNAGGER);
-}
-
-void send_CSQC_cr_maxbullets(entity e) {
- msg_entity = e;
- WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_CR_MAXBULLETS);
- WriteByte(MSG_ONE, cvar("g_balance_campingrifle_magazinecapacity"));
+ WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
+ WriteByte(MSG_BROADCAST, TE_CSQC_TEAMNAGGER);
}
void Announce(string snd) {
{
spot.spawnpoint_score = Spawn_Score(spot, playerlist, teamcheck, anypoint);
- if(cvar("spawn_debugview"))
+ if(autocvar_spawn_debugview)
{
setmodel(spot, "models/runematch/rune.mdl");
if(spot.spawnpoint_score_y < mindist)
firstspot = firstspot_new;
spot = Spawn_WeightedPoint(firstspot, 1, 1, 1);
}
- else if (random() > cvar("g_spawn_furthest"))
+ else if (random() > autocvar_g_spawn_furthest)
spot = Spawn_WeightedPoint(firstspot, 1, 1, 1);
else
spot = Spawn_WeightedPoint(firstspot, 1, 5000, 5); // chooses a far far away spawnpoint
}
- if(cvar("spawn_debugview"))
+ if(autocvar_spawn_debugview)
{
print("spot mindistance: ", vtos(spot.spawnpoint_score), "\n");
if (!spot)
{
- if(cvar("spawn_debug"))
+ if(autocvar_spawn_debug)
GotoNextMap();
else
{
return FallbackPlayerModel;
if( substring(plyermodel,0,14) != "models/player/")
return FallbackPlayerModel;
- else if(cvar("sv_servermodelsonly"))
+ else if(autocvar_sv_servermodelsonly)
{
if(substring(plyermodel,-4,4) != ".zym")
if(substring(plyermodel,-4,4) != ".dpm")
}
DropAllRunes(self);
+ MUTATOR_CALLHOOK(MakePlayerObserver);
Portal_ClearAll(self);
+ if(self.alivetime)
+ {
+ PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+ self.alivetime = 0;
+ }
+
if(self.flagcarried)
DropFlag(self.flagcarried, world, world);
- if(self.ballcarried)
+ if(self.ballcarried && g_nexball)
DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
WaypointSprite_PlayerDead();
PlayerScore_Clear(self); // clear scores when needed
+ accuracy_resend(self);
+
self.spectatortime = time;
self.classname = "observer";
self.flags = FL_CLIENT | FL_NOTARGET;
self.armorvalue = 666;
self.effects = 0;
- self.armorvalue = cvar("g_balance_armor_start");
+ self.armorvalue = autocvar_g_balance_armor_start;
self.pauserotarmor_finished = 0;
self.pauserothealth_finished = 0;
self.pauseregen_finished = 0;
}
else
self.frags = FRAGS_SPECTATOR;
-
- MUTATOR_CALLHOOK(MakePlayerObserver);
-}
-
-float RestrictSkin(float s)
-{
- if(!teams_matter)
- return s;
- if(s == 6)
- return 6;
- return mod(s, 3);
}
void FixPlayermodel()
defaultmodel = "";
- if(cvar("sv_defaultcharacter") == 1) {
+ if(autocvar_sv_defaultcharacter == 1) {
defaultskin = 0;
if(teams_matter)
if(defaultmodel == "")
{
- defaultmodel = cvar_string("sv_defaultplayermodel");
- defaultskin = cvar("sv_defaultplayerskin");
+ defaultmodel = autocvar_sv_defaultplayermodel;
+ defaultskin = autocvar_sv_defaultplayerskin;
}
}
}
oldskin = self.skinindex;
- self.skinindex = RestrictSkin(stof(self.playerskin));
+ self.skinindex = stof(self.playerskin);
}
if(chmdl || oldskin != self.skinindex)
self.species = player_getspecies(); // model or skin has changed
if(!teams_matter)
- if(strlen(cvar_string("sv_defaultplayercolors")))
- if(self.clientcolors != cvar("sv_defaultplayercolors"))
- setcolor(self, cvar("sv_defaultplayercolors"));
+ if(strlen(autocvar_sv_defaultplayercolors))
+ if(self.clientcolors != stof(autocvar_sv_defaultplayercolors))
+ setcolor(self, stof(autocvar_sv_defaultplayercolors));
}
void PlayerTouchExplode(entity p1, entity p2)
entity spot, oldself;
float j;
+ accuracy_resend(self);
+
if(self.team < 0)
JoinBestTeam(self, FALSE, TRUE);
self.movetype = MOVETYPE_WALK;
self.solid = SOLID_SLIDEBOX;
self.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID;
- if(cvar("g_playerclip_collisions"))
+ if(autocvar_g_playerclip_collisions)
self.dphitcontentsmask |= DPCONTENTS_PLAYERCLIP;
- if(clienttype(self) == CLIENTTYPE_BOT && cvar("g_botclip_collisions"))
+ if(clienttype(self) == CLIENTTYPE_BOT && autocvar_g_botclip_collisions)
self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
self.frags = FRAGS_PLAYER;
if(independent_players)
self.effects = 0;
self.air_finished = time + 12;
self.dmg = 2;
- if(cvar("g_balance_nex_charge"))
- self.nex_charge = cvar("g_balance_nex_charge_start");
+ if(autocvar_g_balance_nex_charge)
+ {
+ if(autocvar_g_balance_nex_secondary_chargepool)
+ self.nex_chargepool_ammo = 1;
+ self.nex_charge = autocvar_g_balance_nex_charge_start;
+ }
if(inWarmupStage)
{
}
if(g_weaponarena_random)
+ {
+ if(g_weaponarena_random_with_laser)
+ self.weapons &~= WEPBIT_LASER;
self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE);
+ if(g_weaponarena_random_with_laser)
+ self.weapons |= WEPBIT_LASER;
+ }
self.items = start_items;
self.jump_interval = time;
- self.spawnshieldtime = time + cvar("g_spawnshieldtime");
- self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
- self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
- self.pauserotfuel_finished = time + cvar("g_balance_pause_fuel_rot_spawn");
- self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
+ self.spawnshieldtime = time + autocvar_g_spawnshieldtime;
+ self.pauserotarmor_finished = time + autocvar_g_balance_pause_armor_rot_spawn;
+ self.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot_spawn;
+ self.pauserotfuel_finished = time + autocvar_g_balance_pause_fuel_rot_spawn;
+ self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen_spawn;
//extend the pause of rotting if client was reset at the beginning of the countdown
- if(!cvar("sv_ready_restart_after_countdown") && time < game_starttime) { // TODO why is this cvar NOTted?
+ if(!autocvar_sv_ready_restart_after_countdown && time < game_starttime) { // TODO why is this cvar NOTted?
self.spawnshieldtime += game_starttime - time;
self.pauserotarmor_finished += game_starttime - time;
self.pauserothealth_finished += game_starttime - time;
self.nextthink = 0;
self.hook_time = 0;
self.dmg_team = 0;
- self.ballistics_density = cvar("g_ballistics_density_player");
+ self.ballistics_density = autocvar_g_ballistics_density_player;
self.metertime = 0;
CL_SpawnWeaponentity();
self.alpha = default_player_alpha;
- self.colormod = '1 1 1' * cvar("g_player_brightness");
+ self.colormod = '1 1 1' * autocvar_g_player_brightness;
self.exteriorweaponentity.alpha = default_weapon_alpha;
- self.lms_nextcheck = time + cvar("g_lms_campcheck_interval")*2;
+ self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval*2;
self.lms_traveled_distance = 0;
self.speedrunning = FALSE;
race_PostSpawn(spot);
- if(cvar("spawn_debug"))
+ if(autocvar_spawn_debug)
{
sprint(self, strcat("spawnpoint origin: ", vtos(spot.origin), "\n"));
remove(spot); // usefull for checking if there are spawnpoints, that let drop through the floor
//stuffcmd(self, "chase_active 0");
//stuffcmd(self, "set viewsize $tmpviewsize \n");
- if (cvar("g_spawnsound"))
+ if (autocvar_g_spawnsound)
sound (self, CHAN_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
if(g_assault) {
self.switchweapon = w_getbestweapon(self);
self.cnt = self.switchweapon;
self.weapon = 0;
+
+ self.wish_reload = 0;
+
+ if(!self.alivetime)
+ self.alivetime = time;
} else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) {
PutObserverInServer ();
}
// ctf_playerchanged();
}
+.float ebouncefactor, ebouncestop; // electro's values
+// TODO do we need all these fields, or should we stop autodetecting runtime
+// changes and just have a console command to update this?
float ClientInit_SendEntity(entity to, float sf)
{
WriteByte(MSG_ENTITY, ENT_CLIENT_INIT);
WriteByte(MSG_ENTITY, self.cnt * 255.0); // g_balance_weaponswitchdelay
WriteCoord(MSG_ENTITY, self.bouncefactor); // g_balance_grenadelauncher_bouncefactor
WriteCoord(MSG_ENTITY, self.bouncestop); // g_balance_grenadelauncher_bouncestop
- WriteByte(MSG_ENTITY, cvar("g_balance_nex_secondary")); // client has to know if it should zoom or not
- WriteByte(MSG_ENTITY, cvar("g_balance_campingrifle_secondary")); // client has to know if it should zoom or not
+ WriteCoord(MSG_ENTITY, self.ebouncefactor); // g_balance_grenadelauncher_bouncefactor
+ WriteCoord(MSG_ENTITY, self.ebouncestop); // g_balance_grenadelauncher_bouncestop
+ WriteByte(MSG_ENTITY, autocvar_g_balance_nex_secondary); // client has to know if it should zoom or not
+ WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_secondary); // client has to know if it should zoom or not
WriteByte(MSG_ENTITY, serverflags); // client has to know if it should zoom or not
+ WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_magazinecapacity); // rifle max bullets
+ WriteCoord(MSG_ENTITY, autocvar_g_trueaim_minrange);
return TRUE;
}
void ClientInit_CheckUpdate()
{
self.nextthink = time;
- if(self.count != cvar("g_balance_armor_blockpercent"))
+ if(self.count != autocvar_g_balance_armor_blockpercent)
+ {
+ self.count = autocvar_g_balance_armor_blockpercent;
+ self.SendFlags |= 1;
+ }
+ if(self.cnt != autocvar_g_balance_weaponswitchdelay)
{
- self.count = cvar("g_balance_armor_blockpercent");
+ self.cnt = autocvar_g_balance_weaponswitchdelay;
self.SendFlags |= 1;
}
- if(self.cnt != cvar("g_balance_weaponswitchdelay"))
+ if(self.bouncefactor != autocvar_g_balance_grenadelauncher_bouncefactor)
{
- self.cnt = cvar("g_balance_weaponswitchdelay");
+ self.bouncefactor = autocvar_g_balance_grenadelauncher_bouncefactor;
self.SendFlags |= 1;
}
- if(self.bouncefactor != cvar("g_balance_grenadelauncher_bouncefactor"))
+ if(self.bouncestop != autocvar_g_balance_grenadelauncher_bouncestop)
{
- self.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor");
+ self.bouncestop = autocvar_g_balance_grenadelauncher_bouncestop;
self.SendFlags |= 1;
}
- if(self.bouncestop != cvar("g_balance_grenadelauncher_bouncestop"))
+ if(self.ebouncefactor != autocvar_g_balance_electro_secondary_bouncefactor)
{
- self.bouncestop = cvar("g_balance_grenadelauncher_bouncestop");
+ self.ebouncefactor = autocvar_g_balance_electro_secondary_bouncefactor;
+ self.SendFlags |= 1;
+ }
+ if(self.ebouncestop != autocvar_g_balance_electro_secondary_bouncestop)
+ {
+ self.ebouncestop = autocvar_g_balance_electro_secondary_bouncestop;
self.SendFlags |= 1;
}
}
=============
*/
+.float clientkill_nexttime;
void ClientKill_Now_TeamChange()
{
if(self.killindicator_teamchange == -1)
self.team = -1;
JoinBestTeam( self, FALSE, FALSE );
}
+ else if(self.killindicator_teamchange == -2)
+ {
+ if(g_ca)
+ self.caplayer = 0;
+ if(blockSpectators)
+ sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
+ PutObserverInServer();
+ }
else
SV_ChangeTeam(self.killindicator_teamchange - 1);
}
void ClientKill_Now()
{
+ remove(self.killindicator);
+ self.killindicator = world;
+
if(self.killindicator_teamchange)
ClientKill_Now_TeamChange();
// in any case:
Damage(self, self, self, 100000, DEATH_KILL, self.origin, '0 0 0');
- if(self.killindicator)
- {
- dprint("Cleaned up after a leaked kill indicator.\n");
- remove(self.killindicator);
- self.killindicator = world;
- }
+ // now I am sure the player IS dead
}
void KillIndicator_Think()
{
ClientKill_Now(); // no oldself needed
return;
}
+ else if(g_cts && self.health == 1) // health == 1 means that it's silent
+ {
+ self.nextthink = time + 1;
+ self.cnt -= 1;
+ }
else
{
if(self.cnt <= 10)
{
if(self.owner.killindicator_teamchange == -1)
centerprint(self.owner, strcat("Changing team in ", ftos(self.cnt), " seconds"));
+ else if(self.owner.killindicator_teamchange == -2)
+ centerprint(self.owner, strcat("Spectating in ", ftos(self.cnt), " seconds"));
else
centerprint(self.owner, strcat("Changing to ", ColoredTeamName(self.owner.killindicator_teamchange), " in ", ftos(self.cnt), " seconds"));
}
}
}
-void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto
+void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 = spec
{
float killtime;
entity e;
- killtime = cvar("g_balance_kill_delay");
+ killtime = autocvar_g_balance_kill_delay;
- if(g_race_qualifying)
+ if(g_race_qualifying || g_cts)
killtime = 0;
+ if(g_cts && self.killindicator && self.killindicator.health == 1) // self.killindicator.health == 1 means that the kill indicator was spawned by CTS_ClientKill
+ {
+ remove(self.killindicator);
+ self.killindicator = world;
+
+ ClientKill_Now(); // allow instant kill in this case
+ return;
+ }
+
self.killindicator_teamchange = targetteam;
- if(!self.killindicator)
+ if(!self.killindicator)
{
+ if(self.modelindex && self.deadflag == DEAD_NO)
+ {
+ killtime = max(killtime, self.clientkill_nexttime - time);
+ self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam;
+ }
+
if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO)
{
ClientKill_Now();
self.killindicator.nextthink = time + (self.lip) * 0.05;
self.killindicator.cnt = ceil(killtime);
self.killindicator.count = bound(0, ceil(killtime), 10);
- sprint(self, strcat("^1You'll be dead in ", ftos(self.killindicator.cnt), " seconds\n"));
+ //sprint(self, strcat("^1You'll be dead in ", ftos(self.killindicator.cnt), " seconds\n"));
for(e = world; (e = find(e, classname, "body")) != world; )
{
}
if(self.killindicator)
{
- if(targetteam)
- self.killindicator.colormod = TeamColor(targetteam);
- else
+ if(targetteam == 0) // just die
self.killindicator.colormod = '0 0 0';
+ else if(targetteam == -1) // auto
+ self.killindicator.colormod = '0 1 0';
+ else if(targetteam == -2) // spectate
+ self.killindicator.colormod = '0.5 0.5 0.5';
+ else
+ self.killindicator.colormod = TeamColor(targetteam);
}
}
{
// do nothing
}
+ else if(self.freezetag_frozen)
+ {
+ // do nothing
+ }
else
ClientKill_TeamChange(0);
}
-void CTS_ClientKill_Think (void)
+void CTS_ClientKill (entity e) // silent version of ClientKill, used when player finishes a CTS run. Useful to prevent cheating by running back to the start line and starting out with more speed
{
- self = self.owner; // set self to the player to be killed
- sprint(self, "^1You were killed in order to prevent cheating!");
- ClientKill_Now();
-}
-
-void CTS_ClientKill (float t) // silent version of ClientKill
-{
- entity e;
- e = spawn();
- e.owner = self;
- e.think = CTS_ClientKill_Think;
- e.nextthink = t;
+ e.killindicator = spawn();
+ e.killindicator.owner = e;
+ e.killindicator.think = KillIndicator_Think;
+ e.killindicator.nextthink = time + (e.lip) * 0.05;
+ e.killindicator.cnt = ceil(autocvar_g_cts_finish_kill_delay);
+ e.killindicator.health = 1; // this is used to indicate that it should be silent
+ e.lip = 0;
}
void DoTeamChange(float destteam)
stuffcmd(e, "\nin_bindmap 0 0\n");
if(g_race || g_cts)
stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n");
- if(cvar("g_antilag") == 3) // client side hitscan
+ if(autocvar_g_antilag == 3) // client side hitscan
stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n");
if(sv_gentle)
stuffcmd(e, "cl_cmd settemp cl_gentle 1\n");
/*
* we no longer need to stuff this. Remove this comment block if you feel
* 2.3 and higher (or was it 2.2.3?) don't need these any more
- stuffcmd(e, strcat("cl_gravity ", ftos(cvar("sv_gravity")), "\n"));
- stuffcmd(e, strcat("cl_movement_accelerate ", ftos(cvar("sv_accelerate")), "\n"));
- stuffcmd(e, strcat("cl_movement_friction ", ftos(cvar("sv_friction")), "\n"));
- stuffcmd(e, strcat("cl_movement_maxspeed ", ftos(cvar("sv_maxspeed")), "\n"));
- stuffcmd(e, strcat("cl_movement_airaccelerate ", ftos(cvar("sv_airaccelerate")), "\n"));
- stuffcmd(e, strcat("cl_movement_maxairspeed ", ftos(cvar("sv_maxairspeed")), "\n"));
- stuffcmd(e, strcat("cl_movement_stopspeed ", ftos(cvar("sv_stopspeed")), "\n"));
- stuffcmd(e, strcat("cl_movement_jumpvelocity ", ftos(cvar("sv_jumpvelocity")), "\n"));
- stuffcmd(e, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n"));
- stuffcmd(e, strcat("set cl_movement_friction_on_land ", ftos(cvar("sv_friction_on_land")), "\n"));
- stuffcmd(e, strcat("set cl_movement_airaccel_qw ", ftos(cvar("sv_airaccel_qw")), "\n"));
- stuffcmd(e, strcat("set cl_movement_airaccel_sideways_friction ", ftos(cvar("sv_airaccel_sideways_friction")), "\n"));
+ stuffcmd(e, strcat("cl_gravity ", ftos(autocvar_sv_gravity), "\n"));
+ stuffcmd(e, strcat("cl_movement_accelerate ", ftos(autocvar_sv_accelerate), "\n"));
+ stuffcmd(e, strcat("cl_movement_friction ", ftos(autocvar_sv_friction), "\n"));
+ stuffcmd(e, strcat("cl_movement_maxspeed ", ftos(autocvar_sv_maxspeed), "\n"));
+ stuffcmd(e, strcat("cl_movement_airaccelerate ", ftos(autocvar_sv_airaccelerate), "\n"));
+ stuffcmd(e, strcat("cl_movement_maxairspeed ", ftos(autocvar_sv_maxairspeed), "\n"));
+ stuffcmd(e, strcat("cl_movement_stopspeed ", ftos(autocvar_sv_stopspeed), "\n"));
+ stuffcmd(e, strcat("cl_movement_jumpvelocity ", ftos(autocvar_sv_jumpvelocity), "\n"));
+ stuffcmd(e, strcat("cl_movement_stepheight ", ftos(autocvar_sv_stepheight), "\n"));
+ stuffcmd(e, strcat("set cl_movement_friction_on_land ", ftos(autocvar_sv_friction_on_land), "\n"));
+ stuffcmd(e, strcat("set cl_movement_airaccel_qw ", ftos(autocvar_sv_airaccel_qw), "\n"));
+ stuffcmd(e, strcat("set cl_movement_airaccel_sideways_friction ", ftos(autocvar_sv_airaccel_sideways_friction), "\n"));
stuffcmd(e, "cl_movement_edgefriction 1\n");
*/
}
+float PlayerInIDList(entity p, string idlist)
+{
+ float n, i;
+ string s;
+
+ // NOTE: we do NOT check crypto_keyfp here, an unsigned ID is fine too for this
+ if not(p.crypto_idfp)
+ return 0;
+
+ // this function allows abbreviated player IDs too!
+ n = tokenize_console(idlist);
+ for(i = 0; i < n; ++i)
+ {
+ s = argv(i);
+ if(s == substring(p.crypto_idfp, 0, strlen(s)))
+ return 1;
+ }
+
+ return 0;
+}
+
/*
=============
ClientConnect
PlayerScore_Attach(self);
ClientData_Attach();
+ accuracy_init(self);
bot_clientconnect();
//if(g_domination)
// dom_player_join_team(self);
+ // identify the right forced team
+ if(autocvar_g_campaign)
+ {
+ if(clienttype(self) == CLIENTTYPE_REAL) // only players, not bots
+ {
+ switch(autocvar_g_campaign_forceteam)
+ {
+ case 1: self.team_forced = COLOR_TEAM1; break;
+ case 2: self.team_forced = COLOR_TEAM2; break;
+ case 3: self.team_forced = COLOR_TEAM3; break;
+ case 4: self.team_forced = COLOR_TEAM4; break;
+ default: self.team_forced = 0;
+ }
+ }
+ }
+ else if(PlayerInIDList(self, autocvar_g_forced_team_red))
+ self.team_forced = COLOR_TEAM1;
+ else if(PlayerInIDList(self, autocvar_g_forced_team_blue))
+ self.team_forced = COLOR_TEAM2;
+ else if(PlayerInIDList(self, autocvar_g_forced_team_yellow))
+ self.team_forced = COLOR_TEAM3;
+ else if(PlayerInIDList(self, autocvar_g_forced_team_pink))
+ self.team_forced = COLOR_TEAM4;
+ else if(autocvar_g_forced_team_otherwise == "red")
+ self.team_forced = COLOR_TEAM1;
+ else if(autocvar_g_forced_team_otherwise == "blue")
+ self.team_forced = COLOR_TEAM2;
+ else if(autocvar_g_forced_team_otherwise == "yellow")
+ self.team_forced = COLOR_TEAM3;
+ else if(autocvar_g_forced_team_otherwise == "pink")
+ self.team_forced = COLOR_TEAM4;
+ else if(autocvar_g_forced_team_otherwise == "spectate")
+ self.team_forced = -1;
+ else if(autocvar_g_forced_team_otherwise == "spectator")
+ self.team_forced = -1;
+ else
+ self.team_forced = 0;
+
+ if(!teams_matter)
+ if(self.team_forced > 0)
+ self.team_forced = 0;
+
JoinBestTeam(self, FALSE, FALSE); // if the team number is valid, keep it
- if((cvar("sv_spectate") == 1 && !g_lms) || cvar("g_campaign")) {
+ if((autocvar_sv_spectate == 1 && !g_lms) || autocvar_g_campaign || self.team_forced < 0) {
self.classname = "observer";
} else {
if(teams_matter)
{
- if(cvar("g_balance_teams") || cvar("g_balance_teams_force"))
+ if(autocvar_g_balance_teams || autocvar_g_balance_teams_force)
{
self.classname = "player";
campaign_bots_may_start = 1;
self.playerid = (playerid_last = playerid_last + 1);
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":join:", ftos(self.playerid), ":", ftos(num_for_edict(self)), ":", ((clienttype(self) == CLIENTTYPE_REAL) ? self.netaddress : "bot"), ":", self.netname));
LogTeamchange(self.playerid, self.team, 1);
// get other cvars from player
GetCvars(0);
- // set cvar for team scoreboard
- stuffcmd(self, strcat("set teamplay ", ftos(teamplay), "\n"));
-
// notify about available teams
if(teams_matter)
{
self.spectatortime = time;
if(blockSpectators)
{
- sprint(self, strcat("^7You have to become a player within the next ", ftos(cvar("g_maxplayers_spectator_blocktime")), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
+ sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
}
self.jointime = time;
- self.allowedTimeouts = cvar("sv_timeout_number");
+ self.allowedTimeouts = autocvar_sv_timeout_number;
if(clienttype(self) == CLIENTTYPE_REAL)
{
- if(cvar("g_bugrigs") || g_weaponarena == WEPBIT_TUBA)
+ if(autocvar_g_bugrigs || g_weaponarena == WEPBIT_TUBA)
stuffcmd(self, "cl_cmd settemp chase_active 1\n");
}
SoundEntity_Attach(self);
- if(cvar("g_hitplots") || strstrofs(strcat(" ", cvar_string("g_hitplots_individuals"), " "), strcat(" ", self.netaddress, " "), 0) >= 0)
+ if(autocvar_g_hitplots || strstrofs(strcat(" ", autocvar_g_hitplots_individuals, " "), strcat(" ", self.netaddress, " "), 0) >= 0)
{
self.hitplotfh = fopen(strcat("hits-", matchid, "-", self.netaddress, "-", ftos(self.playerid), ".plot"), FILE_WRITE);
fputs(self.hitplotfh, strcat("#name ", self.netname, "\n"));
race_SendRankings(i, 0, 0, MSG_ONE);
}
}
- else if(cvar("sv_teamnagger") && !(cvar("bot_vs_human") && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca
+ else if(autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca
send_CSQC_teamnagger();
- send_CSQC_cr_maxbullets(self);
-
CheatInitClient();
+
+ PlayerStats_AddPlayer(self);
}
/*
return;
}
+ PlayerStats_AddGlobalInfo(self);
+
CheatShutdownClient();
if(self.hitplotfh >= 0)
if(self.entcs)
detach_entcs();
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":part:", ftos(self.playerid)));
bprint ("^4",self.netname);
bprint ("^4 disconnected\n");
if(self.flagcarried)
DropFlag(self.flagcarried, world, world);
- if(self.ballcarried)
+ if(self.ballcarried && g_nexball)
DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
// Here, everything has been done that requires this player to be a client.
Spawnqueue_Remove(self);
}
+ accuracy_free(self);
ClientData_Detach();
PlayerScore_Detach(self);
.float oldcolormap;
void respawn(void)
{
- if(self.modelindex != 0 && cvar("g_respawn_ghosts"))
+ if(self.modelindex != 0 && autocvar_g_respawn_ghosts)
{
self.solid = SOLID_NOT;
self.takedamage = DAMAGE_NO;
self.movetype = MOVETYPE_FLY;
- self.velocity = '0 0 1' * cvar("g_respawn_ghosts_speed");
- self.avelocity = randomvec() * cvar("g_respawn_ghosts_speed") * 3 - randomvec() * cvar("g_respawn_ghosts_speed") * 3;
+ self.velocity = '0 0 1' * autocvar_g_respawn_ghosts_speed;
+ self.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3;
self.effects |= EF_ADDITIVE;
self.oldcolormap = self.colormap;
self.colormap = 512;
pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1);
- if(cvar("g_respawn_ghosts_maxtime"))
- SUB_SetFade (self, time + cvar("g_respawn_ghosts_maxtime") / 2 + random () * (cvar("g_respawn_ghosts_maxtime") - cvar("g_respawn_ghosts_maxtime") / 2), 1.5);
+ if(autocvar_g_respawn_ghosts_maxtime)
+ SUB_SetFade (self, time + autocvar_g_respawn_ghosts_maxtime / 2 + random () * (autocvar_g_respawn_ghosts_maxtime - autocvar_g_respawn_ghosts_maxtime / 2), 1.5);
}
CopyBody(1);
* @param addOneSecond boolean, set to 1 if the welcome-message centerprint asks for the text
*/
string getTimeoutText(float addOneSecond) {
- if (!cvar("sv_timeout") || !timeoutStatus)
+ if (!autocvar_sv_timeout || !timeoutStatus)
return "";
local string retStr;
void player_powerups (void)
{
+ // add a way to see what the items were BEFORE all of these checks for the mutator hook
+ olditems = self.items;
+
if((self.items & IT_USING_JETPACK) && !self.deadflag)
{
- SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, cvar("g_jetpack_attenuation"));
+ SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
self.modelflags |= MF_ROCKET;
}
else
self.modelflags &~= MF_ROCKET;
}
- self.effects &~= (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
+ self.effects &~= (EF_DIMLIGHT | EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT | EF_FLAME | EF_NODEPTHTEST);
if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
return;
if (self.items & IT_INVINCIBLE)
{
play_countdown(self.invincible_finished, "misc/poweroff.wav");
- if (time > self.invincible_finished && cvar("g_balance_powerup_timer"))
+ if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
{
self.items = self.items - (self.items & IT_INVINCIBLE);
sprint(self, "^3Speed has worn off\n");
sprint(self, "^3You are on speed\n");
}
}
- return;
}
-
- if (self.items & IT_STRENGTH)
+ else // if we're not in minstagib, continue. I added this else to replace the "return" which was here that broke the callhook for this function -- This code is nasty.
{
- play_countdown(self.strength_finished, "misc/poweroff.wav");
- self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
- if (time > self.strength_finished && cvar("g_balance_powerup_timer"))
+ if (self.items & IT_STRENGTH)
{
- self.items = self.items - (self.items & IT_STRENGTH);
- sprint(self, "^3Strength has worn off\n");
+ play_countdown(self.strength_finished, "misc/poweroff.wav");
+ self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);
+ if (time > self.strength_finished && autocvar_g_balance_powerup_timer)
+ {
+ self.items = self.items - (self.items & IT_STRENGTH);
+ sprint(self, "^3Strength has worn off\n");
+ }
}
- }
- else
- {
- if (time < self.strength_finished)
+ else
{
- self.items = self.items | IT_STRENGTH;
- sprint(self, "^3Strength infuses your weapons with devastating power\n");
+ if (time < self.strength_finished)
+ {
+ self.items = self.items | IT_STRENGTH;
+ sprint(self, "^3Strength infuses your weapons with devastating power\n");
+ }
}
- }
- if (self.items & IT_INVINCIBLE)
- {
- play_countdown(self.invincible_finished, "misc/poweroff.wav");
- self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
- if (time > self.invincible_finished && cvar("g_balance_powerup_timer"))
+ if (self.items & IT_INVINCIBLE)
{
- self.items = self.items - (self.items & IT_INVINCIBLE);
- sprint(self, "^3Shield has worn off\n");
+ play_countdown(self.invincible_finished, "misc/poweroff.wav");
+ self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);
+ if (time > self.invincible_finished && autocvar_g_balance_powerup_timer)
+ {
+ self.items = self.items - (self.items & IT_INVINCIBLE);
+ sprint(self, "^3Shield has worn off\n");
+ }
}
- }
- else
- {
- if (time < self.invincible_finished)
+ else
{
- self.items = self.items | IT_INVINCIBLE;
- sprint(self, "^3Shield surrounds you\n");
+ if (time < self.invincible_finished)
+ {
+ self.items = self.items | IT_INVINCIBLE;
+ sprint(self, "^3Shield surrounds you\n");
+ }
}
- }
- if(cvar("g_nodepthtestplayers"))
- self.effects = self.effects | EF_NODEPTHTEST;
+ if(autocvar_g_nodepthtestplayers)
+ self.effects = self.effects | EF_NODEPTHTEST;
- if(cvar("g_fullbrightplayers"))
- self.effects = self.effects | EF_FULLBRIGHT;
+ if(autocvar_g_fullbrightplayers)
+ self.effects = self.effects | EF_FULLBRIGHT;
- // midair gamemode: damage only while in the air
- // if in midair mode, being on ground grants temporary invulnerability
- // (this is so that multishot weapon don't clear the ground flag on the
- // first damage in the frame, leaving the player vulnerable to the
- // remaining hits in the same frame)
- if (self.flags & FL_ONGROUND)
- if (g_midair)
- self.spawnshieldtime = max(self.spawnshieldtime, time + cvar("g_midair_shieldtime"));
+ // midair gamemode: damage only while in the air
+ // if in midair mode, being on ground grants temporary invulnerability
+ // (this is so that multishot weapon don't clear the ground flag on the
+ // first damage in the frame, leaving the player vulnerable to the
+ // remaining hits in the same frame)
+ if (self.flags & FL_ONGROUND)
+ if (g_midair)
+ self.spawnshieldtime = max(self.spawnshieldtime, time + autocvar_g_midair_shieldtime);
- if (time >= game_starttime)
- if (time < self.spawnshieldtime)
- self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
+ if (time >= game_starttime)
+ if (time < self.spawnshieldtime)
+ self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
+ }
+
+ MUTATOR_CALLHOOK(PlayerPowerups);
}
float CalcRegen(float current, float stable, float regenfactor, float regenframetime)
void player_regen (void)
{
float minh, mina, minf, maxh, maxa, maxf, limith, limita, limitf, max_mod, regen_mod, rot_mod, limit_mod;
- maxh = cvar("g_balance_health_rotstable");
- maxa = cvar("g_balance_armor_rotstable");
- maxf = cvar("g_balance_fuel_rotstable");
- minh = cvar("g_balance_health_regenstable");
- mina = cvar("g_balance_armor_regenstable");
- minf = cvar("g_balance_fuel_regenstable");
- limith = cvar("g_balance_health_limit");
- limita = cvar("g_balance_armor_limit");
- limitf = cvar("g_balance_fuel_limit");
+ maxh = autocvar_g_balance_health_rotstable;
+ maxa = autocvar_g_balance_armor_rotstable;
+ maxf = autocvar_g_balance_fuel_rotstable;
+ minh = autocvar_g_balance_health_regenstable;
+ mina = autocvar_g_balance_armor_regenstable;
+ minf = autocvar_g_balance_fuel_regenstable;
+ limith = autocvar_g_balance_health_limit;
+ limita = autocvar_g_balance_armor_limit;
+ limitf = autocvar_g_balance_fuel_limit;
max_mod = regen_mod = rot_mod = limit_mod = 1;
{
if (self.runes & CURSE_VENOM) // do we have both rune/curse?
{
- regen_mod = cvar("g_balance_rune_regen_combo_regenrate");
- max_mod = cvar("g_balance_rune_regen_combo_hpmod");
- limit_mod = cvar("g_balance_rune_regen_combo_limitmod");
+ regen_mod = autocvar_g_balance_rune_regen_combo_regenrate;
+ max_mod = autocvar_g_balance_rune_regen_combo_hpmod;
+ limit_mod = autocvar_g_balance_rune_regen_combo_limitmod;
}
else
{
- regen_mod = cvar("g_balance_rune_regen_regenrate");
- max_mod = cvar("g_balance_rune_regen_hpmod");
- limit_mod = cvar("g_balance_rune_regen_limitmod");
+ regen_mod = autocvar_g_balance_rune_regen_regenrate;
+ max_mod = autocvar_g_balance_rune_regen_hpmod;
+ limit_mod = autocvar_g_balance_rune_regen_limitmod;
}
}
else if (self.runes & CURSE_VENOM)
{
- max_mod = cvar("g_balance_curse_venom_hpmod");
+ max_mod = autocvar_g_balance_curse_venom_hpmod;
if (self.runes & RUNE_REGEN) // do we have both rune/curse?
- rot_mod = cvar("g_balance_rune_regen_combo_rotrate");
+ rot_mod = autocvar_g_balance_rune_regen_combo_rotrate;
else
- rot_mod = cvar("g_balance_curse_venom_rotrate");
- limit_mod = cvar("g_balance_curse_venom_limitmod");
+ rot_mod = autocvar_g_balance_curse_venom_rotrate;
+ limit_mod = autocvar_g_balance_curse_venom_limitmod;
//if (!self.runes & RUNE_REGEN)
- // rot_mod = cvar("g_balance_curse_venom_rotrate");
+ // rot_mod = autocvar_g_balance_curse_venom_rotrate;
}
maxh = maxh * max_mod;
//maxa = maxa * max_mod;
if(g_lms && g_ca)
rot_mod = 0;
- if (!g_minstagib && !g_ca && (!g_lms || cvar("g_lms_regenerate")))
+ if (!g_minstagib && !g_ca && (!g_lms || autocvar_g_lms_regenerate))
{
- self.armorvalue = CalcRotRegen(self.armorvalue, mina, cvar("g_balance_armor_regen"), cvar("g_balance_armor_regenlinear"), regen_mod * frametime * (time > self.pauseregen_finished), maxa, cvar("g_balance_armor_rot"), cvar("g_balance_armor_rotlinear"), rot_mod * frametime * (time > self.pauserotarmor_finished), limita);
- self.health = CalcRotRegen(self.health, minh, cvar("g_balance_health_regen"), cvar("g_balance_health_regenlinear"), regen_mod * frametime * (time > self.pauseregen_finished), maxh, cvar("g_balance_health_rot"), cvar("g_balance_health_rotlinear"), rot_mod * frametime * (time > self.pauserothealth_finished), limith);
+ self.armorvalue = CalcRotRegen(self.armorvalue, mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, rot_mod * frametime * (time > self.pauserotarmor_finished), limita);
+ self.health = CalcRotRegen(self.health, minh, autocvar_g_balance_health_regen, autocvar_g_balance_health_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished), maxh, autocvar_g_balance_health_rot, autocvar_g_balance_health_rotlinear, rot_mod * frametime * (time > self.pauserothealth_finished), limith);
// if player rotted to death... die!
if(self.health < 1)
}
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, cvar("g_balance_fuel_regen"), cvar("g_balance_fuel_regenlinear"), regen_mod * frametime * (time > self.pauseregen_finished) * (self.items & IT_FUEL_REGEN != 0), maxf, cvar("g_balance_fuel_rot"), cvar("g_balance_fuel_rotlinear"), rot_mod * frametime * (time > self.pauserotfuel_finished), limitf);
+ self.ammo_fuel = CalcRotRegen(self.ammo_fuel, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, regen_mod * frametime * (time > self.pauseregen_finished) * (self.items & IT_FUEL_REGEN != 0), maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, rot_mod * frametime * (time > self.pauserotfuel_finished), limitf);
}
float zoomstate_set;
self.pressedkeys &~= KEY_CROUCH;
}
-void update_stats (float number, float hit, float fired) {
-// self.stat_hit = number + ((number==0) ? 1 : 64) * hit * sv_accuracy_data_share;
-// self.stat_fired = number + ((number==0) ? 1 : 64) * fired * sv_accuracy_data_share;
-
- if(number) {
- self.stat_hit = number + 64 * hit * sv_accuracy_data_share;
- self.stat_fired = number + 64 * fired * sv_accuracy_data_share;
- } else {
- self.stat_hit = hit * sv_accuracy_data_share;
- self.stat_fired = fired * sv_accuracy_data_share;
- }
-}
-
/*
======================
spectate mode routines
======================
*/
-.float weapon_count;
void SpectateCopy(entity spectatee) {
- if(spectatee.weapon_count < WEP_LAST) {
- update_stats (spectatee.weapon_count, spectatee.cvar_cl_accuracy_data_share * floor(spectatee.stats_hit[spectatee.weapon_count - 1]), spectatee.cvar_cl_accuracy_data_share * floor(spectatee.stats_fired[spectatee.weapon_count - 1]));
- spectatee.weapon_count ++;
- } else
- update_stats (0, spectatee.cvar_cl_accuracy_data_share * spectatee.stat_hit, spectatee.cvar_cl_accuracy_data_share * spectatee.stat_fired);
-
other = spectatee;
MUTATOR_CALLHOOK(SpectateCopy);
self.armortype = spectatee.armortype;
self.impulse = 0;
self.items = spectatee.items;
self.last_pickup = spectatee.last_pickup;
+ self.hit_time = spectatee.hit_time;
self.metertime = spectatee.metertime;
self.strength_finished = spectatee.strength_finished;
self.invincible_finished = spectatee.invincible_finished;
WriteEntity(MSG_ONE, self.enemy);
//stuffcmd(self, "set viewsize $tmpviewsize \n");
self.movetype = MOVETYPE_NONE;
-
- self.enemy.weapon_count = 0;
+ accuracy_resend(self);
if(!SpectateUpdate())
PutObserverInServer();
void LeaveSpectatorMode()
{
- if(isJoinAllowed()) {
- if(!teams_matter || cvar("g_campaign") || cvar("g_balance_teams") || (self.wasplayer && cvar("g_changeteam_banned"))) {
+ if(nJoinAllowed(1)) {
+ if(!teams_matter || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
self.classname = "player";
- if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force"))
+ if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force)
JoinBestTeam(self, FALSE, TRUE);
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
campaign_bots_may_start = 1;
- self.stat_count = WEP_LAST;
-
PutClientInServer();
if(self.classname == "player")
bprint ("^4", self.netname, "^4 is playing now\n");
- if(!cvar("g_campaign"))
+ if(!autocvar_g_campaign)
centerprint(self,""); // clear MOTD
return;
* Determines whether the player is allowed to join. This depends on cvar
* g_maxplayers, if it isn't used this function always return TRUE, otherwise
* it checks whether the number of currently playing players exceeds g_maxplayers.
- * @return bool TRUE if the player is allowed to join, false otherwise
+ * @return int number of free slots for players, 0 if none
*/
-float isJoinAllowed() {
- if (!cvar("g_maxplayers"))
- return TRUE;
+float nJoinAllowed(float includeMe) {
+ if(self.team_forced < 0)
+ return FALSE; // forced spectators can never join
+ // TODO simplify this
local entity e;
+
+ local float totalClients;
+ FOR_EACH_CLIENT(e)
+ totalClients += 1;
+
+ if (!autocvar_g_maxplayers)
+ return maxclients - totalClients + includeMe;
+
local float currentlyPlaying;
- FOR_EACH_REALPLAYER(e) {
- if(e.classname == "player")
- currentlyPlaying += 1;
- }
- if(currentlyPlaying < cvar("g_maxplayers"))
- return TRUE;
+ FOR_EACH_REALPLAYER(e)
+ currentlyPlaying += 1;
+
+ if(currentlyPlaying < autocvar_g_maxplayers)
+ return min(maxclients - totalClients + includeMe, autocvar_g_maxplayers - currentlyPlaying);
- return FALSE;
+ return 0;
}
/**
*/
void checkSpectatorBlock() {
if(self.classname == "spectator" || self.classname == "observer") {
- if( time > (self.spectatortime + cvar("g_maxplayers_spectator_blocktime")) ) {
+ if( time > (self.spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) {
sprint(self, "^7You were kicked from the server because you are spectator and spectators aren't allowed at the moment.\n");
dropclient(self);
}
}
}
-float vercmp_recursive(string v1, string v2)
-{
- float dot1, dot2;
- string s1, s2;
- float r;
-
- dot1 = strstrofs(v1, ".", 0);
- dot2 = strstrofs(v2, ".", 0);
- if(dot1 == -1)
- s1 = v1;
- else
- s1 = substring(v1, 0, dot1);
- if(dot2 == -1)
- s2 = v2;
- else
- s2 = substring(v2, 0, dot2);
-
- r = stof(s1) - stof(s2);
- if(r != 0)
- return r;
-
- r = strcasecmp(s1, s2);
- if(r != 0)
- return r;
-
- if(dot1 == -1)
- if(dot2 == -1)
- return 0;
- else
- return -1;
- else
- if(dot2 == -1)
- return 1;
- else
- return vercmp_recursive(substring(v1, dot1 + 1, 999), substring(v2, dot2 + 1, 999));
-}
-
-float vercmp(string v1, string v2)
-{
- if(strcasecmp(v1, v2) == 0) // early out check
- return 0;
- return vercmp_recursive(v1, v2);
-}
-
void ObserverThink()
{
if (self.flags & FL_JUMPRELEASED) {
self.classname = "spectator";
} else {
self.classname = "observer";
- self.stat_count = WEP_LAST;
PutClientInServer();
}
} else if (self.BUTTON_ATCK2) {
self.welcomemessage_time = 0;
self.flags &~= FL_JUMPRELEASED;
self.classname = "observer";
- self.stat_count = WEP_LAST;
PutClientInServer();
} else {
if(!SpectateUpdate())
void PlayerPreThink (void)
{
self.stat_game_starttime = game_starttime;
- self.stat_allow_oldnexbeam = cvar("g_allow_oldnexbeam");
- self.stat_leadlimit = cvar("leadlimit");
+ self.stat_allow_oldnexbeam = autocvar_g_allow_oldnexbeam;
+ self.stat_leadlimit = autocvar_leadlimit;
if(frametime)
{
if(self.netname_previous != self.netname)
{
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":name:", ftos(self.playerid), ":", self.netname));
if(self.netname_previous)
strunzone(self.netname_previous);
{
if(strstr(self.cvar_g_xonoticversion, "git", 0) < 0)
{
- if(strstr(cvar_string("g_xonoticversion"), "git", 0) >= 0)
+ if(strstr(autocvar_g_xonoticversion, "git", 0) >= 0)
{
- dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", cvar_string("g_xonoticversion"), " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
- sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", cvar_string("g_xonoticversion"), " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
+ dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
+ sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
}
else
{
float r;
- r = vercmp(self.cvar_g_xonoticversion, cvar_string("g_xonoticversion"));
+ r = vercmp(self.cvar_g_xonoticversion, autocvar_g_xonoticversion);
if(r < 0)
{
- dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", cvar_string("g_xonoticversion"), "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n");
- sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", cvar_string("g_xonoticversion"), "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n"));
+ dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n");
+ sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.com/^1!\n"));
}
else if(r > 0)
{
- dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", cvar_string("g_xonoticversion"), "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
- sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", cvar_string("g_xonoticversion"), "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
+ dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
+ sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
}
}
}
if(frametime)
{
- if(self.health <= 0 && cvar("g_deathglow"))
+ if(self.health <= 0 && autocvar_g_deathglow)
{
if(self.glowmod_x > 0)
- self.glowmod_x -= cvar("g_deathglow") * frametime;
+ self.glowmod_x -= autocvar_g_deathglow * frametime;
else
self.glowmod_x = -1;
if(self.glowmod_y > 0)
- self.glowmod_y -= cvar("g_deathglow") * frametime;
+ self.glowmod_y -= autocvar_g_deathglow * frametime;
else
self.glowmod_y = -1;
if(self.glowmod_z > 0)
- self.glowmod_z -= cvar("g_deathglow") * frametime;
+ self.glowmod_z -= autocvar_g_deathglow * frametime;
else
self.glowmod_z = -1;
}
if(frametime)
player_anim();
button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE);
- force_respawn = (g_lms || (g_ca) || cvar("g_forced_respawn"));
+ force_respawn = (g_lms || g_ca || g_cts || autocvar_g_forced_respawn);
if (self.deadflag == DEAD_DYING)
{
if(force_respawn)
}
}
- if(g_lms && !self.deadflag && cvar("g_lms_campcheck_interval"))
+ if(g_lms && !self.deadflag && autocvar_g_lms_campcheck_interval)
{
vector dist;
dist_z = 0;
self.lms_traveled_distance += fabs(vlen(dist));
- if((cvar("g_campaign") && !campaign_bots_may_start) || (time < game_starttime))
+ if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime))
{
- self.lms_nextcheck = time + cvar("g_lms_campcheck_interval")*2;
+ self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval*2;
self.lms_traveled_distance = 0;
}
if(time > self.lms_nextcheck)
{
//sprint(self, "distance: ", ftos(self.lms_traveled_distance), "\n");
- if(self.lms_traveled_distance < cvar("g_lms_campcheck_distance"))
+ if(self.lms_traveled_distance < autocvar_g_lms_campcheck_distance)
{
- centerprint(self, cvar_string("g_lms_campcheck_message"));
+ centerprint(self, autocvar_g_lms_campcheck_message);
// FIXME KadaverJack: gibbing player here causes playermodel to bounce around, instead of eye.md3
// I wasn't able to find out WHY that happens, so I put a workaround in place that shall prevent players from being gibbed :(
- Damage(self, self, self, bound(0, cvar("g_lms_campcheck_damage"), self.health + self.armorvalue * cvar("g_balance_armor_blockpercent") + 5), DEATH_CAMP, self.origin, '0 0 0');
+ Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0');
}
- self.lms_nextcheck = time + cvar("g_lms_campcheck_interval");
+ self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval;
self.lms_traveled_distance = 0;
}
}
player_regen();
// rot nex charge to the charge limit
- if(cvar("g_balance_nex_charge_rot_rate") && self.nex_charge > cvar("g_balance_nex_charge_limit"))
- self.nex_charge = bound(cvar("g_balance_nex_charge_limit"), self.nex_charge - cvar("g_balance_nex_charge_rot_rate") * frametime / W_TICSPERFRAME, 1);
+ if(autocvar_g_balance_nex_charge_rot_rate && self.nex_charge > autocvar_g_balance_nex_charge_limit && self.nex_charge_rottime < time)
+ self.nex_charge = bound(autocvar_g_balance_nex_charge_limit, self.nex_charge - autocvar_g_balance_nex_charge_rot_rate * frametime / W_TICSPERFRAME, 1);
if(frametime)
player_anim();
if (g_minstagib)
minstagib_ammocheck();
- ctf_setstatus();
- nexball_setstatus();
+ if(g_ctf)
+ ctf_setstatus();
+
+ if(g_nexball)
+ nexball_setstatus();
- self.dmg_team = max(0, self.dmg_team - cvar("g_teamdamage_resetspeed") * frametime);
+ self.dmg_team = max(0, self.dmg_team - autocvar_g_teamdamage_resetspeed * frametime);
//self.angles_y=self.v_angle_y + 90; // temp
} else if(gameover) {
}
if(!zoomstate_set)
- SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_CAMPINGRIFLE && cvar("g_balance_campingrifle_secondary") == 0));
+ SetZoomState(self.BUTTON_ZOOM || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_SNIPERRIFLE && autocvar_g_balance_sniperrifle_secondary == 0));
float oldspectatee_status;
oldspectatee_status = self.spectatee_status;
case 32: // space
break;
case 192: // charmap space
- if (!cvar("utf8_enable"))
+ if (!autocvar_utf8_enable)
break;
return FALSE;
case 160: // space in unicode fonts
case 0xE000 + 192: // utf8 charmap space
- if (cvar("utf8_enable"))
+ if (autocvar_utf8_enable)
break;
default:
return FALSE;
stuffcmd(self, strcat("name ", self.netname, substring(ftos(random()), 2, -1), "\n"));
}
- // send the clients accuracy stats to the client
- if(self.stat_count > 0)
- if(frametime)
- {
- self.stat_hit = self.stat_count + 64 * floor(self.(stats_hit[self.stat_count - 1]));
- self.stat_fired = self.stat_count + 64 * floor(self.(stats_fired[self.stat_count - 1]));
- self.stat_count -= 1;
- }
-
if(sv_maxidle && frametime)
{
// WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
//pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
if(self.waypointsprite_attachedforcarrier)
- WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, cvar("g_balance_armor_blockpercent")));
+ WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
- if(self.classname == "player" && self.deadflag == DEAD_NO && cvar("r_showbboxes"))
+ if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
{
if(!self.showheadshotbbox)
{
playerdemo_write();
- if((g_cts || g_race) && self.cvar_cl_allow_uid2name)
+ if((g_cts || g_race) && self.cvar_cl_allow_uidtracking == 1 && self.cvar_cl_allow_uid2name == 1)
{
if(!self.stored_netname)
self.stored_netname = strzone(uid2name(self.crypto_idfp));
break;
case 17:
if (!g_minstagib)
- W_ThrowWeapon(W_CalculateProjectileVelocity(self.velocity, v_forward * 750), '0 0 0', TRUE);
+ W_ThrowWeapon(W_CalculateProjectileVelocity(self.velocity, v_forward * 750, FALSE), '0 0 0', TRUE);
break;
case 18:
W_NextWeapon (1);
}
else if(imp >= 103 && imp <= 107)
{
- if(cvar("g_waypointeditor"))
+ if(autocvar_g_waypointeditor)
{
switch(imp)
{
.float race_penalty;
.float restart_jump;
-float sv_accelerate;
-float sv_friction;
-float sv_maxspeed;
-float sv_airaccelerate;
-float sv_maxairspeed;
-float sv_stopspeed;
-float sv_gravity;
-float sv_airaccel_sideways_friction;
-float sv_airaccel_qw;
-float sv_airstopaccelerate;
-float sv_airstrafeaccelerate;
-float sv_maxairstrafespeed;
-float sv_airstrafeaccel_qw;
-float sv_aircontrol;
-float sv_aircontrol_power;
-float sv_aircontrol_penalty;
-float sv_warsowbunny_airforwardaccel;
-float sv_warsowbunny_accel;
-float sv_warsowbunny_topspeed;
-float sv_warsowbunny_turnaccel;
-float sv_warsowbunny_backtosideratio;
-float sv_airspeedlimit_nonqw;
-
.float ladder_time;
.entity ladder_entity;
.float gravity;
*/
void PlayerJump (void)
{
+ if(self.freezetag_frozen)
+ return; // no jumping in freezetag when frozen
+
float mjumpheight;
float doublejump;
doublejump = FALSE;
- if (sv_doublejump)
+ if (autocvar_sv_doublejump)
{
tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
doublejump = TRUE;
}
- mjumpheight = cvar("sv_jumpvelocity");
+ mjumpheight = autocvar_sv_jumpvelocity;
if (self.waterlevel >= WATERLEVEL_SWIMMING)
{
if (self.watertype == CONTENT_WATER)
return;
}
- if (cvar("g_multijump"))
+ if (autocvar_g_multijump)
{
if (self.prevjumpbutton == FALSE && !(self.flags & FL_ONGROUND)) // jump button pressed this frame and we are in midair
self.multijump_ready = TRUE; // this is necessary to check that we released the jump button and pressed it again
self.multijump_ready = FALSE;
}
- if(!doublejump && self.multijump_ready && self.multijump_count < cvar("g_multijump") && self.velocity_z > cvar("g_multijump_speed"))
+ if(!doublejump && self.multijump_ready && self.multijump_count < autocvar_g_multijump && self.velocity_z > autocvar_g_multijump_speed)
{
// doublejump = FALSE; // checked above in the if
- if (cvar("g_multijump") > 0)
+ if (autocvar_g_multijump > 0)
{
- if (cvar("g_multijump_add") == 0) // in this case we make the z velocity == jumpvelocity
+ if (autocvar_g_multijump_add == 0) // in this case we make the z velocity == jumpvelocity
{
if (self.velocity_z < mjumpheight)
{
if(self.health <= g_bloodloss)
return;
- if(g_runematch)
- {
- if(self.runes & RUNE_SPEED)
- {
- if(self.runes & CURSE_SLOW)
- mjumpheight = mjumpheight * cvar("g_balance_rune_speed_combo_jumpheight");
- else
- mjumpheight = mjumpheight * cvar("g_balance_rune_speed_jumpheight");
- }
- else if(self.runes & CURSE_SLOW)
- {
- mjumpheight = mjumpheight * cvar("g_balance_curse_slow_jumpheight");
- }
- }
-
- if(g_minstagib && (self.items & IT_INVINCIBLE))
- {
- mjumpheight = mjumpheight * cvar("g_minstagib_speed_jumpheight");
- }
-
// sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline
// velocity bounds. Final velocity is bound between (jumpheight *
// min + jumpheight) and (jumpheight * max + jumpheight);
- if(cvar_string("sv_jumpspeedcap_min") != "")
+ if(autocvar_sv_jumpspeedcap_min != "")
{
float minjumpspeed;
- minjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_min");
+ minjumpspeed = mjumpheight * stof(autocvar_sv_jumpspeedcap_min);
if (self.velocity_z < minjumpspeed)
mjumpheight += minjumpspeed - self.velocity_z;
}
- if(cvar_string("sv_jumpspeedcap_max") != "")
+ if(autocvar_sv_jumpspeedcap_max != "")
{
// don't do jump speedcaps on ramps to preserve old xonotic ramjump style
tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
- if(!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && cvar("sv_jumpspeedcap_max_disable_on_ramps")))
+ if(!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && autocvar_sv_jumpspeedcap_max_disable_on_ramps))
{
float maxjumpspeed;
- maxjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_max");
+ maxjumpspeed = mjumpheight * stof(autocvar_sv_jumpspeedcap_max);
if (self.velocity_z > maxjumpspeed)
mjumpheight -= self.velocity_z - maxjumpspeed;
if(!(self.lastflags & FL_ONGROUND))
{
- if(cvar("speedmeter"))
+ if(autocvar_speedmeter)
dprint(strcat("landing velocity: ", vtos(self.velocity), " (abs: ", ftos(vlen(self.velocity)), ")\n"));
if(self.lastground < time - 0.3)
{
- self.velocity_x *= (1 - cvar("sv_friction_on_land"));
- self.velocity_y *= (1 - cvar("sv_friction_on_land"));
+ self.velocity_x *= (1 - autocvar_sv_friction_on_land);
+ self.velocity_y *= (1 - autocvar_sv_friction_on_land);
}
if(self.jumppadcount > 1)
dprint(strcat(ftos(self.jumppadcount), "x jumppad combo\n"));
vector angles_save, rigvel;
angles_save = self.angles;
- accel = bound(-1, self.movement_x / sv_maxspeed, 1);
- steer = bound(-1, self.movement_y / sv_maxspeed, 1);
+ accel = bound(-1, self.movement_x / self.stat_sv_maxspeed, 1);
+ steer = bound(-1, self.movement_y / self.stat_sv_maxspeed, 1);
if(g_bugrigs_reverse_speeding)
{
vector rigvel_xy, neworigin, up;
float mt;
- rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+ rigvel_z -= frametime * autocvar_sv_gravity; // 4x gravity plays better
rigvel_xy = vec2(rigvel);
if(g_bugrigs_planar_movement_car_jumping && !g_touchexplode) // touchexplode is a better way to handle collisions
}
else
{
- rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+ rigvel_z -= frametime * autocvar_sv_gravity; // 4x gravity plays better
self.velocity = rigvel;
self.movetype = MOVETYPE_FLY;
}
return;
#endif
- k *= bound(0, wishspeed / sv_maxairspeed, 1);
+ k *= bound(0, wishspeed / autocvar_sv_maxairspeed, 1);
zspeed = self.velocity_z;
self.velocity_z = 0;
if(dot > 0) // we can't change direction while slowing down
{
- k *= pow(dot, sv_aircontrol_power)*frametime;
- xyspeed = max(0, xyspeed - sv_aircontrol_penalty * sqrt(max(0, 1 - dot*dot)) * k/32);
- k *= sv_aircontrol;
+ k *= pow(dot, autocvar_sv_aircontrol_power)*frametime;
+ xyspeed = max(0, xyspeed - autocvar_sv_aircontrol_penalty * sqrt(max(0, 1 - dot*dot)) * k/32);
+ k *= autocvar_sv_aircontrol;
self.velocity = normalize(self.velocity * xyspeed + wishdir * k);
}
if(speedclamp)
accelqw = -accelqw;
- if(cvar("sv_gameplayfix_q2airaccelerate"))
+ if(autocvar_sv_gameplayfix_q2airaccelerate)
wishspeed0 = wishspeed;
vel_straight = self.velocity * wishdir;
if(wishspeed > curspeed * 1.01)
{
- wishspeed = min(wishspeed, curspeed + sv_warsowbunny_airforwardaccel * sv_maxspeed * frametime);
+ wishspeed = min(wishspeed, curspeed + autocvar_sv_warsowbunny_airforwardaccel * self.stat_sv_maxspeed * frametime);
}
else
{
- f = max(0, (sv_warsowbunny_topspeed - curspeed) / (sv_warsowbunny_topspeed - sv_maxspeed));
- wishspeed = max(curspeed, sv_maxspeed) + sv_warsowbunny_accel * f * sv_maxspeed * frametime;
+ f = max(0, (autocvar_sv_warsowbunny_topspeed - curspeed) / (autocvar_sv_warsowbunny_topspeed - self.stat_sv_maxspeed));
+ wishspeed = max(curspeed, self.stat_sv_maxspeed) + autocvar_sv_warsowbunny_accel * f * self.stat_sv_maxspeed * frametime;
}
wishvel = wishdir * wishspeed;
acceldir = wishvel - curvel;
addspeed = vlen(acceldir);
acceldir = normalize(acceldir);
- accelspeed = min(addspeed, sv_warsowbunny_turnaccel * sv_maxspeed * frametime);
+ accelspeed = min(addspeed, autocvar_sv_warsowbunny_turnaccel * self.stat_sv_maxspeed * frametime);
- if(sv_warsowbunny_backtosideratio < 1)
+ if(autocvar_sv_warsowbunny_backtosideratio < 1)
{
curdir = normalize(curvel);
dot = acceldir * curdir;
if(dot < 0)
- acceldir = acceldir - (1 - sv_warsowbunny_backtosideratio) * dot * curdir;
+ acceldir = acceldir - (1 - autocvar_sv_warsowbunny_backtosideratio) * dot * curdir;
}
self.velocity += accelspeed * acceldir;
float not_allowed_to_move;
string c;
+ maxspd_mod = 1;
+ if(g_minstagib && (self.items & IT_INVINCIBLE))
+ maxspd_mod *= autocvar_g_minstagib_speed_highspeed;
+ if(self.ballcarried)
+ if(g_nexball)
+ maxspd_mod *= autocvar_g_nexball_basketball_carrier_highspeed;
+ else if(g_keepaway)
+ maxspd_mod *= autocvar_g_keepaway_ballcarrier_highspeed;
+
+ if(g_runematch)
+ {
+ if(self.runes & RUNE_SPEED)
+ {
+ if(self.runes & CURSE_SLOW)
+ maxspd_mod *= autocvar_g_balance_rune_speed_combo_highspeed;
+ else
+ maxspd_mod *= autocvar_g_balance_rune_speed_highspeed;
+ }
+ else if(self.runes & CURSE_SLOW)
+ {
+ maxspd_mod *= autocvar_g_balance_curse_slow_highspeed;
+ }
+ }
+ maxspd_mod *= autocvar_g_movement_highspeed;
+
// fix physics stats for g_movement_highspeed
- self.stat_sv_airaccel_qw = AdjustAirAccelQW(sv_airaccel_qw, autocvar_g_movement_highspeed);
- if(sv_airstrafeaccel_qw)
- self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(sv_airstrafeaccel_qw, autocvar_g_movement_highspeed);
+ self.stat_sv_airaccel_qw = AdjustAirAccelQW(autocvar_sv_airaccel_qw, maxspd_mod);
+ if(autocvar_sv_airstrafeaccel_qw)
+ self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(autocvar_sv_airstrafeaccel_qw, maxspd_mod);
else
self.stat_sv_airstrafeaccel_qw = 0;
- self.stat_sv_airspeedlimit_nonqw = sv_airspeedlimit_nonqw * autocvar_g_movement_highspeed;
+ self.stat_sv_airspeedlimit_nonqw = autocvar_sv_airspeedlimit_nonqw * maxspd_mod;
+ self.stat_sv_maxspeed = autocvar_sv_maxspeed * maxspd_mod; // also slow walking
if(self.PlayerPhysplug)
if(self.PlayerPhysplug())
self.v_angle_old = self.v_angle;
if(time < self.nickspamtime)
- if(self.nickspamcount >= cvar("g_nick_flood_penalty_yellow"))
+ if(self.nickspamcount >= autocvar_g_nick_flood_penalty_yellow)
{
// slight annoyance for nick change scripts
self.movement = -1 * self.movement;
self.BUTTON_ATCK = self.BUTTON_JUMP = self.BUTTON_ATCK2 = self.BUTTON_ZOOM = self.BUTTON_CROUCH = self.BUTTON_HOOK = self.BUTTON_USE = 0;
- if(self.nickspamcount >= cvar("g_nick_flood_penalty_red")) // if you are persistent and the slight annoyance above does not stop you, I'll show you!
+ if(self.nickspamcount >= autocvar_g_nick_flood_penalty_red) // if you are persistent and the slight annoyance above does not stop you, I'll show you!
{
self.angles_x = random() * 360;
self.angles_y = random() * 360;
bot_think();
}
- MUTATOR_CALLHOOK(PlayerPhysics);
-
self.items &~= IT_USING_JETPACK;
if(self.classname == "player")
not_allowed_to_move = 0;
if(self.race_penalty)
not_allowed_to_move = 1;
- if(!cvar("sv_ready_restart_after_countdown"))
+ if(!autocvar_sv_ready_restart_after_countdown)
if(time < game_starttime)
not_allowed_to_move = 1;
if (self.movetype == MOVETYPE_NONE)
return;
- maxspd_mod = 1;
+ // when we get here, disableclientprediction cannot be 2
+ self.disableclientprediction = 0;
+ if(time < self.ladder_time)
+ self.disableclientprediction = 1;
- if(g_runematch)
- {
- if(self.runes & RUNE_SPEED)
- {
- if(self.runes & CURSE_SLOW)
- maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_combo_moverate");
- else
- maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_moverate");
- }
- else if(self.runes & CURSE_SLOW)
- {
- maxspd_mod = maxspd_mod * cvar("g_balance_curse_slow_moverate");
- }
- }
-
- if(g_minstagib && (self.items & IT_INVINCIBLE))
- {
- maxspd_mod = cvar("g_minstagib_speed_moverate");
- }
+ MUTATOR_CALLHOOK(PlayerPhysics);
- if(g_nexball && self.ballcarried)
- {
- maxspd_mod = cvar("g_nexball_basketball_carrier_speed");
- }
+ maxspd_mod = 1;
swampspd_mod = 1;
if(self.in_swamp) {
if(self.classname != "player")
{
- maxspd_mod = cvar("sv_spectator_speed_multiplier");
+ maxspd_mod = autocvar_sv_spectator_speed_multiplier;
if(!self.spectatorspeed)
self.spectatorspeed = maxspd_mod;
if(self.impulse && self.impulse <= 19)
maxspd_mod = self.spectatorspeed;
}
- spd = max(sv_maxspeed, sv_maxairspeed) * maxspd_mod * swampspd_mod;
+ spd = max(self.stat_sv_maxspeed, autocvar_sv_maxairspeed) * maxspd_mod * swampspd_mod;
if(self.speed != spd)
{
self.speed = spd;
{
if(self.flags & FL_ONGROUND)
{
- if (cvar("g_multijump") > 0)
+ if (autocvar_g_multijump > 0)
self.multijump_count = 0;
else
self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
// noclipping or flying
self.flags &~= FL_ONGROUND;
- self.velocity = self.velocity * (1 - frametime * sv_friction);
+ self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
makevectors(self.v_angle);
//wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
// acceleration
wishdir = normalize(wishvel);
wishspeed = vlen(wishvel);
- if (wishspeed > sv_maxspeed*maxspd_mod)
- wishspeed = sv_maxspeed*maxspd_mod;
+ if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+ wishspeed = self.stat_sv_maxspeed*maxspd_mod;
if (time >= self.teleport_time)
- PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
}
else if (self.waterlevel >= WATERLEVEL_SWIMMING)
{
wishdir = normalize(wishvel);
wishspeed = vlen(wishvel);
- if (wishspeed > sv_maxspeed*maxspd_mod)
- wishspeed = sv_maxspeed*maxspd_mod;
+ if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+ wishspeed = self.stat_sv_maxspeed*maxspd_mod;
wishspeed = wishspeed * 0.7;
// water friction
- self.velocity = self.velocity * (1 - frametime * sv_friction);
+ self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
// water acceleration
- PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
}
else if (time < self.ladder_time)
{
// on a spawnfunc_func_ladder or swimming in spawnfunc_func_water
self.flags &~= FL_ONGROUND;
- self.velocity = self.velocity * (1 - frametime * sv_friction);
+ float g;
+ g = autocvar_sv_gravity * frametime;
+ if(self.gravity)
+ g *= self.gravity;
+ if(autocvar_sv_gameplayfix_gravityunaffectedbyticrate)
+ {
+ g *= 0.5;
+ self.velocity_z += g;
+ }
+
+ self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
makevectors(self.v_angle);
//wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
- if (self.gravity)
- self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
- else
- self.velocity_z = self.velocity_z + sv_gravity * frametime;
+ self.velocity_z += g;
if (self.ladder_entity.classname == "func_water")
{
f = vlen(wishvel);
// acceleration
wishdir = normalize(wishvel);
wishspeed = vlen(wishvel);
- if (wishspeed > sv_maxspeed*maxspd_mod)
- wishspeed = sv_maxspeed*maxspd_mod;
+ if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+ wishspeed = self.stat_sv_maxspeed*maxspd_mod;
if (time >= self.teleport_time)
{
// water acceleration
- PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
}
}
- else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!cvar("g_jetpack_fuel") || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO))
+ else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO))
{
//makevectors(self.v_angle_y * '0 1 0');
makevectors(self.v_angle);
wishvel = v_forward * self.movement_x + v_right * self.movement_y;
// add remaining speed as Z component
- maxairspd = sv_maxairspeed*max(1, maxspd_mod);
+ maxairspd = autocvar_sv_maxairspeed*max(1, maxspd_mod);
// fix speedhacks :P
wishvel = normalize(wishvel) * min(vlen(wishvel) / maxairspd, 1);
// add the unused velocity as up component
// it is now normalized, so...
float a_side, a_up, a_add, a_diff;
- a_side = cvar("g_jetpack_acceleration_side");
- a_up = cvar("g_jetpack_acceleration_up");
- a_add = cvar("g_jetpack_antigravity") * sv_gravity;
+ a_side = autocvar_g_jetpack_acceleration_side;
+ a_up = autocvar_g_jetpack_acceleration_up;
+ a_add = autocvar_g_jetpack_antigravity * autocvar_sv_gravity;
wishvel_x *= a_side;
wishvel_y *= a_side;
//print("best possible acceleration: ", ftos(best), "\n");
float fxy, fz;
- fxy = bound(0, 1 - (self.velocity * normalize(wishvel_x * '1 0 0' + wishvel_y * '0 1 0')) / cvar("g_jetpack_maxspeed_side"), 1);
- if(wishvel_z - sv_gravity > 0)
- fz = bound(0, 1 - self.velocity_z / cvar("g_jetpack_maxspeed_up"), 1);
+ fxy = bound(0, 1 - (self.velocity * normalize(wishvel_x * '1 0 0' + wishvel_y * '0 1 0')) / autocvar_g_jetpack_maxspeed_side, 1);
+ if(wishvel_z - autocvar_sv_gravity > 0)
+ fz = bound(0, 1 - self.velocity_z / autocvar_g_jetpack_maxspeed_up, 1);
else
- fz = bound(0, 1 + self.velocity_z / cvar("g_jetpack_maxspeed_up"), 1);
+ fz = bound(0, 1 + self.velocity_z / autocvar_g_jetpack_maxspeed_up, 1);
float fvel;
fvel = vlen(wishvel);
wishvel_x *= fxy;
wishvel_y *= fxy;
- wishvel_z = (wishvel_z - sv_gravity) * fz + sv_gravity;
+ wishvel_z = (wishvel_z - autocvar_sv_gravity) * fz + autocvar_sv_gravity;
fvel = min(1, vlen(wishvel) / best);
- if(cvar("g_jetpack_fuel") && !(self.items & IT_UNLIMITED_WEAPON_AMMO))
- f = min(1, self.ammo_fuel / (cvar("g_jetpack_fuel") * frametime * fvel));
+ if(autocvar_g_jetpack_fuel && !(self.items & IT_UNLIMITED_WEAPON_AMMO))
+ f = min(1, self.ammo_fuel / (autocvar_g_jetpack_fuel * frametime * fvel));
else
f = 1;
{
self.velocity = self.velocity + wishvel * f * frametime;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_fuel -= cvar("g_jetpack_fuel") * frametime * fvel * f;
+ self.ammo_fuel -= autocvar_g_jetpack_fuel * frametime * fvel * f;
self.flags &~= FL_ONGROUND;
self.items |= IT_USING_JETPACK;
// jetpack also inhibits health regeneration, but only for 1 second
- self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_fuel_regen"));
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_fuel_regen);
}
}
else if (self.flags & FL_ONGROUND)
if(!(self.lastflags & FL_ONGROUND))
{
- if(cvar("speedmeter"))
+ if(autocvar_speedmeter)
dprint(strcat("landing velocity: ", vtos(self.velocity), " (abs: ", ftos(vlen(self.velocity)), ")\n"));
if(self.lastground < time - 0.3)
- self.velocity = self.velocity * (1 - cvar("sv_friction_on_land"));
+ self.velocity = self.velocity * (1 - autocvar_sv_friction_on_land);
if(self.jumppadcount > 1)
dprint(strcat(ftos(self.jumppadcount), "x jumppad combo\n"));
self.jumppadcount = 0;
f = vlen(v);
if(f > 0)
{
- if (f < sv_stopspeed)
- f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
+ if (f < autocvar_sv_stopspeed)
+ f = 1 - frametime * (autocvar_sv_stopspeed / f) * autocvar_sv_friction;
else
- f = 1 - frametime * sv_friction;
+ f = 1 - frametime * autocvar_sv_friction;
if (f > 0)
self.velocity = self.velocity * f;
else
// acceleration
wishdir = normalize(wishvel);
wishspeed = vlen(wishvel);
- if (wishspeed > sv_maxspeed*maxspd_mod)
- wishspeed = sv_maxspeed*maxspd_mod;
+ if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
+ wishspeed = self.stat_sv_maxspeed*maxspd_mod;
if (self.crouch)
wishspeed = wishspeed * 0.5;
if (time >= self.teleport_time)
- PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
+ PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0);
}
else
{
if(maxspd_mod < 1)
{
- maxairspd = sv_maxairspeed*maxspd_mod;
- airaccel = sv_airaccelerate*maxspd_mod;
+ maxairspd = autocvar_sv_maxairspeed*maxspd_mod;
+ airaccel = autocvar_sv_airaccelerate*maxspd_mod;
}
else
{
- maxairspd = sv_maxairspeed;
- airaccel = sv_airaccelerate;
+ maxairspd = autocvar_sv_maxairspeed;
+ airaccel = autocvar_sv_airaccelerate;
}
// airborn
makevectors(self.v_angle_y * '0 1 0');
// acceleration
wishdir = normalize(wishvel);
wishspeed = wishspeed0 = vlen(wishvel);
- if (wishspeed0 > sv_maxspeed*maxspd_mod)
- wishspeed0 = sv_maxspeed*maxspd_mod;
+ if (wishspeed0 > self.stat_sv_maxspeed*maxspd_mod)
+ wishspeed0 = self.stat_sv_maxspeed*maxspd_mod;
if (wishspeed > maxairspd)
wishspeed = maxairspd;
if (self.crouch)
wishspeed2 = wishspeed;
// CPM
- if(sv_airstopaccelerate)
+ if(autocvar_sv_airstopaccelerate)
{
vector curdir;
curdir = self.velocity;
curdir_z = 0;
curdir = normalize(curdir);
- airaccel = airaccel + (sv_airstopaccelerate*maxspd_mod - airaccel) * max(0, -(curdir * wishdir));
+ airaccel = airaccel + (autocvar_sv_airstopaccelerate*maxspd_mod - airaccel) * max(0, -(curdir * wishdir));
}
// note that for straight forward jumping:
// step = accel * frametime * wishspeed0;
// log dv/dt = logaccel + logmaxspeed (when slow)
// log dv/dt = logaccel + logmaxspeed + log(1 - accelqw) (when fast)
strafity = IsMoveInDirection(self.movement, -90) + IsMoveInDirection(self.movement, +90); // if one is nonzero, other is always zero
- if(sv_maxairstrafespeed)
- wishspeed = min(wishspeed, GeomLerp(sv_maxairspeed*maxspd_mod, strafity, sv_maxairstrafespeed*maxspd_mod));
- if(sv_airstrafeaccelerate)
- airaccel = GeomLerp(airaccel, strafity, sv_airstrafeaccelerate*maxspd_mod);
+ if(autocvar_sv_maxairstrafespeed)
+ wishspeed = min(wishspeed, GeomLerp(autocvar_sv_maxairspeed*maxspd_mod, strafity, autocvar_sv_maxairstrafespeed*maxspd_mod));
+ if(autocvar_sv_airstrafeaccelerate)
+ airaccel = GeomLerp(airaccel, strafity, autocvar_sv_airstrafeaccelerate*maxspd_mod);
if(self.stat_sv_airstrafeaccel_qw)
airaccelqw = copysign(1-GeomLerp(1-fabs(self.stat_sv_airaccel_qw), strafity, 1-fabs(self.stat_sv_airstrafeaccel_qw)), ((strafity > 0.5) ? self.stat_sv_airstrafeaccel_qw : self.stat_sv_airaccel_qw));
// !CPM
- if(sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
+ if(autocvar_sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
PM_AirAccelerate(wishdir, wishspeed);
else
- PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
+ PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, autocvar_sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
- if(sv_aircontrol)
+ if(autocvar_sv_aircontrol)
CPM_PM_Aircontrol(wishdir, wishspeed2);
}
}
rr = RACE_RECORD;
race_send_speedaward(MSG_ALL);
speedaward_lastsent = speedaward_speed;
- if (speedaward_speed > speedaward_alltimebest) {
+ if (speedaward_speed > speedaward_alltimebest && speedaward_uid != "") {
speedaward_alltimebest = speedaward_speed;
speedaward_alltimebest_holder = speedaward_holder;
speedaward_alltimebest_uid = speedaward_uid;
float xyspeed;
xyspeed = vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y);
- if(self.weapon == WEP_NEX && cvar("g_balance_nex_charge") && cvar("g_balance_nex_charge_velocity_rate") && xyspeed > cvar("g_balance_nex_charge_minspeed"))
+ if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge && autocvar_g_balance_nex_charge_velocity_rate && xyspeed > autocvar_g_balance_nex_charge_minspeed)
{
// add a maximum of charge_velocity_rate when going fast (f = 1), gradually increasing from minspeed (f = 0) to maxspeed
- xyspeed = min(xyspeed, cvar("g_balance_nex_charge_maxspeed"));
- f = (xyspeed - cvar("g_balance_nex_charge_minspeed")) / (cvar("g_balance_nex_charge_maxspeed") - cvar("g_balance_nex_charge_minspeed"));
+ xyspeed = min(xyspeed, autocvar_g_balance_nex_charge_maxspeed);
+ f = (xyspeed - autocvar_g_balance_nex_charge_minspeed) / (autocvar_g_balance_nex_charge_maxspeed - autocvar_g_balance_nex_charge_minspeed);
// add the extra charge
- self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_velocity_rate") * f * frametime);
+ self.nex_charge = min(1, self.nex_charge + autocvar_g_balance_nex_charge_velocity_rate * f * frametime);
}
:end
if(self.flags & FL_ONGROUND)
void WeaponStats_Init()
{
- if(cvar_string("sv_weaponstats_killfile") != "" || cvar_string("sv_weaponstats_damagefile") != "")
+ if(autocvar_sv_weaponstats_file != "")
weaponstats_buffer = buf_create();
else
weaponstats_buffer = -1;
}
-#define WEAPONSTATS_GETINDEX(awep,vwep) ((vwep) + (awep) * (WEP_LAST - WEP_FIRST + 1) - (WEP_FIRST + WEP_FIRST * (WEP_LAST - WEP_FIRST + 1)))
+#define WEAPONSTATS_GETINDEX(awep,abot,vwep,vbot) (((vwep) + (awep) * (WEP_LAST - WEP_FIRST + 1) - (WEP_FIRST + WEP_FIRST * (WEP_LAST - WEP_FIRST + 1))) * 4 + (abot) * 2 + (vbot))
void WeaponStats_Shutdown()
{
- float i, j, idx, f;
+ float i, j, ibot, jbot, idx;
float fh;
+ vector v;
string prefix;
if(weaponstats_buffer < 0)
return;
- prefix = strcat(cvar_string("hostname"), "\t", GetGametype(), "_", GetMapname(), "\t");
- if(cvar_string("sv_weaponstats_killfile") != "")
+ prefix = strcat(autocvar_hostname, "\t", GetGametype(), "_", GetMapname(), "\t");
+ if(autocvar_sv_weaponstats_file != "")
{
- fh = fopen(cvar_string("sv_weaponstats_killfile"), FILE_APPEND);
+ fh = fopen(autocvar_sv_weaponstats_file, FILE_APPEND);
if(fh >= 0)
{
- fputs(fh, "#begin killfile\n");
+ fputs(fh, "#begin statsfile\n");
fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_changes)), "\n"));
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+ for(i = WEP_FIRST; i <= WEP_LAST; ++i) for(ibot = 0; ibot <= 1; ++ibot)
+ for(j = WEP_FIRST; j <= WEP_LAST; ++j) for(jbot = 0; jbot <= 1; ++jbot)
{
- idx = WEAPONSTATS_GETINDEX(i, j);
- f = stov(bufstr_get(weaponstats_buffer, idx)) * '0 1 0';
- if(f != 0)
- fputs(fh, strcat(prefix, ftos(i), "\t", ftos(j), "\t", ftos(f), "\n"));
- }
- fputs(fh, "#end\n\n");
- fclose(fh);
- print("Weapon kill stats written\n");
- }
- }
- if(cvar_string("sv_weaponstats_damagefile") != "")
- {
- fh = fopen(cvar_string("sv_weaponstats_damagefile"), FILE_APPEND);
- if(fh >= 0)
- {
- fputs(fh, "#begin damagefile\n");
- fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
- fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_changes)), "\n"));
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- for(j = WEP_FIRST; j <= WEP_LAST; ++j)
- {
- idx = WEAPONSTATS_GETINDEX(i, j);
- f = stov(bufstr_get(weaponstats_buffer, idx)) * '1 0 0';
- if(f != 0)
- fputs(fh, strcat(prefix, ftos(i), "\t", ftos(j), "\t", ftos(f), "\n"));
+ idx = WEAPONSTATS_GETINDEX(i, ibot, j, jbot);
+ v = stov(bufstr_get(weaponstats_buffer, idx));
+ if(v != '0 0 0')
+ {
+ //vector is: kills hits damage
+ fputs(fh, sprintf("%s%d %d\t%d %d\t", prefix, i, ibot, j, jbot));
+ fputs(fh, sprintf("%d %d %g\n", v_x, v_y, v_z));
+ }
}
fputs(fh, "#end\n\n");
fclose(fh);
- print("Weapon damage stats written\n");
+ print("Weapon stats written\n");
}
}
buf_del(weaponstats_buffer);
weaponstats_buffer = -1;
}
-void WeaponStats_LogItem(float awep, float vwep, vector item)
+void WeaponStats_LogItem(float awep, float abot, float vwep, float vbot, vector item)
{
float idx;
if(weaponstats_buffer < 0)
return;
if(awep > WEP_LAST || vwep > WEP_LAST)
return;
- idx = WEAPONSTATS_GETINDEX(awep,vwep);
+ idx = WEAPONSTATS_GETINDEX(awep,abot,vwep,vbot);
bufstr_set(weaponstats_buffer, idx, vtos(stov(bufstr_get(weaponstats_buffer, idx)) + item));
}
-void WeaponStats_LogDamage(float awep, float vwep, float damage)
+void WeaponStats_LogDamage(float awep, float abot, float vwep, float vbot, float damage)
{
if(damage < 0)
error("negative damage?");
- WeaponStats_LogItem(awep, vwep, '1 0 0' * damage);
+ WeaponStats_LogItem(awep, abot, vwep, vbot, '0 0 1' * damage + '0 1 0');
}
-void WeaponStats_LogKill(float awep, float vwep)
+void WeaponStats_LogKill(float awep, float abot, float vwep, float vbot)
{
- WeaponStats_LogItem(awep, vwep, '0 1 0');
+ WeaponStats_LogItem(awep, abot, vwep, vbot, '1 0 0');
}
// changes by LordHavoc on 03/29/04 and 03/30/04 at Vermeulen's request
float player_getspecies()
{
float s;
- get_model_parameters(self.playermodel, self.skinindex);
+ get_model_parameters(self.model, self.skinindex);
s = get_model_parameters_species;
get_model_parameters(string_null, 0);
if(s < 0)
{
if(self.weapons & W_WeaponBit(j))
if(W_IsWeaponThrowable(j))
- W_ThrowNewWeapon(self, j, FALSE, self.origin, randomvec() * 175 + '0 0 325');
+ W_ThrowNewWeapon(self, j, FALSE, org, randomvec() * 175 + '0 0 325');
}
}
else
- W_ThrowWeapon(randomvec() * 125 + '0 0 200', org - self.origin, FALSE);
+ {
+ if(W_IsWeaponThrowable(self.weapon))
+ W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
+ }
}
void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
// damage resistance (ignore most of the damage from a bullet or similar)
damage = max(damage - 5, 1);
- v = healtharmor_applydamage(self.armorvalue, cvar("g_balance_armor_blockpercent"), damage);
+ v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
take = v_x;
save = v_y;
self.armorvalue = self.armorvalue - save;
self.health = self.health - take;
// pause regeneration for 5 seconds
- self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_health_regen"));
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen);
}
self.dmg_save = self.dmg_save + save;//max(save - 10, 0);
self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
self.dmg_inflictor = inflictor;
- if (self.health <= -100 && self.modelindex != 0)
+ if (self.health <= -150 && self.modelindex != 0)
{
// don't use any animations as a gib
self.frame = 0;
}
void ClientKill_Now_TeamChange();
+void freezetag_CheckWinner();
void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
local float take, save, waves, sdelay, dh, da, j;
vector v;
float valid_damage_for_weaponstats;
+ float excess;
+
+ if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage)
+ return;
dh = max(self.health, 0);
da = max(self.armorvalue, 0);
else
Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
- if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage)
- return;
-
if (!g_minstagib)
{
- v = healtharmor_applydamage(self.armorvalue, cvar("g_balance_armor_blockpercent"), damage);
+ v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
take = v_x;
save = v_y;
}
damage_take = take;
damage_save = save;
damage_force = force;
- MUTATOR_CALLHOOK(PlayerDamage);
+ MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor);
take = bound(0, damage_take, self.health);
save = bound(0, damage_save, self.armorvalue);
+ excess = max(0, damage - take - save);
if(sound_allowed(MSG_BROADCAST, attacker))
{
self.armorvalue = self.armorvalue - save;
self.health = self.health - take;
// pause regeneration for 5 seconds
- self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_health_regen"));
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_health_regen);
if (time > self.pain_finished) //Don't switch pain sequences like crazy
{
}
if(sound_allowed(MSG_BROADCAST, attacker))
- if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1)
+ if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * autocvar_g_balance_laser_primary_damage * autocvar_g_balance_selfdamagepercent + 1)
if(self.health > 1)
// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
{
else if(attacker.classname == "player" || attacker.classname == "gib")
{
self.pusher = attacker;
- self.pushltime = time + cvar("g_maxpushtime");
+ self.pushltime = time + autocvar_g_maxpushtime;
}
else if(time < self.pushltime)
{
else
self.pushltime = 0;
+ float abot, vbot, awep;
+ abot = (clienttype(attacker) == CLIENTTYPE_BOT);
+ vbot = (clienttype(self) == CLIENTTYPE_BOT);
+
valid_damage_for_weaponstats = 0;
- if(clienttype(self) == CLIENTTYPE_REAL)
- if(clienttype(attacker) == CLIENTTYPE_REAL)
- if(self != attacker)
- if(!DEATH_ISSPECIAL(deathtype))
+ if(vbot || clienttype(self) == CLIENTTYPE_REAL)
+ if(abot || clienttype(attacker) == CLIENTTYPE_REAL)
+ if(attacker && self != attacker)
if(IsDifferentTeam(self, attacker))
+ {
+ if(DEATH_ISSPECIAL(deathtype))
+ awep = attacker.weapon;
+ else
+ awep = DEATH_WEAPONOF(deathtype);
valid_damage_for_weaponstats = 1;
+ }
if(valid_damage_for_weaponstats)
{
dh = dh - max(self.health, 0);
da = da - max(self.armorvalue, 0);
- WeaponStats_LogDamage(DEATH_WEAPONOF(deathtype), self.weapon, dh + da);
+ WeaponStats_LogDamage(awep, abot, self.weapon, vbot, dh + da);
}
if (self.health < 1)
float defer_ClientKill_Now_TeamChange;
defer_ClientKill_Now_TeamChange = FALSE;
+ if(self.alivetime)
+ {
+ PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+ self.alivetime = 0;
+ }
+
if(valid_damage_for_weaponstats)
- WeaponStats_LogKill(DEATH_WEAPONOF(deathtype), self.weapon);
+ WeaponStats_LogKill(awep, abot, self.weapon, vbot);
if(sv_gentle < 1) // TODO make a "gentle" version?
if(sound_allowed(MSG_BROADCAST, attacker))
}
}
- // become fully visible
- self.alpha = 1;
- // clear selected player display
- ClearSelectedPlayer();
- // throw a weapon
- SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+ if(!g_freezetag)
+ {
+ // become fully visible
+ self.alpha = 1;
+ // clear selected player display
+ ClearSelectedPlayer();
+ // throw a weapon
+ SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+ }
+
// print an obituary message
Obituary (attacker, inflictor, self, deathtype);
race_PreDie();
DropAllRunes(self);
+ if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
+ {
+ PutClientInServer();
+ count_alive_players(); // re-count players
+ freezetag_CheckWinner();
+ return;
+ }
+
frag_attacker = attacker;
frag_inflictor = inflictor;
frag_target = self;
else
DropFlag(self.flagcarried, world, attacker);
}
- if(self.ballcarried)
+ if(self.ballcarried && g_nexball)
DropBall(self.ballcarried, self.origin, self.velocity);
Portal_ClearAllLater(self);
- // clear waypoints
+
+ if(clienttype(self) == CLIENTTYPE_REAL)
+ {
+ stuffcmd(self, "-zoom\n");
+ self.fixangle = TRUE;
+ //msg_entity = self;
+ //WriteByte (MSG_ONE, SVC_SETANGLE);
+ //WriteAngle (MSG_ONE, self.v_angle_x);
+ //WriteAngle (MSG_ONE, self.v_angle_y);
+ //WriteAngle (MSG_ONE, 80);
+ }
+
+ if(defer_ClientKill_Now_TeamChange) // TODO does this work with FreezeTag?
+ ClientKill_Now_TeamChange();
+
+ if(g_arena)
+ Spawnqueue_Unmark(self);
+
+ if(g_freezetag)
+ return;
+
+ // when we get here, player actually dies
+ // clear waypoints (do this AFTER FreezeTag)
WaypointSprite_PlayerDead();
+
// make the corpse upright (not tilted)
self.angles_x = 0;
self.angles_z = 0;
self.movetype = MOVETYPE_TOSS;
// shootable corpse
self.solid = SOLID_CORPSE;
- self.ballistics_density = cvar("g_ballistics_density_corpse");
+ self.ballistics_density = autocvar_g_ballistics_density_corpse;
// don't stick to the floor
self.flags &~= FL_ONGROUND;
// dying animation
waves = 0;
sdelay = cvar(strcat("g_", GetGametype(), "_respawn_delay"));
if(!sdelay)
- sdelay = cvar("g_respawn_delay");
+ {
+ if(g_cts)
+ sdelay = 0; // no respawn delay in CTS
+ else
+ sdelay = autocvar_g_respawn_delay;
+ }
waves = cvar(strcat("g_", GetGametype(), "_respawn_waves"));
if(!waves)
- waves = cvar("g_respawn_waves");
+ waves = autocvar_g_respawn_waves;
if(waves)
self.death_time = ceil((time + sdelay) / waves) * waves;
else
// set damage function to corpse damage
self.event_damage = PlayerCorpseDamage;
// call the corpse damage function just in case it wants to gib
- self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force);
+ self.event_damage(inflictor, attacker, excess, deathtype, hitloc, force);
// set up to fade out later
SUB_SetFade (self, time + 6 + random (), 1);
- if(clienttype(self) == CLIENTTYPE_REAL)
- {
- self.fixangle = TRUE;
- //msg_entity = self;
- //WriteByte (MSG_ONE, SVC_SETANGLE);
- //WriteAngle (MSG_ONE, self.v_angle_x);
- //WriteAngle (MSG_ONE, self.v_angle_y);
- //WriteAngle (MSG_ONE, 80);
- }
-
- if(g_arena)
- Spawnqueue_Unmark(self);
-
- if(defer_ClientKill_Now_TeamChange)
- ClientKill_Now_TeamChange();
-
- if(sv_gentle > 0 || cvar("ekg")) {
+ if(sv_gentle > 0 || autocvar_ekg) {
// remove corpse
PlayerCorpseDamage (inflictor, attacker, 100.0, deathtype, hitloc, force);
}
// reset fields the weapons may use just in case
- for (j = WEP_FIRST; j <= WEP_LAST; ++j)
+ for (j = WEP_FIRST; j <= WEP_LAST; ++j)
{
- weapon_action(j, WR_RESETPLAYER);
+ weapon_action(j, WR_RESETPLAYER);
ATTACK_FINISHED_FOR(self, j) = 0;
}
}
selected = world;
selected_score = 0.95; // 18 degrees
- if(!cvar("sv_allow_shownames"))
+ if(!autocvar_sv_allow_shownames)
return;
if(clienttype(self) != CLIENTTYPE_REAL)
}
*/
- if(cvar("g_chat_teamcolors"))
+ if(autocvar_g_chat_teamcolors)
namestr = playername(source);
else
namestr = source.netname;
privatemsgprefixlen = strlen(msgstr);
msgstr = strcat(msgstr, msgin);
cmsgstr = strcat(colorstr, "^3", namestr, "^3 tells you:\n^7", msgin);
- if(cvar("g_chat_teamcolors"))
+ if(autocvar_g_chat_teamcolors)
privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", playername(privatesay), ": ^7");
else
privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", privatesay.netname, ": ^7");
float lines;
if(privatesay)
{
- flood_spl = cvar("g_chat_flood_spl_tell");
- flood_burst = cvar("g_chat_flood_burst_tell");
- flood_lmax = cvar("g_chat_flood_lmax_tell");
+ flood_spl = autocvar_g_chat_flood_spl_tell;
+ flood_burst = autocvar_g_chat_flood_burst_tell;
+ flood_lmax = autocvar_g_chat_flood_lmax_tell;
flood_field = floodcontrol_chattell;
}
else if(teamsay)
{
- flood_spl = cvar("g_chat_flood_spl_team");
- flood_burst = cvar("g_chat_flood_burst_team");
- flood_lmax = cvar("g_chat_flood_lmax_team");
+ flood_spl = autocvar_g_chat_flood_spl_team;
+ flood_burst = autocvar_g_chat_flood_burst_team;
+ flood_lmax = autocvar_g_chat_flood_lmax_team;
flood_field = floodcontrol_chatteam;
}
else
{
- flood_spl = cvar("g_chat_flood_spl");
- flood_burst = cvar("g_chat_flood_burst");
- flood_lmax = cvar("g_chat_flood_lmax");
+ flood_spl = autocvar_g_chat_flood_spl;
+ flood_burst = autocvar_g_chat_flood_burst;
+ flood_lmax = autocvar_g_chat_flood_lmax;
flood_field = floodcontrol_chat;
}
flood_burst = max(0, flood_burst - 1);
if(flood == 2) // cannot happen for empty msgstr
{
- if(cvar("g_chat_flood_notify_flooder"))
+ if(autocvar_g_chat_flood_notify_flooder)
{
sourcemsgstr = strcat(msgstr, "\n^3FLOOD CONTROL: ^7message too long, trimmed\n");
sourcecmsgstr = "";
if(!privatesay)
if(source.classname != "player")
{
- if(teamsay || (cvar("g_chat_nospectators") == 1) || (cvar("g_chat_nospectators") == 2 && !inWarmupStage))
+ if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !inWarmupStage))
teamsay = -1; // spectators
}
}
else if(flood == 1)
{
- if(cvar("g_chat_flood_notify_flooder"))
+ if(autocvar_g_chat_flood_notify_flooder)
{
sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.flood_field - time), "^3 seconds\n"));
ret = 0;
}
string allvoicesamples;
-float GetPlayerSoundSampleField_notFound;
-float GetPlayerSoundSampleField_fixed;
.string GetVoiceMessageSampleField(string type)
{
GetPlayerSoundSampleField_notFound = 0;
- GetPlayerSoundSampleField_fixed = 0;
switch(type)
{
#define _VOICEMSG(m) case #m: return playersound_##m;
.string GetPlayerSoundSampleField(string type)
{
GetPlayerSoundSampleField_notFound = 0;
- GetPlayerSoundSampleField_fixed = 0;
switch(type)
{
#define _VOICEMSG(m) case #m: return playersound_##m;
#undef _VOICEMSG
}
-void LoadPlayerSounds(string f, float first)
+float LoadPlayerSounds(string f, float first)
{
float fh;
string s;
if(fh < 0)
{
dprint("Player sound file not found: ", f, "\n");
- return;
+ return 0;
}
while((s = fgets(fh)))
{
field = GetVoiceMessageSampleField(argv(0));
if(GetPlayerSoundSampleField_notFound)
continue;
- if(GetPlayerSoundSampleField_fixed)
- if not(first)
- continue;
if(self.field)
strunzone(self.field);
self.field = strzone(strcat(argv(1), " ", argv(2)));
}
fclose(fh);
+ return 1;
}
.float modelindex_for_playersound;
self.skinindex_for_playersound = self.skinindex;
ClearPlayerSounds();
LoadPlayerSounds("sound/player/default.sounds", 1);
- LoadPlayerSounds(get_model_datafilename(self.playermodel, self.skinindex, "sounds"), 0);
+ if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
+ LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
}
void FakeGlobalSound(string sample, float chan, float voicetype)
void W_Reload()
{
- if(self.switchweapon == self.weapon)
- if(self.weaponentity.state == WS_READY)
- weapon_action(self.weapon, WR_RELOAD);
+ self.wish_reload = 1;
}
// switch between weapons
float W_IsWeaponThrowable(float w)
{
float wb, wa;
+
+ if (!autocvar_g_pickup_items)
+ return 0;
+ if (g_weaponarena)
+ return 0;
+ if (g_lms)
+ return 0;
+ if (g_ca)
+ return 0;
+ if (g_cts)
+ return 0;
+ if (g_nexball && w == WEP_GRENADE_LAUNCHER)
+ return 0;
+
wb = W_WeaponBit(w);
if(!wb)
return 0;
return; // just in case
if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon))
return;
- if (g_weaponarena)
+ if(!autocvar_g_weapon_throwable)
return;
- if (g_lms)
+ if(autocvar_g_weapon_stay == 1)
return;
- if (g_nexball && w == WEP_GRENADE_LAUNCHER)
- return;
- if (!cvar("g_pickup_items"))
- return;
- if (g_ca)
- return;
- if(!cvar("g_weapon_throwable"))
- return;
- if(cvar("g_weapon_stay") == 1)
+ if(self.weaponentity.state != WS_READY)
return;
if(!W_IsWeaponThrowable(w))
return;
- if(self.deadflag == DEAD_NO && self.weaponentity.state != WS_READY)
- return;
wb = W_WeaponBit(w);
if(self.weapons & wb != wb)
a = W_ThrowNewWeapon(self, w, doreduce, self.origin + delta, velo);
if not(a)
return;
- if(self.health >= 1)
- {
- if(a == "")
- sprint(self, strcat("You dropped the ^2", W_Name(w), "\n"));
- else
- sprint(self, strcat("You dropped the ^2", W_Name(w), " with ", a, "\n"));
- }
+ if(a == "")
+ sprint(self, strcat("You dropped the ^2", W_Name(w), "\n"));
+ else
+ sprint(self, strcat("You dropped the ^2", W_Name(w), " with ", a, "\n"));
};
// Bringed back weapon frame
if (frametime)
self.weapon_frametime = frametime;
- if(((arena_roundbased || g_ca) && time < warmup) || ((time < game_starttime) && !cvar("sv_ready_restart_after_countdown")))
+ if(((arena_roundbased || g_ca || g_freezetag) && time < warmup) || ((time < game_starttime) && !autocvar_sv_ready_restart_after_countdown))
+ return;
+
+ if(g_freezetag && self.freezetag_frozen == 1)
return;
if (!self.weaponentity || self.health < 1)
weapon_action(self.switchweapon, WR_SETUP);
// VorteX: add player model weapon select frame here
// setcustomframe(PlayerWeaponRaise);
- weapon_thinkf(WFRAME_IDLE, cvar("g_balance_weaponswitchdelay"), w_ready);
+ weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_weaponswitchdelay, w_ready);
weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');
}
else if (self.weaponentity.state == WS_READY)
sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
self.weaponentity.state = WS_DROP;
// set up weapon switch think in the future, and start drop anim
- weapon_thinkf(WFRAME_DONTCHANGE, cvar("g_balance_weaponswitchdelay"), w_clear);
+ weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_weaponswitchdelay, w_clear);
weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);
#ifndef INDEPENDENT_ATTACK_FINISHED
}
v_forward = fo;
v_right = ri;
v_up = up;
+ self.weaponentity_glowmod = '0 0 0'; // reset glowmod, weapon think function only *might* set it
weapon_action(self.weapon, WR_THINK);
}
if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink)
if(self.runes & RUNE_SPEED)
{
if(self.runes & CURSE_SLOW)
- t = t * cvar("g_balance_rune_speed_combo_atkrate");
+ t = t * autocvar_g_balance_rune_speed_combo_atkrate;
else
- t = t * cvar("g_balance_rune_speed_atkrate");
+ t = t * autocvar_g_balance_rune_speed_atkrate;
}
else if(self.runes & CURSE_SLOW)
{
- t = t * cvar("g_balance_curse_slow_atkrate");
+ t = t * autocvar_g_balance_curse_slow_atkrate;
}
}
// make sure you call makevectors first (FIXME?)
.float prevstrengthsound;
.float prevstrengthsoundattempt;
-void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float maxdamage, float range)
+void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float chan, float maxdamage, float range)
{
float nudge = 1; // added to traceline target and subtracted from result
local float oldsolid;
vector vecs, dv;
oldsolid = ent.dphitcontentsmask;
- if(ent.weapon == WEP_CAMPINGRIFLE)
+ if(ent.weapon == WEP_SNIPERRIFLE)
ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
else
ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
v_right = vr;
v_up = vu;
+ // un-adjust trueaim if shotend is too close
+ if(vlen(w_shotend - (ent.origin + ent.view_ofs)) < autocvar_g_trueaim_minrange)
+ w_shotend = ent.origin + ent.view_ofs + s_forward * autocvar_g_trueaim_minrange;
+
// track max damage
- if not(inWarmupStage) {
- entity w;
- w = get_weaponinfo(ent.weapon);
- if(w.spawnflags & WEP_TYPE_SPLASH) { // splash damage
- ent.stats_fired[ent.weapon - 1] += maxdamage;
- ent.stat_fired = ent.weapon + 64 * floor(ent.stats_fired[ent.weapon - 1]);
- }
- }
+ if(accuracy_canbegooddamage(ent))
+ accuracy_add(ent, ent.weapon, maxdamage, 0);
W_HitPlotAnalysis(ent, v_forward, v_right, v_up);
if (antilag)
if (!ent.cvar_cl_noantilag)
{
- if (cvar("g_antilag") == 1) // switch to "ghost" if not hitting original
+ if (autocvar_g_antilag == 1) // switch to "ghost" if not hitting original
{
traceline(w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent);
if (!trace_ent.takedamage)
}
}
}
- else if(cvar("g_antilag") == 3) // client side hitscan
+ else if(autocvar_g_antilag == 3) // client side hitscan
{
// this part MUST use prydon cursor
if (ent.cursor_trace_ent) // client was aiming at someone
ent.punchangle_x = recoil * -1;
if (snd != "")
- {
- sound (ent, CHAN_WEAPON, snd, VOL_BASE, ATTN_NORM);
- }
+ sound (ent, chan, snd, VOL_BASE, ATTN_NORM);
if(ent.items & IT_STRENGTH)
if(!g_minstagib)
if(
- (time > ent.prevstrengthsound + cvar("sv_strengthsound_antispam_time"))
+ (time > ent.prevstrengthsound + autocvar_sv_strengthsound_antispam_time)
||
- (time > ent.prevstrengthsoundattempt + cvar("sv_strengthsound_antispam_refire_threshold"))
+ (time > ent.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)
) // prevent insane sound spam
{
sound(ent, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
};
-#define W_SetupShot_Dir_ProjectileSize(ent,s_forward,mi,ma,antilag,recoil,snd,maxdamage) W_SetupShot_Dir_ProjectileSize_Range(ent, s_forward, mi, ma, antilag, recoil, snd, maxdamage, MAX_SHOT_DISTANCE)
-#define W_SetupShot_ProjectileSize(ent,mi,ma,antilag,recoil,snd,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, v_forward, mi, ma, antilag, recoil, snd, maxdamage)
-#define W_SetupShot_Dir(ent,s_forward,antilag,recoil,snd,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, s_forward, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage)
-#define W_SetupShot(ent,antilag,recoil,snd,maxdamage) W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage)
-#define W_SetupShot_Range(ent,antilag,recoil,snd,maxdamage,range) W_SetupShot_Dir_ProjectileSize_Range(ent, v_forward, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage, range)
+#define W_SetupShot_Dir_ProjectileSize(ent,s_forward,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize_Range(ent, s_forward, mi, ma, antilag, recoil, snd, chan, maxdamage, MAX_SHOT_DISTANCE)
+#define W_SetupShot_ProjectileSize(ent,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, v_forward, mi, ma, antilag, recoil, snd, chan, maxdamage)
+#define W_SetupShot_Dir(ent,s_forward,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, s_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage)
+#define W_SetupShot(ent,antilag,recoil,snd,chan,maxdamage) W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage)
+#define W_SetupShot_Range(ent,antilag,recoil,snd,chan,maxdamage,range) W_SetupShot_Dir_ProjectileSize_Range(ent, v_forward, '0 0 0', '0 0 0', antilag, recoil, snd, chan, maxdamage, range)
float CL_Weaponentity_CustomizeEntityForClient()
{
else
self.alpha = 1;
+ self.glowmod = self.owner.weaponentity_glowmod;
self.colormap = self.owner.colormap;
if (self.weaponentity)
{
self.weaponentity.effects = self.effects;
self.weaponentity.alpha = self.alpha;
self.weaponentity.colormap = self.colormap;
+ self.weaponentity.glowmod = self.glowmod;
}
self.angles = '0 0 0';
f = 0;
if (self.state == WS_RAISE && !intermission_running)
{
- f = (self.owner.weapon_nextthink - time) * g_weaponratefactor / cvar("g_balance_weaponswitchdelay");
+ f = (self.owner.weapon_nextthink - time) * g_weaponratefactor / autocvar_g_balance_weaponswitchdelay;
self.angles_x = -90 * f * f;
if (qcweaponanimation)
{
}
else if (self.state == WS_DROP && !intermission_running)
{
- f = 1 - (self.owner.weapon_nextthink - time) * g_weaponratefactor / cvar("g_balance_weaponswitchdelay");
+ f = 1 - (self.owner.weapon_nextthink - time) * g_weaponratefactor / autocvar_g_balance_weaponswitchdelay;
self.angles_x = -90 * f * f;
if (qcweaponanimation)
{
self.angles = ang;
}
+ self.glowmod = self.owner.weaponentity_glowmod;
self.colormap = self.owner.colormap;
};
sprint(cl, strcat("You do not have the ^2", W_Name(wpn), "\n") );
Send_WeaponComplain (cl, wpn, W_Name(wpn), 1);
- if(cvar("g_showweaponspawns"))
+ if(autocvar_g_showweaponspawns)
{
entity e;
string s;
void weapon_setup(float windex)
{
entity e;
- qcweaponanimation = cvar("sv_qcweaponanimation");
+ qcweaponanimation = autocvar_sv_qcweaponanimation;
e = get_weaponinfo(windex);
self.items &~= IT_AMMO;
self.items = self.items | e.items;
if(ww)
W_SwitchWeapon_Force(pl, ww);
}
+.float prevdryfire;
float weapon_prepareattack_checkammo(float secondary)
{
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
return FALSE;
- if(self.weapon == self.switchweapon) // only play once BEFORE starting to switch weapons
+ if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
+ {
sound (self, CHAN_AUTO, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
+ self.prevdryfire = time;
+ }
W_SwitchToOtherWeapon(self);
return FALSE;
// VorteX: haste can be added here
};
-vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity)
+vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity, float forceAbsolute)
{
vector mdirection;
float mspeed;
mdirection = normalize(mvelocity);
mspeed = vlen(mvelocity);
- nstyle = cvar("g_projectiles_newton_style");
- if(nstyle == 0)
+ nstyle = autocvar_g_projectiles_newton_style;
+ if(nstyle == 0 || forceAbsolute)
{
// absolute velocity
outvelocity = mvelocity;
//dprint("impossible shot, adjusting\n");
}
- outspeed = bound(mspeed * cvar("g_projectiles_newton_style_2_minfactor"), outspeed, mspeed * cvar("g_projectiles_newton_style_2_maxfactor"));
+ outspeed = bound(mspeed * autocvar_g_projectiles_newton_style_2_minfactor, outspeed, mspeed * autocvar_g_projectiles_newton_style_2_maxfactor);
outvelocity = mdirection * outspeed;
}
else if(nstyle == 3)
spread *= g_weaponspreadfactor;
if(spread <= 0)
return forward;
- sstyle = cvar("g_projectiles_spread_style");
+ sstyle = autocvar_g_projectiles_spread_style;
if(sstyle == 0)
{
float mspercallsstyle;
float mspercallcount;
#endif
-void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float pSpeed, float pUpSpeed, float pZSpeed, float spread)
+void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float pSpeed, float pUpSpeed, float pZSpeed, float spread, float forceAbsolute)
{
if(missile.owner == world)
error("Unowned missile");
dir = normalize(dir);
#if 0
- if(cvar("g_projectiles_spread_style") != mspercallsstyle)
+ if(autocvar_g_projectiles_spread_style != mspercallsstyle)
{
mspercallsum = mspercallcount = 0;
- mspercallsstyle = cvar("g_projectiles_spread_style");
+ mspercallsstyle = autocvar_g_projectiles_spread_style;
}
mspercallsum -= gettime(GETTIME_HIRES);
#endif
print("avg: ", ftos(mspercallcount / mspercallsum), " per sec\n");
#endif
- missile.velocity = W_CalculateProjectileVelocity(missile.owner.velocity, pSpeed * dir);
+ missile.velocity = W_CalculateProjectileVelocity(missile.owner.velocity, pSpeed * dir, forceAbsolute);
}
void W_SetupProjectileVelocity(entity missile, float pSpeed, float spread)
{
- W_SetupProjectileVelocityEx(missile, w_shotdir, v_up, pSpeed, 0, 0, spread);
+ W_SetupProjectileVelocityEx(missile, w_shotdir, v_up, pSpeed, 0, 0, spread, FALSE);
}
-#define W_SETUPPROJECTILEVELOCITY_UP(m,s) W_SetupProjectileVelocityEx(m, w_shotdir, v_up, cvar(#s "_speed"), cvar(#s "_speed_up"), cvar(#s "_speed_z"), cvar(#s "_spread"))
-#define W_SETUPPROJECTILEVELOCITY(m,s) W_SetupProjectileVelocityEx(m, w_shotdir, v_up, cvar(#s "_speed"), 0, 0, cvar(#s "_spread"))
+#define W_SETUPPROJECTILEVELOCITY_UP(m,s) W_SetupProjectileVelocityEx(m, w_shotdir, v_up, cvar(#s "_speed"), cvar(#s "_speed_up"), cvar(#s "_speed_z"), cvar(#s "_spread"), FALSE)
+#define W_SETUPPROJECTILEVELOCITY(m,s) W_SetupProjectileVelocityEx(m, w_shotdir, v_up, cvar(#s "_speed"), 0, 0, cvar(#s "_spread"), FALSE)
} else {
self.version = stof(argv(1));
}
- if(self.version != cvar("gameversion"))
+ if(self.version < autocvar_gameversion_min || self.version > autocvar_gameversion_max)
{
- self.classname = "observer";
self.version_mismatch = 1;
- PutClientInServer();
- } else if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force")) {
+ ClientKill_TeamChange(-2); // observe
+ } else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) {
//JoinBestTeam(self, FALSE, TRUE);
- } else if(teams_matter && !cvar("sv_spectate")) {
+ } else if(teams_matter && !autocvar_sv_spectate && !(self.team_forced > 0)) {
self.classname = "observer";
stuffcmd(self,"menu_showteamselect\n");
}
return;
}
}
- if(self.classname == "player" && cvar("sv_spectate") == 1) {
- if(self.flagcarried)
- DropFlag(self.flagcarried, world, world);
- if(self.ballcarried)
- DropBall(self.ballcarried, self.origin, self.velocity);
- WaypointSprite_PlayerDead();
- self.classname = "observer";
- if(g_ca)
- self.caplayer = 0;
- if(blockSpectators)
- sprint(self, strcat("^7You have to become a player within the next ", ftos(cvar("g_maxplayers_spectator_blocktime")), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
- PutClientInServer();
+ if(self.classname == "player" && autocvar_sv_spectate == 1) {
+ ClientKill_TeamChange(-2); // observe
}
} else if(cmd == "join") {
if not(self.flags & FL_CLIENT)
if(!g_arena)
if (self.classname != "player" && !lockteams)
{
- if(isJoinAllowed()) {
+ if(nJoinAllowed(1)) {
self.classname = "player";
if(g_ca)
self.caplayer = 1;
PlayerScore_Clear(self);
bprint ("^4", self.netname, "^4 is playing now\n");
- self.stat_count = WEP_LAST;
PutClientInServer();
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
campaign_bots_may_start = 1;
}
else {
if not(self.flags & FL_CLIENT)
return;
if( !teams_matter ) {
- sprint( self, "selecteam can only be used in teamgames\n");
- } else if(cvar("g_campaign")) {
+ sprint( self, "selectteam can only be used in teamgames\n");
+ } else if(autocvar_g_campaign) {
//JoinBestTeam(self, 0);
+ } else if(self.team_forced > 0) {
+ sprint( self, "selectteam can not be used as your team is forced\n");
} else if(lockteams) {
sprint( self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n");
} else if( argv(1) == "red" ) {
- DoTeamChange(COLOR_TEAM1);
+ ClientKill_TeamChange(COLOR_TEAM1);
} else if( argv(1) == "blue" ) {
- DoTeamChange(COLOR_TEAM2);
+ ClientKill_TeamChange(COLOR_TEAM2);
} else if( argv(1) == "yellow" ) {
- DoTeamChange(COLOR_TEAM3);
+ ClientKill_TeamChange(COLOR_TEAM3);
} else if( argv(1) == "pink" ) {
- DoTeamChange(COLOR_TEAM4);
+ ClientKill_TeamChange(COLOR_TEAM4);
} else if( argv(1) == "auto" ) {
- DoTeamChange(-1);
+ ClientKill_TeamChange(-1);
} else {
sprint( self, strcat( "selectteam none/red/blue/yellow/pink/auto - \"", argv(1), "\" not recognised\n" ) );
}
if not(self.flags & FL_CLIENT)
return;
- if((inWarmupStage && 0 >= g_warmup_limit) // with unlimited warmup players have to be able to restart
- || cvar("sv_ready_restart") || g_race_qualifying == 2)
+ if((inWarmupStage)
+ || autocvar_sv_ready_restart || g_race_qualifying == 2)
{
- if(!readyrestart_happened || cvar("sv_ready_restart_repeatable"))
+ if(!readyrestart_happened || autocvar_sv_ready_restart_repeatable)
{
if (self.ready) // toggle
{
} else if(cmd == "timeout") {
if not(self.flags & FL_CLIENT)
return;
- if(cvar("sv_timeout")) {
+ if(autocvar_sv_timeout) {
if(self.classname == "player") {
if(votecalled)
sprint(self, "^7Error: you can not call a timeout while a vote is active!\n");
} else if(cmd == "timein") {
if not(self.flags & FL_CLIENT)
return;
- if(cvar("sv_timeout")) {
+ if(autocvar_sv_timeout) {
evaluateTimein();
}
} else if(cmd == "teamstatus") {
if(self.jointime > 0 && time > self.jointime + 10 && time > self.nickspamtime) // allow any changes in the first 10 seconds since joining
if(cmd == "name" || cmd == "playermodel") // TODO also playerskin and color?
{
- if(self.nickspamtime == 0 || time > self.nickspamtime + cvar("g_nick_flood_timeout"))
+ if(self.nickspamtime == 0 || time > self.nickspamtime + autocvar_g_nick_flood_timeout)
// good, no serious flood
self.nickspamcount = 1;
else
self.nickspamcount += 1;
- self.nickspamtime = time + cvar("g_nick_flood_penalty");
+ self.nickspamtime = time + autocvar_g_nick_flood_penalty;
if (timeoutStatus == 2) //when game is paused, no flood protection
self.nickspamcount = self.nickspamtime = 0;
if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) {
//we have to decrease timelimit to its original value again!!
float newTL;
- newTL = cvar("timelimit");
- newTL -= checkrules_overtimesadded * cvar("timelimit_overtime");
+ newTL = autocvar_timelimit;
+ newTL -= checkrules_overtimesadded * autocvar_timelimit_overtime;
cvar_set("timelimit", ftos(newTL));
}
readycount = 0;
Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client
- if(cvar("teamplay_lockonrestart") && teams_matter) {
+ if(autocvar_teamplay_lockonrestart && teams_matter) {
lockteams = 1;
bprint("^1The teams are now locked.\n");
}
//initiate the restart-countdown-announcer entity
- if(cvar("sv_ready_restart_after_countdown") && !g_ca && !g_arena)
+ if(autocvar_sv_ready_restart_after_countdown && !g_ca && !g_arena)
{
restartTimer = spawn();
restartTimer.think = restartTimer_Think;
}
//after a restart every players number of allowed timeouts gets reset, too
- if(cvar("sv_timeout"))
+ if(autocvar_sv_timeout)
{
FOR_EACH_REALPLAYER(e)
- e.allowedTimeouts = cvar("sv_timeout_number");
+ e.allowedTimeouts = autocvar_sv_timeout_number;
}
//reset map immediately if this cvar is not set
- if (!cvar("sv_ready_restart_after_countdown"))
+ if (!autocvar_sv_ready_restart_after_countdown)
reset_map(TRUE);
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(":restart");
}
// reset ALL scores, but only do that at the beginning
//of the countdown if sv_ready_restart_after_countdown is off!
//Otherwise scores could be manipulated during the countdown!
- if (!cvar("sv_ready_restart_after_countdown"))
+ if (!autocvar_sv_ready_restart_after_countdown)
Score_ClearAll();
}
return sprint(self, "^7Error: You can not call a timeout while the map is being restarted!\n");
if (timeoutStatus != 2) {
//if the map uses a timelimit make sure that timeout cannot be called right before the map ends
- if (cvar("timelimit")) {
+ if (autocvar_timelimit) {
//a timelimit was used
local float myTl;
- myTl = cvar("timelimit");
+ myTl = autocvar_timelimit;
local float lastPossibleTimeout;
- lastPossibleTimeout = (myTl*60) - cvar("sv_timeout_leadtime") - 1;
+ lastPossibleTimeout = (myTl*60) - autocvar_sv_timeout_leadtime - 1;
if (lastPossibleTimeout < time - game_starttime)
return sprint(self, "^7Error: It is too late to call a timeout now!\n");
//now all required checks are passed
self.allowedTimeouts -= 1;
bprint(self.netname, " ^7called a timeout (", ftos(self.allowedTimeouts), " timeouts left)!\n"); //write a bprint who started the timeout (and how many he has left)
- remainingTimeoutTime = cvar("sv_timeout_length");
- remainingLeadTime = cvar("sv_timeout_leadtime");
+ remainingTimeoutTime = autocvar_sv_timeout_length;
+ remainingLeadTime = autocvar_sv_timeout_leadtime;
timeoutInitiator = self;
if (timeoutStatus == 0) { //if another timeout was already active, don't change its status (which was 1 or 2) to 1, only change it to 1 if no timeout was active yet
timeoutStatus = 1;
}
else if (timeoutStatus == 2) {
//only shorten the remainingTimeoutTime if it makes sense
- if( remainingTimeoutTime > (cvar("sv_timeout_resumetime") + 1) ) {
+ if( remainingTimeoutTime > (autocvar_sv_timeout_resumetime + 1) ) {
bprint(strcat("^1Attention: ^7", self.netname, " resumed the game! Prepare for battle!\n"));
- remainingTimeoutTime = cvar("sv_timeout_resumetime");
+ remainingTimeoutTime = autocvar_sv_timeout_resumetime;
timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately
}
else
if(self.flags & FL_ONGROUND)
sf |= 0x40;
- if(self.fade_time != 0 && self.fade_rate != 0)
+ if(self.fade_time != 0 || self.fade_rate != 0)
{
ft = (self.fade_time - time) / sys_frametime;
fr = (1 / self.fade_rate) / sys_frametime;
WriteByte(MSG_ONE, 3); // svc_updatestat
WriteByte(MSG_ONE, 236); // STAT_TIMELIMIT
if(t < 0)
- WriteCoord(MSG_ONE, cvar("timelimit"));
+ WriteCoord(MSG_ONE, autocvar_timelimit);
else
WriteCoord(MSG_ONE, (t + 1) / 60);
}
return;
}
- if(!self.t_width)
- self.t_width = 0.1; // frame animation rate
- if(!self.t_length)
- self.t_length = 58; // maximum frame
-
setattachment(self, world, "");
self.mdl = self.model;
self.flags = FL_ITEM;
void LogCTF(string mode, float flagteam, entity actor)
{
string s;
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
s = strcat(":ctf:", mode);
s = strcat(s, ":", ftos(flagteam));
sound (self, CHAN_TRIGGER, self.noise4, VOL_BASE, ATTN_NONE);
setattachment(e, world, "");
- e.damageforcescale = cvar("g_balance_ctf_damageforcescale");
+ e.damageforcescale = autocvar_g_balance_ctf_damageforcescale;
e.takedamage = DAMAGE_YES;
if (p.flagcarried == e)
setorigin(e, p.origin - '0 0 24' + '0 0 37');
e.cnt = FLAG_DROPPED;
e.velocity = '0 0 300';
- e.pain_finished = time + cvar("g_ctf_flag_returntime");//30;
+ e.pain_finished = time + autocvar_g_ctf_flag_returntime;//30;
trace_startsolid = FALSE;
tracebox(e.origin, e.mins, e.maxs, e.origin, TRUE, e);
dprint("FLAG FALLTHROUGH will happen SOON\n");
};
-void AnimateFlag()
-{
- if(self.delay > time)
- return;
- self.delay = time + self.t_width;
- if(self.nextthink > self.delay)
- self.nextthink = self.delay;
-
- self.frame = self.frame + 1;
- if(self.frame > self.t_length)
- self.frame = 0;
-}
-
void FlagThink()
{
local entity e;
ctf_captureshield_update(e, 1); // release shield only
}
- AnimateFlag();
-
if(self.speedrunning)
if(self.cnt == FLAG_CARRY)
{
return;
}
- if(cvar("g_ctf_allow_drop"))
+ if(autocvar_g_ctf_allow_drop)
if(e.BUTTON_USE)
DropFlag(self, e, world);
};
{
return;
}
- if(cvar("g_ctf_captimerecord_always") || player_count - currentbots <= 1) // at most one human
+ if(autocvar_g_ctf_captimerecord_always || player_count - currentbots <= 1) // at most one human
{
t = time - other.flagcarried.flagpickuptime;
s = ftos_decimals(t, 2);
// give credit to the individual player
UpdateFrags(other, ctf_score_value("score_capture"));
- if (cvar("g_ctf_flag_capture_effects")) {
+ if (autocvar_g_ctf_flag_capture_effects) {
if (other.team == COLOR_TEAM1) { // red team scores effect
pointparticles(particleeffectnum("red_ground_quake"), self.origin, '0 0 0', 1);
flag_cap_ring_spawn(self.origin);
if (other.next_take_time > time)
return;
- if (cvar("g_ctf_flag_pickup_effects")) // pickup effect
+ if (autocvar_g_ctf_flag_pickup_effects) // pickup effect
pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
// pick up
sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
ReturnFlag(self);
}
- else if (!other.flagcarried && (other.playerid != self.dropperid || time > self.ctf_droptime + cvar("g_balance_ctf_delay_collect")))
+ else if (!other.flagcarried && (other.playerid != self.dropperid || time > self.ctf_droptime + autocvar_g_balance_ctf_delay_collect))
{
if(self.waypointsprite_attachedforcarrier)
WaypointSprite_DetachCarrier(self);
- if (cvar("g_ctf_flag_pickup_effects")) // field pickup effect
+ if (autocvar_g_ctf_flag_pickup_effects) // field pickup effect
pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
// pick up
//bprint(other.netname, "^7 picked up the ", self.netname, "\n");
float f;
- f = bound(0, (self.pain_finished - time) / cvar("g_ctf_flag_returntime"), 1);
+ f = bound(0, (self.pain_finished - time) / autocvar_g_ctf_flag_returntime, 1);
//print("factor is ", ftos(f), "\n");
f = ctf_score_value("score_pickup_dropped_late") * (1-f)
+ ctf_score_value("score_pickup_dropped_early") * f;
{ // Check CTF Item Flag Post Spawn
// Flag Glow Trail Support
- if(cvar("g_ctf_flag_glowtrails"))
+ if(autocvar_g_ctf_flag_glowtrails)
{ // Provide Flag Glow Trail
if(self.team == COLOR_TEAM1)
// Red
return;
}
- //if(!cvar("teamplay"))
- // cvar_set("teamplay", "3");
-
// link flag into ctf_worldflaglist
self.ctf_worldflagnext = ctf_worldflaglist;
ctf_worldflaglist = self;
}
self.netname = "^1RED^7 flag";
self.target = "###item###";
- self.skin = cvar("g_ctf_flag_red_skin");
+ self.skin = autocvar_g_ctf_flag_red_skin;
if(self.spawnflags & 1)
self.noalign = 1;
if (!self.model)
- self.model = cvar_string("g_ctf_flag_red_model");
+ self.model = autocvar_g_ctf_flag_red_model;
if (!self.noise)
self.noise = "ctf/red_taken.wav";
if (!self.noise1)
// self.glow_size = 50;
self.effects = self.effects | EF_LOWPRECISION;
- if(cvar("g_ctf_fullbrightflags"))
+ if(autocvar_g_ctf_fullbrightflags)
self.effects |= EF_FULLBRIGHT;
- if(cvar("g_ctf_dynamiclights"))
+ if(autocvar_g_ctf_dynamiclights)
self.effects |= EF_RED;
// From Spidflisk
remove(self);
return;
}
- //if(!cvar("teamplay"))
- // cvar_set("teamplay", "3");
// link flag into ctf_worldflaglist
self.ctf_worldflagnext = ctf_worldflaglist;
}
self.netname = "^4BLUE^7 flag";
self.target = "###item###";
- self.skin = cvar("g_ctf_flag_blue_skin");
+ self.skin = autocvar_g_ctf_flag_blue_skin;
if(self.spawnflags & 1)
self.noalign = 1;
if (!self.model)
- self.model = cvar_string("g_ctf_flag_blue_model");
+ self.model = autocvar_g_ctf_flag_blue_model;
if (!self.noise)
self.noise = "ctf/blue_taken.wav";
if (!self.noise1)
// self.glow_size = 50;
self.effects = self.effects | EF_LOWPRECISION;
- if(cvar("g_ctf_fullbrightflags"))
+ if(autocvar_g_ctf_fullbrightflags)
self.effects |= EF_FULLBRIGHT;
- if(cvar("g_ctf_dynamiclights"))
+ if(autocvar_g_ctf_dynamiclights)
self.effects |= EF_BLUE;
// From Spidflisk
InitializeEntity(world, ctf_delayedinit, INITPRIO_GAMETYPE);
flagcaptimerecord = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time")));
- captureshield_min_negscore = cvar("g_ctf_shield_min_negscore");
- captureshield_max_ratio = cvar("g_ctf_shield_max_ratio");
- captureshield_force = cvar("g_ctf_shield_force");
+ captureshield_min_negscore = autocvar_g_ctf_shield_min_negscore;
+ captureshield_max_ratio = autocvar_g_ctf_shield_max_ratio;
+ captureshield_force = autocvar_g_ctf_shield_force;
+
+
+//#NO AUTOCVARS START
+ g_ctf_win_mode = cvar("g_ctf_win_mode");
+//#NO AUTOCVARS END
};
void ctf_setstatus2(entity flag, float shift)
self.items &~= IT_BLUE_FLAG_LOST;
self.items &~= IT_CTF_SHIELDED;
- if (g_ctf) {
- local entity flag;
- float redflags, blueflags;
+ local entity flag;
+ float redflags, blueflags;
- if(self.ctf_captureshielded)
- self.items |= IT_CTF_SHIELDED;
+ if(self.ctf_captureshielded)
+ self.items |= IT_CTF_SHIELDED;
- redflags = 0;
- blueflags = 0;
+ redflags = 0;
+ blueflags = 0;
- for (flag = ctf_worldflaglist; flag; flag = flag.ctf_worldflagnext) if(flag.cnt != FLAG_BASE)
- {
- if(flag.items & IT_KEY2) // blue
- ++redflags;
- else if(flag.items & IT_KEY1) // red
- ++blueflags;
- }
+ for (flag = ctf_worldflaglist; flag; flag = flag.ctf_worldflagnext) if(flag.cnt != FLAG_BASE)
+ {
+ if(flag.items & IT_KEY2) // blue
+ ++redflags;
+ else if(flag.items & IT_KEY1) // red
+ ++blueflags;
+ }
- // blinking magic: if there is more than one flag, show one of these in a clever way
- if(redflags)
- redflags = mod(floor(time * redflags * 0.75), redflags);
- if(blueflags)
- blueflags = mod(floor(time * blueflags * 0.75), blueflags);
+ // blinking magic: if there is more than one flag, show one of these in a clever way
+ if(redflags)
+ redflags = mod(floor(time * redflags * 0.75), redflags);
+ if(blueflags)
+ blueflags = mod(floor(time * blueflags * 0.75), blueflags);
- for (flag = ctf_worldflaglist; flag; flag = flag.ctf_worldflagnext) if(flag.cnt != FLAG_BASE)
+ for (flag = ctf_worldflaglist; flag; flag = flag.ctf_worldflagnext) if(flag.cnt != FLAG_BASE)
+ {
+ if(flag.items & IT_KEY2) // blue
{
- if(flag.items & IT_KEY2) // blue
- {
- if(--redflags == -1) // happens exactly once (redflags is in 0..count-1, and will --'ed count times)
- ctf_setstatus2(flag, IT_RED_FLAG_TAKEN);
- }
- else if(flag.items & IT_KEY1) // red
- {
- if(--blueflags == -1) // happens exactly once
- ctf_setstatus2(flag, IT_BLUE_FLAG_TAKEN);
- }
+ if(--redflags == -1) // happens exactly once (redflags is in 0..count-1, and will --'ed count times)
+ ctf_setstatus2(flag, IT_RED_FLAG_TAKEN);
+ }
+ else if(flag.items & IT_KEY1) // red
+ {
+ if(--blueflags == -1) // happens exactly once
+ ctf_setstatus2(flag, IT_BLUE_FLAG_TAKEN);
}
}
};
float ctf_score_value(string parameter);
-float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts;
+float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts, g_freezetag, g_keepaway;
float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_minstagib_invis_alpha, g_bloodloss;
float g_warmup_limit;
float g_warmup_allguns;
//.float style;
//.float skill;
.float sounds;
+.float platmovetype;
.string killtarget;
.vector pos1, pos2;
.vector mangle;
-.float cvar_cl_hitsound;
-
.float pain_finished; //Added by Supajoe
.float pain_frame; //"
.float statdraintime; // record the one-second intervals between draining health and armour when they're over 100
.entity weaponentity;
.entity exteriorweaponentity;
+.vector weaponentity_glowmod;
.float switchweapon;
.float autoswitch;
float weapon_action(float wpn, float wrequest);
void checkSpectatorBlock();
.float winning;
-.float jointime;
+.float jointime; // time of joining
+.float alivetime; // time of being alive
-float isJoinAllowed();
+float nJoinAllowed(float includeMe);
#define PREVENT_JOIN_TEXT "^1You may not join the game at this time.\n\nThe player limit reached maximum capacity."
//sv_timeout: pauses the game by setting the gamespeed to a really low value (see TIMEOUT_SLOWMO_VALUE)
#define TIMEOUT_SLOWMO_VALUE 0.0001
-float sys_frametime; // gets initialised in worlspawn, saves the value from cvar("sys_ticrate")
+float sys_frametime; // gets initialised in worlspawn, saves the value from autocvar_sys_ticrate
float remainingTimeoutTime; // contains the time in seconds that the active timeout has left
float remainingLeadTime; // contains the number of seconds left of the leadtime (before the timeout starts)
float timeoutStatus; // (values: 0, 1, 2) contains whether a timeout is not active (0), was called but still at leadtime (1) or is active (2)
.float allowedTimeouts; // contains the number of allowed timeouts for each player
entity timeoutInitiator; // contains the entity of the player who started the last timeout
-float orig_slowmo; // contains the value of cvar("slowmo") so that, after timeout finished, it isn't set to slowmo 1 necessarily
+float orig_slowmo; // contains the value of autocvar_slowmo so that, after timeout finished, it isn't set to slowmo 1 necessarily
.vector lastV_angle; //used when pausing the game in order to force the player to keep his old view angle fixed
entity timeoutHandler; //responsible for centerprinting the timeout countdowns and playing sounds
void timeoutHandler_Think();
.string weaponorder_byimpulse;
.float cvar_cl_allow_uid2name;
+.float cvar_cl_allow_uidtracking;
.string stored_netname;
void Announce(string snd);
.float speedrunning;
// Q3 support
-.float notteam;
-.float notsingle;
-.float notfree;
-.float notq3a;
float q3acompat_machineshotgunswap;
// database
float sv_maxidle_spectatorsareidle;
float sv_pogostick;
-float sv_doublejump;
float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end);
float next_pingtime;
void GlobalSound(string samplestring, float channel, float voicetype);
void FakeGlobalSound(string samplestring, float channel, float voicetype);
void VoiceMessage(string type, string message);
+float GetPlayerSoundSampleField_notFound;
+.string GetVoiceMessageSampleField(string type)
// autotaunt system
.float cvar_cl_autotaunt;
.float stat_sv_airaccel_qw;
.float stat_sv_airstrafeaccel_qw;
.float stat_sv_airspeedlimit_nonqw;
+.float stat_sv_maxspeed;
void W_Porto_Remove (entity p);
.string target4;
.float trigger_reverse;
-// Nexball
-.entity ballcarried;
+// Nexball
+.entity ballcarried; // Also used for keepaway
.float metertime;
float g_nexball_meter_period;
.float hitplotfh;
.string noise4;
-.float stat_hit;
-.float stat_fired;
-.float stat_count;
-
-.float stats_hit[WEP_MAXCOUNT]; // for hitscan bullets hit
-.float stats_fired[WEP_MAXCOUNT]; // for hitscan bullets fired
-
.float last_pickup;
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(stats_hit);
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(stats_fired);
+.float hit_time;
+.float typehit_time;
.float stat_leadlimit;
float client_cefc_accumulatortime;
#endif
-.float campingrifle_bulletcounter;
+.float sniperrifle_bulletcounter;
+.float wish_reload;
#define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_CORPSE; (e).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE
// when doing this, hagar can go through clones
.entity realowner;
.float nex_charge;
+.float nex_charge_rottime;
+.float nex_chargepool_ammo;
float allowed_to_spawn; // boolean variable used by the clan arena code to determine if a player can spawn (after the round has ended)
float serverflags;
+
+.float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
+
+.float freezetag_frozen;
+.float freezetag_revive_progress;
+
+.entity muzzle_flash;
+.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
#define DOMPOINTFRAGS frags
-float g_domination_point_amt;
-float g_domination_point_rate;
-
.float enemy_playerid;
.entity sprite;
.float captime;
void LogDom(string mode, float team_before, entity actor)
{
string s;
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
s = strcat(":dom:", mode);
s = strcat(s, ":", ftos(team_before));
//bprint("\n");
float points, wait_time;
- if (g_domination_point_amt)
- points = g_domination_point_amt;
+ if (autocvar_g_domination_point_amt)
+ points = autocvar_g_domination_point_amt;
else
points = self.frags;
- if (g_domination_point_rate)
- wait_time = g_domination_point_rate;
+ if (autocvar_g_domination_point_rate)
+ wait_time = autocvar_g_domination_point_rate;
else
wait_time = self.wait;
if (head.noise1 != "")
play2all(head.noise1);
- //self.nextthink = time + cvar("g_domination_point_rate");
+ //self.nextthink = time + autocvar_g_domination_point_rate;
//self.think = dompointthink;
self.delay = time + wait_time;
if (gameover || self.delay > time || time < game_starttime) // game has ended, don't keep giving points
return;
- g_domination_point_rate = cvar("g_domination_point_rate");
- g_domination_point_amt = cvar("g_domination_point_amt");
-
- if(g_domination_point_rate)
- self.delay = time + g_domination_point_rate;
+ if(autocvar_g_domination_point_rate)
+ self.delay = time + autocvar_g_domination_point_rate;
else
self.delay = time + self.wait;
// NOTE: this defaults to 0
if (self.goalentity.netname != "")
{
- if(g_domination_point_amt)
- fragamt = g_domination_point_amt;
+ if(autocvar_g_domination_point_amt)
+ fragamt = autocvar_g_domination_point_amt;
else
fragamt = self.DOMPOINTFRAGS;
TeamScore_AddToTeam(self.goalentity.team, ST_SCORE, fragamt);
void spawnfunc_dom_team()
{
- if(!g_domination || cvar("g_domination_teams_override") >= 2)
+ if(!g_domination || autocvar_g_domination_teams_override >= 2)
{
remove(self);
return;
float c1, c2, c3, c4, totalteams, smallestteam, smallestteam_count, selectedteam;
float balance_teams, force_balance, balance_type;
- balance_teams = cvar("g_balance_teams");
- balance_teams = cvar("g_balance_teams_force");
+ balance_teams = autocvar_g_balance_teams;
+ balance_teams = autocvar_g_balance_teams_force;
c1 = c2 = c3 = c4 = -1;
totalteams = 0;
//if(!self.glow_size)
// self.glow_size = cvar("g_domination_point_glow");
self.effects = self.effects | EF_LOWPRECISION;
- if (cvar("g_domination_point_fullbright"))
+ if (autocvar_g_domination_point_fullbright)
self.effects |= EF_FULLBRIGHT;
};
void dom_spawnteams()
{
float numteams;
- if(cvar("g_domination_teams_override") < 2)
- numteams = cvar("g_domination_default_teams");
+ if(autocvar_g_domination_teams_override < 2)
+ numteams = autocvar_g_domination_default_teams;
else
- numteams = cvar("g_domination_teams_override");
+ numteams = autocvar_g_domination_teams_override;
// LordHavoc: edit this if you want to change defaults
dom_spawnteam("Red", COLOR_TEAM1-1, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point");
dom_spawnteam("Blue", COLOR_TEAM2-1, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point");
local entity head;
// if no teams are found, spawn defaults, if custom teams are set, use them
- if (find(world, classname, "dom_team") == world || cvar("g_domination_teams_override") >= 2)
+ if (find(world, classname, "dom_team") == world || autocvar_g_domination_teams_override >= 2)
dom_spawnteams();
// if no control points are found, spawn defaults
if (find(world, classname, "dom_controlpoint") == world)
precache_model("models/domination/dom_unclaimed.md3");
precache_sound("domination/claim.wav");
InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);
-
- // teamplay is always on in domination, defaults to hurt self but not teammates
- //if(!teams_matter)
- // cvar_set("teamplay", "3");
};
//description:
//global skybox for the map, can not be changed by QC
+//DP_UTF8
+//idea: Blub\0, divVerent
+//darkplaces implementation: Blub\0
+//cvar definitions:
+// utf8_enable: enable utf8 encoding
+//description: utf8 characters are allowed inside cvars, protocol strings, files, progs strings, etc.,
+//and count as 1 char for string functions like strlen, substring, etc.
+// note: utf8_enable is run-time cvar, could be changed during execution
+// note: beware that str2chr() could return value bigger than 255 once utf8 is enabled
+
//DP_HALFLIFE_MAP
//idea: LordHavoc
//darkplaces implementation: LordHavoc
// string autocvar__cl_name;
//NOTE: copying a string-typed autocvar to another variable/field, and then
//changing the cvar or returning from progs is UNDEFINED. Writing to autocvar
-//globals is UNDEFINED. Accessing autocvar globals after cvar_set()ing that
+//globals is UNDEFINED. Accessing autocvar globals after cvar_set()ing that
//cvar is IMPLEMENTATION DEFINED (an implementation may either yield the
-//previous, or the current, value). Writing to an autocvar global is NOT
-//ALLOWED.
+//previous, or the current, value). Whether autocvar globals, after restoring
+//a savegame, have the cvar's current value, or the original value at time of
+//saving, is UNDEFINED. Restoring a savegame however must not restore the
+//cvar values themselves.
//In case the cvar does NOT exist, then it is automatically created with the
//value of the autocvar initializer, if given. This is possible with e.g.
//frikqcc and fteqcc the following way:
//function to query triangles of a surface
//DP_QC_GETTAGINFO
-//idea: VorteX, LordHavoc (somebody else?)
+//idea: VorteX, LordHavoc
//DarkPlaces implementation: VorteX
//builtin definitions:
float(entity ent, string tagname) gettagindex = #451;
float GETTIME_CDTRACK = 4;
//description:
//returns the playing time of the current cdtrack when passed to gettime()
+//see DP_END_GETSOUNDTIME for similar functionality but for entity sound channels
//DP_QC_LOG
//darkplaces implementation: divVerent
// optional: .<precision>, .*, or .*<argpos>$ for the precision
// length modifiers: h for forcing a float, l for forcing an int/entity (by default, %d etc. cast a float to int)
// conversions:
-// di take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an int
+// d takes a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an int
+// i takes an int/entity if no length is specified or i is, and a float if h is specified as length, and cast it to an int
// ouxXc take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an unsigned int
// eEfFgG take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to a double
// s takes a string
//if 1 is returned by uri_get, the callback will be called in the future
float(string url, float id) uri_get = #513;
+//DP_QC_URI_POST
+//idea: divVerent
+//darkplaces implementation: divVerent
+//loads text from an URL into a string after POSTing via HTTP
+//works like uri_get, but uri_post sends data with Content-Type: content_type to the server
+//and uri_post sends the string buffer buf, joined using the delimiter delim
+float(string url, float id, string content_type, string data) uri_post = #513;
+float(string url, float id, string content_type, string delim, float buf) uri_postbuf = #513;
+
//DP_SKELETONOBJECTS
//idea: LordHavoc
//darkplaces implementation: LordHavoc
//description:
//the engine supports stereo WAV files. (useful with DP_SND_DIRECTIONLESSATTNNONE for music)
+//DP_SND_GETSOUNDTIME
+//idea: VorteX
+//darkplaces implementation: VorteX
+//constant definitions:
+float(entity e, float channel) getsoundtime = #533; // get currently sound playing position on entity channel, -1 if not playing or error
+float(string sample) soundlength = #534; // returns length of sound sample in seconds, -1 on error (sound not precached, sound system not initialized etc.)
+//description: provides opportunity to query length of sound samples and realtime tracking of sound playing on entities (similar to DP_GETTIME_CDTRACK)
+//note: beware dedicated server not running sound engine at all, so in dedicated mode this builtins will not work in server progs
+//note also: menu progs not supporting getsoundtime() (will give a warning) since it has no sound playing on entities
+//examples of use:
+// - QC-driven looped sounds
+// - QC events when sound playing is finished
+// - toggleable ambientsounds
+// - subtitles
+
+//DP_VIDEO_DPV
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//console commands:
+// playvideo <videoname> - start playing video
+// stopvideo - stops current video
+//description: indicated that engine support playing videos in DPV format
+
+//DP_VIDEO_SUBTITLES
+//idea: VorteX
+//darkplaces implementation: VorteX
+//cvars:
+// cl_video_subtitles - toggles subtitles showing
+// cl_video_subtitles_lines - how many lines to reserve for subtitles
+// cl_video_subtitles_textsize - font size
+//console commands:
+// playvideo <videoname> <custom_subtitles_file> - start playing video
+// stopvideo - stops current video
+//description: indicates that engine support subtitles on videos
+//subtitles stored in external text files, each video file has it's default subtitles file ( <videoname>.dpsubs )
+//example: for video/act1.dpv default subtitles file will be video/act1.dpsubs
+//also video could be played with custom subtitles file by utilizing second parm of playvideo command
+//syntax of .dpsubs files: each line in .dpsubs file defines 1 subtitle, there are three tokens:
+// <start> <end> "string"
+// start: subtitle start time in seconds
+// end: subtitle time-to-show in seconds, if 0 - subtitle will be showed until next subtitle is started,
+// if below 0 - show until next subtitles minus this number of seconds
+// text: subtitle text, color codes (Q3-style and ^xRGB) are allowed
+//example of subtitle file:
+// 3 0 "Vengeance! Vengeance for my eternity of suffering!"
+// 9 0 "Whelp! As if you knew what eternity was!"
+// 13 0 "Grovel before your true master."
+// 17 0 "Never!"
+// 18 7 "I'll hack you from crotch to gizzard and feed what's left of you to your brides..."
+
//DP_SOLIDCORPSE
//idea: LordHavoc
//darkplaces implementation: LordHavoc
//description:
//allows qc to customize MOVETYPE_BOUNCE a bit
+//DP_SV_CLIENTCAMERA
+//idea: LordHavoc, others
+//darkplaces implementation: Black
+//field definitions:
+.entity clientcamera; // override camera entity
+//description:
+//allows another entity to be the camera for a client, for example a remote camera, this is similar to sending svc_setview manually except that it also changes the network culling appropriately.
+
//DP_SV_CLIENTCOLORS
//idea: LordHavoc
//darkplaces implementation: LordHavoc
float Q3SURFACEFLAG_NOIMPACT = 16; // projectiles should remove themselves on impact (this is set on sky)
float Q3SURFACEFLAG_NOMARKS = 32; // projectiles should not leave marks, such as decals (this is set on sky)
float Q3SURFACEFLAG_FLESH = 64; // projectiles should do a fleshy effect (blood?) on impact
-//float Q3SURFACEFLAG_NODRAW = 128; // compiler hint (not important to qc)
+float Q3SURFACEFLAG_NODRAW = 128; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_HINT = 256; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_SKIP = 512; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_NOLIGHTMAP = 1024; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_POINTLIGHT = 2048; // compiler hint (not important to qc)
float Q3SURFACEFLAG_METALSTEPS = 4096; // walking on this surface should make metal step sounds
float Q3SURFACEFLAG_NOSTEPS = 8192; // walking on this surface should not make footstep sounds
-//float Q3SURFACEFLAG_NONSOLID = 16384; // compiler hint (not important to qc)
+float Q3SURFACEFLAG_NONSOLID = 16384; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_LIGHTFILTER = 32768; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_ALPHASHADOW = 65536; // compiler hint (not important to qc)
//float Q3SURFACEFLAG_NODLIGHT = 131072; // compiler hint (not important to qc)
.string crypto_encryptmethod; // the string "AES128" if encrypting, and string_null if plaintext
.string crypto_signmethod; // the string "HMAC-SHA256" if signing, and string_null if plaintext
// there is no field crypto_myidfp, as that info contains no additional information the QC may have a use for
+//builtin definitions: (SVQC)
+float(string url, float id, string content_type, string delim, float buf, float keyid) crypto_uri_postbuf = #513;
//description:
+//use -1 as buffer handle to justs end delim as postdata
void func_breakable_behave_restore()
{
self.health = self.max_health;
+ if(self.sprite)
+ {
+ WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
self.takedamage = DAMAGE_AIM;
self.event_damage = func_breakable_damage;
self.state = 0;
if(self.team)
if(attacker.team == self.team)
return;
+ self.health = self.health - damage;
if(self.sprite)
+ {
WaypointSprite_Ping(self.sprite);
- self.health = self.health - damage;
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
func_breakable_colormod();
if(self.health <= 0)
// NOTE: f=0 means still count as a (positive) kill, but count no frags for it
void W_SwitchWeapon_Force(entity e, float w);
-void GiveFrags (entity attacker, entity targ, float f)
+void GiveFrags (entity attacker, entity targ, float f, float deathtype)
{
float w;
PlayerScore_Add(targ, SP_DEATHS, 1);
if(g_arena || g_ca)
- if(cvar("g_arena_roundbased"))
+ if(autocvar_g_arena_roundbased)
return;
if(targ != attacker) // not for suicides
if(g_weaponarena_random)
{
- // after a frag, choose another random weapon set
- if(inWarmupStage)
- w = warmup_start_weapons;
- else
- w = start_weapons;
+ // after a frag, exchange the current weapon (or the culprit, if detectable) by a new random weapon
+ float culprit;
+ culprit = DEATH_WEAPONOF(deathtype);
+ if(!culprit || !(attacker.weapons & W_WeaponBit(culprit)))
+ culprit = attacker.weapon;
- attacker.weapons = randombits(w - (w & W_WeaponBit(attacker.weapon)), g_weaponarena_random, TRUE);
- if(attacker.weapons < 0)
+ if(g_weaponarena_random_with_laser && culprit == WEPBIT_LASER)
+ {
+ // no exchange
+ }
+ else
{
- // error from randombits: no weapon available
- // this means we can just give ALL weapons
- attacker.weapons = w;
+ if(inWarmupStage)
+ w = warmup_start_weapons;
+ else
+ w = start_weapons;
+
+ // all others (including the culprit): remove
+ w &~= attacker.weapons;
+
+ // among the remaining ones, choose one by random
+ w = randombits(w, 1, FALSE);
+ if(w)
+ {
+ attacker.weapons |= w;
+ attacker.weapons &~= W_WeaponBit(culprit);
+ }
}
+
+ // after a frag, choose another random weapon set
if not(attacker.weapons & W_WeaponBit(attacker.weapon))
W_SwitchWeapon_Force(attacker, w_getbestweapon(attacker));
}
{
if(!lms_next_place)
lms_next_place = player_count;
+ else
+ lms_next_place = min(lms_next_place, player_count);
PlayerScore_Add(targ, SP_LMS_RANK, lms_next_place); // won't ever spawn again
--lms_next_place;
}
void LogDeath(string mode, float deathtype, entity killer, entity killed)
{
string s;
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
s = strcat(":kill:", mode);
s = strcat(s, ":", ftos(killer.playerid));
{
if (deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
msg = ColoredTeamName(targ.team); // TODO: check if needed?
- Send_CSQC_Centerprint(targ, msg, "", deathtype, MSG_SUICIDE);
+ if(!g_cts) // no "killed your own dumb self" message in CTS
+ Send_CSQC_Centerprint(targ, msg, "", deathtype, MSG_SUICIDE);
if(deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_QUIET)
{
LogDeath("suicide", deathtype, targ, targ);
- GiveFrags(attacker, targ, -1);
+ GiveFrags(attacker, targ, -1, deathtype);
}
if (targ.killcount > 2)
else
type = KILL_TEAM_BLUE;
- GiveFrags(attacker, targ, -1);
+ GiveFrags(attacker, targ, -1, deathtype);
Send_CSQC_Centerprint(attacker, s, "", type, MSG_KILL);
// TODO: make these print a newline if they dont
Send_CSQC_Centerprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
Send_CSQC_Centerprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
+ PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
}
- if((cvar("sv_fragmessage_information_typefrag")) && (targ.BUTTON_CHAT)) {
+ if((autocvar_sv_fragmessage_information_typefrag) && (targ.BUTTON_CHAT)) {
Send_CSQC_Centerprint(attacker, s, GetAdvancedDeathReports(targ), KILL_TYPEFRAG, MSG_KILL);
Send_CSQC_Centerprint(targ, a, GetAdvancedDeathReports(attacker), KILL_TYPEFRAGGED, MSG_KILL);
} else {
{
UpdateFrags(attacker, ctf_score_value("score_kill"));
PlayerScore_Add(attacker, SP_CTF_FCKILLS, 1);
- GiveFrags(attacker, targ, 0); // for logging
+ GiveFrags(attacker, targ, 0, deathtype); // for logging
}
else
- GiveFrags(attacker, targ, 1);
+ GiveFrags(attacker, targ, 1, deathtype);
if (targ.killcount > 2) {
Send_KillNotification(s, ftos(targ.killcount), a, KILL_END_SPREE, MSG_SPREE);
{
Send_KillNotification(a, "", "", KILL_SPREE_3, MSG_SPREE);
AnnounceTo(attacker, "03kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3, 1);
}
else if (attacker.killcount == 5)
{
Send_KillNotification(a, "", "", KILL_SPREE_5, MSG_SPREE);
AnnounceTo(attacker, "05kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5, 1);
}
else if (attacker.killcount == 10)
{
Send_KillNotification(a, "", "", KILL_SPREE_10, MSG_SPREE);
AnnounceTo(attacker, "10kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10, 1);
}
else if (attacker.killcount == 15)
{
Send_KillNotification(a, "", "", KILL_SPREE_15, MSG_SPREE);
AnnounceTo(attacker, "15kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15, 1);
}
else if (attacker.killcount == 20)
{
Send_KillNotification(a, "", "", KILL_SPREE_20, MSG_SPREE);
AnnounceTo(attacker, "20kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20, 1);
}
else if (attacker.killcount == 25)
{
Send_KillNotification(a, "", "", KILL_SPREE_25, MSG_SPREE);
AnnounceTo(attacker, "25kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25, 1);
}
else if (attacker.killcount == 30)
{
Send_KillNotification(a, "", "", KILL_SPREE_30, MSG_SPREE);
AnnounceTo(attacker, "30kills");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30, 1);
}
LogDeath("frag", deathtype, attacker, targ);
}
if(strstrofs(msg, "%", 0) < 0)
msg = strcat("%s ", msg);
- GiveFrags(targ, targ, -1);
+ GiveFrags(targ, targ, -1, deathtype);
if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) {
AnnounceTo(targ, "botlike");
+ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
}
Send_KillNotification(s, msg, "", deathtype, MSG_KILL_ACTION);
damage = 0;
force = '0 0 0';
}
- else if(attacker.team == targ.team)
+ else if(teams_matter && attacker.team == targ.team)
{
- if(teamplay == 1)
+ if(autocvar_teamplay_mode == 1)
damage = 0;
else if(attacker != targ)
{
- if(teamplay == 3)
+ if(autocvar_teamplay_mode == 3)
damage = 0;
- else if(teamplay == 4)
+ else if(autocvar_teamplay_mode == 4)
{
if(targ.classname == "player" && targ.deadflag == DEAD_NO)
{
- teamdamage0 = max(attacker.dmg_team, cvar("g_teamdamage_threshold"));
+ teamdamage0 = max(attacker.dmg_team, autocvar_g_teamdamage_threshold);
attacker.dmg_team = attacker.dmg_team + damage;
if(attacker.dmg_team > teamdamage0 && !g_ca)
- mirrordamage = cvar("g_mirrordamage") * (attacker.dmg_team - teamdamage0);
- mirrorforce = cvar("g_mirrordamage") * vlen(force);
+ mirrordamage = autocvar_g_mirrordamage * (attacker.dmg_team - teamdamage0);
+ mirrorforce = autocvar_g_mirrordamage * vlen(force);
if(g_minstagib)
{
- if(cvar("g_friendlyfire") == 0)
+ if(autocvar_g_friendlyfire == 0)
damage = 0;
}
else if(g_ca)
damage = 0;
else
- damage = cvar("g_friendlyfire") * damage;
+ damage = autocvar_g_friendlyfire * damage;
// mirrordamage will be used LATER
+
+ if(autocvar_g_mirrordamage_virtual)
+ {
+ vector v;
+ v = healtharmor_applydamage(attacker.armorvalue, autocvar_g_balance_armor_blockpercent, mirrordamage);
+ attacker.dmg_take += v_x;
+ attacker.dmg_save += v_y;
+ attacker.dmg_inflictor = inflictor;
+ mirrordamage = 0;
+ mirrorforce = 0;
+ }
+
+ if(autocvar_g_friendlyfire_virtual)
+ {
+ vector v;
+ v = healtharmor_applydamage(targ.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
+ targ.dmg_take += v_x;
+ targ.dmg_save += v_y;
+ targ.dmg_inflictor = inflictor;
+ damage = 0;
+ if(!autocvar_g_friendlyfire_virtual_force)
+ force = '0 0 0';
+ }
}
else
damage = 0;
if(attacker.classname == "player")
if(attacker != targ)
{
- targ.lms_traveled_distance = cvar("g_lms_campcheck_distance");
- attacker.lms_traveled_distance = cvar("g_lms_campcheck_distance");
+ targ.lms_traveled_distance = autocvar_g_lms_campcheck_distance;
+ attacker.lms_traveled_distance = autocvar_g_lms_campcheck_distance;
}
if(targ.classname == "player")
if (DEATH_ISWEAPON(deathtype, WEP_LASER))
{
damage = 0;
+ mirrordamage = 0;
if (targ != attacker)
{
if ((targ.health >= 1) && (targ.classname == "player"))
centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "Secondary fire inflicts no damage!"));
- damage = 0;
- mirrordamage = 0;
force = '0 0 0';
// keep mirrorforce
attacker = targ;
force = force * g_weaponforcefactor;
mirrorforce *= g_weaponforcefactor;
}
-
+
+ // should this be changed at all? If so, in what way?
+ frag_attacker = attacker;
+ frag_target = targ;
+ frag_damage = damage;
+ frag_force = force;
+ frag_deathtype = deathtype;
+ MUTATOR_CALLHOOK(PlayerDamage_Calculate);
+ damage = frag_damage;
+ force = frag_force;
+
// apply strength multiplier
if ((attacker.items & IT_STRENGTH) && !g_minstagib)
{
if(targ == attacker)
{
- damage = damage * cvar("g_balance_powerup_strength_selfdamage");
- force = force * cvar("g_balance_powerup_strength_selfforce");
+ damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
+ force = force * autocvar_g_balance_powerup_strength_selfforce;
}
else
{
- damage = damage * cvar("g_balance_powerup_strength_damage");
- force = force * cvar("g_balance_powerup_strength_force");
+ damage = damage * autocvar_g_balance_powerup_strength_damage;
+ force = force * autocvar_g_balance_powerup_strength_force;
}
}
// apply invincibility multiplier
if (targ.items & IT_INVINCIBLE && !g_minstagib)
- damage = damage * cvar("g_balance_powerup_invincible_takedamage");
+ damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
if (targ == attacker)
{
- if(g_ca || (g_cts && !cvar("g_cts_selfdamage")))
+ if(g_ca || (g_cts && !autocvar_g_cts_selfdamage))
damage = 0;
else
- damage = damage * cvar("g_balance_selfdamagepercent"); // Partial damage if the attacker hits himself
+ damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
}
// CTF: reduce damage/force
if(targ == attacker)
if(targ.flagcarried)
{
- damage = damage * cvar("g_ctf_flagcarrier_selfdamage");
- force = force * cvar("g_ctf_flagcarrier_selfforce");
+ damage = damage * autocvar_g_ctf_flagcarrier_selfdamage;
+ force = force * autocvar_g_ctf_flagcarrier_selfforce;
}
if(g_runematch)
{
if(attacker.runes & CURSE_WEAK) // have both curse & rune
{
- damage = damage * cvar("g_balance_rune_strength_combo_damage");
- force = force * cvar("g_balance_rune_strength_combo_force");
+ damage = damage * autocvar_g_balance_rune_strength_combo_damage;
+ force = force * autocvar_g_balance_rune_strength_combo_force;
}
else
{
- damage = damage * cvar("g_balance_rune_strength_damage");
- force = force * cvar("g_balance_rune_strength_force");
+ damage = damage * autocvar_g_balance_rune_strength_damage;
+ force = force * autocvar_g_balance_rune_strength_force;
}
}
else if (attacker.runes & CURSE_WEAK)
{
- damage = damage * cvar("g_balance_curse_weak_damage");
- force = force * cvar("g_balance_curse_weak_force");
+ damage = damage * autocvar_g_balance_curse_weak_damage;
+ force = force * autocvar_g_balance_curse_weak_force;
}
// apply defense rune
if (targ.runes & RUNE_DEFENSE)
{
if (targ.runes & CURSE_VULNER) // have both curse & rune
- damage = damage * cvar("g_balance_rune_defense_combo_takedamage");
+ damage = damage * autocvar_g_balance_rune_defense_combo_takedamage;
else
- damage = damage * cvar("g_balance_rune_defense_takedamage");
+ damage = damage * autocvar_g_balance_rune_defense_takedamage;
}
else if (targ.runes & CURSE_VULNER)
- damage = damage * cvar("g_balance_curse_vulner_takedamage");
+ damage = damage * autocvar_g_balance_curse_vulner_takedamage;
}
// count the damage
{
if(damage > 0)
{
- if(attacker.weapon != WEP_ELECTRO && attacker.weapon != WEP_LASER || ((attacker.weapon == WEP_ELECTRO && cvar("g_balance_electro_lightning") || attacker.weapon == WEP_LASER) && attacker.prevhitsound + cvar("sv_hitsound_antispam_time") < time))
+ if(deathtype != DEATH_FIRE)
{
if(targ.BUTTON_CHAT)
attacker.typehitsound += 1;
else
attacker.hitsound += 1;
- attacker.prevhitsound = time;
}
damage_goodhits += 1;
headshot = 1;
}
if(g_ca)
- PlayerScore_Add(attacker, SP_SCORE, damage * cvar("g_ca_damage2score_multiplier"));
+ PlayerScore_Add(attacker, SP_SCORE, damage * autocvar_g_ca_damage2score_multiplier);
}
}
else
{
if(deathtype != DEATH_FIRE)
+ {
attacker.typehitsound += 1;
+ }
if(mirrordamage > 0)
if(time > attacker.teamkill_complain)
{
// apply vampire rune
if (attacker.runes & CURSE_EMPATHY) // have the curse too
{
- //attacker.health = attacker.health + damage * cvar("g_balance_rune_vampire_combo_absorb");
+ //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb;
attacker.health = bound(
- cvar("g_balance_curse_empathy_minhealth"), // LA: was 3, now 40
- attacker.health + damage * cvar("g_balance_rune_vampire_combo_absorb"),
- cvar("g_balance_rune_vampire_maxhealth")); // LA: was 1000, now 500
+ autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 40
+ attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb,
+ autocvar_g_balance_rune_vampire_maxhealth); // LA: was 1000, now 500
}
else
{
- //attacker.health = attacker.health + damage * cvar("g_balance_rune_vampire_absorb");
+ //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_absorb;
attacker.health = bound(
attacker.health, // LA: was 3, but changed so that you can't lose health
// empathy won't let you gain health in the same way...
- attacker.health + damage * cvar("g_balance_rune_vampire_absorb"),
- cvar("g_balance_rune_vampire_maxhealth")); // LA: was 1000, now 500
+ attacker.health + damage * autocvar_g_balance_rune_vampire_absorb,
+ autocvar_g_balance_rune_vampire_maxhealth); // LA: was 1000, now 500
}
}
// apply empathy curse
else if (attacker.runes & CURSE_EMPATHY)
{
attacker.health = bound(
- cvar("g_balance_curse_empathy_minhealth"), // LA: was 3, now 20
- attacker.health + damage * cvar("g_balance_curse_empathy_takedamage"),
+ autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 20
+ attacker.health + damage * autocvar_g_balance_curse_empathy_takedamage,
attacker.health);
}
}
{
attacker = attacker_save;
if(g_minstagib)
- if(mirrordamage > 0)
+ if(mirrordamage > 0)
+ {
+ // just lose extra LIVES, don't kill the player for mirror damage
+ if(attacker.armorvalue > 0)
{
- // just lose extra LIVES, don't kill the player for mirror damage
- if(attacker.armorvalue > 0)
- {
- attacker.armorvalue = attacker.armorvalue - 1;
- centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
- attacker.hitsound += 1;
- }
- mirrordamage = 0;
+ attacker.armorvalue = attacker.armorvalue - 1;
+ centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
+ attacker.hitsound += 1;
}
+ mirrordamage = 0;
+ }
+
force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE, attacker.origin, force);
}
}
-void Damage_RecordDamage(entity attacker, float deathtype, float damage)
-{
- float weaponid;
- weaponid = DEATH_WEAPONOF(deathtype);
-
- if not(inWarmupStage)
- if (weaponid)
- if ((clienttype(attacker) == CLIENTTYPE_REAL) | (clienttype(attacker) == CLIENTTYPE_BOT)) {
- attacker.stats_hit[weaponid - 1] += damage;
- attacker.stat_hit = weaponid + 64 * floor(attacker.stats_hit[weaponid - 1]);
- }
-}
-
float RadiusDamage_running;
float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
// Returns total damage applies to creatures
float tfloorforce;
float stat_damagedone;
- float stat_maxdamage;
if(RadiusDamage_running)
{
- string save;
- print("RadiusDamage called recursively!\n");
- print("Expect stuff to go HORRIBLY wrong.\n");
- print("Causing a stack trace...\n");
- save = cvar_string("prvm_backtraceforwarnings");
- cvar_set("prvm_backtraceforwarnings", "1");
- fclose(-1); // calls VM_Warning
- cvar_set("prvm_backtraceforwarnings", save);
+ backtrace("RadiusDamage called recursively! Expect stuff to go HORRIBLY wrong.");
return 0;
}
RadiusDamage_running = 1;
- tfloordmg = cvar("g_throughfloor_damage");
- tfloorforce = cvar("g_throughfloor_force");
+ tfloordmg = autocvar_g_throughfloor_damage;
+ tfloorforce = autocvar_g_throughfloor_force;
blastorigin = (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5);
total_damage_to_creatures = 0;
}
stat_damagedone = 0;
- stat_maxdamage = 0;
targ = WarpZone_FindRadius (blastorigin, rad, FALSE);
while (targ)
// laser force adjustments :P
if(DEATH_WEAPONOF(deathtype) == WEP_LASER)
{
- vector vel;
-
- float force_zscale;
- float force_velocitybiasramp;
- float force_velocitybias;
-
- force_velocitybiasramp = cvar("sv_maxspeed");
- if(deathtype & HITTYPE_SECONDARY)
- {
- force_zscale = cvar("g_balance_laser_secondary_force_zscale");
- force_velocitybias = cvar("g_balance_laser_secondary_force_velocitybias");
- }
- else
- {
- force_zscale = cvar("g_balance_laser_primary_force_zscale");
- force_velocitybias = cvar("g_balance_laser_primary_force_velocitybias");
- }
-
- vel = targ.velocity;
- vel_z = 0;
- vel = normalize(vel) * bound(0, vlen(vel) / force_velocitybiasramp, 1) * force_velocitybias;
- force =
- vlen(force)
- *
- normalize(normalize(force) + vel);
-
- force_z *= force_zscale;
+ if (targ == attacker)
+ {
+ vector vel;
+
+ float force_zscale;
+ float force_velocitybiasramp;
+ float force_velocitybias;
+
+ force_velocitybiasramp = autocvar_sv_maxspeed;
+ if(deathtype & HITTYPE_SECONDARY)
+ {
+ force_zscale = autocvar_g_balance_laser_secondary_force_zscale;
+ force_velocitybias = autocvar_g_balance_laser_secondary_force_velocitybias;
+ }
+ else
+ {
+ force_zscale = autocvar_g_balance_laser_primary_force_zscale;
+ force_velocitybias = autocvar_g_balance_laser_primary_force_velocitybias;
+ }
+
+ vel = targ.velocity;
+ vel_z = 0;
+ vel = normalize(vel) * bound(0, vlen(vel) / force_velocitybiasramp, 1) * force_velocitybias;
+ force =
+ vlen(force)
+ *
+ normalize(normalize(force) + vel);
+
+ force_z *= force_zscale;
+ }
+ else
+ {
+ if(deathtype & HITTYPE_SECONDARY)
+ {
+ force *= autocvar_g_balance_laser_secondary_force_other_scale;
+ }
+ else
+ {
+ force *= autocvar_g_balance_laser_primary_force_other_scale;
+ }
+ }
}
//if (targ == attacker)
{
total_damage_to_creatures += finaldmg;
- if(targ.flags & FL_CLIENT)
- if(targ.deadflag == DEAD_NO)
- if(targ != attacker)
- if(!teamplay || targ.team != attacker.team)
- {
+ if(accuracy_isgooddamage(attacker, targ))
stat_damagedone += finaldmg;
- stat_maxdamage += coredamage;
- }
}
if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
RadiusDamage_running = 0;
- Damage_RecordDamage(attacker, deathtype, min(stat_maxdamage, stat_damagedone));
+ if(!DEATH_ISSPECIAL(deathtype))
+ accuracy_add(attacker, DEATH_WEAPONOFWEAPONDEATH(deathtype), 0, min(coredamage, stat_damagedone));
return total_damage_to_creatures;
}
e.fire_hitsound = FALSE;
}
}
+ if(accuracy_isgooddamage(o, e))
+ accuracy_add(o, DEATH_WEAPONOFWEAPONDEATH(dt), 0, max(0, totaldamage - mindamage));
return max(0, totaldamage - mindamage); // can never be negative, but to make sure
}
else
e.fire_deathtype = dt;
e.fire_owner = o;
e.fire_hitsound = FALSE;
+ if(accuracy_isgooddamage(o, e))
+ accuracy_add(o, DEATH_WEAPONOFWEAPONDEATH(dt), 0, d);
return d;
}
}
if(e.watertype != CONTENT_LAVA)
e.fire_endtime = 0;
+ // ice stops fire
+ if(e.freezetag_frozen)
+ e.fire_endtime = 0;
+
t = min(frametime, e.fire_endtime - time);
d = e.fire_damagepersec * t;
}
e.fire_hitsound = TRUE;
- Damage_RecordDamage(e.fire_owner, e.fire_deathtype, d);
-
if not(IS_INDEPENDENT_PLAYER(e))
FOR_EACH_PLAYER(other) if(e != other)
{
if not(IS_INDEPENDENT_PLAYER(other))
if(boxesoverlap(e.absmin, e.absmax, other.absmin, other.absmax))
{
- t = cvar("g_balance_firetransfer_time") * (e.fire_endtime - time);
- d = cvar("g_balance_firetransfer_damage") * e.fire_damagepersec * t;
+ t = autocvar_g_balance_firetransfer_time * (e.fire_endtime - time);
+ d = autocvar_g_balance_firetransfer_damage * e.fire_damagepersec * t;
Fire_AddDamage(other, o, d, t, DEATH_FIRE);
}
}
if(self.state == 1)
{
- pullspeed = cvar("g_balance_grapplehook_speed_pull");//2000;
+ pullspeed = autocvar_g_balance_grapplehook_speed_pull;//2000;
// speed the rope is pulled with
- rubberforce = cvar("g_balance_grapplehook_force_rubber");//2000;
+ rubberforce = autocvar_g_balance_grapplehook_force_rubber;//2000;
// force the rope will use if it is stretched
- rubberforce_overstretch = cvar("g_balance_grapplehook_force_rubber_overstretch");//1000;
+ rubberforce_overstretch = autocvar_g_balance_grapplehook_force_rubber_overstretch;//1000;
// force the rope will use if it is stretched
- minlength = cvar("g_balance_grapplehook_length_min");//100;
+ minlength = autocvar_g_balance_grapplehook_length_min;//100;
// minimal rope length
// if the rope goes below this length, it isn't pulled any more
- ropestretch = cvar("g_balance_grapplehook_stretch");//400;
+ ropestretch = autocvar_g_balance_grapplehook_stretch;//400;
// if the rope is stretched by more than this amount, more rope is
// given to you again
- ropeairfriction = cvar("g_balance_grapplehook_airfriction");//0.2
+ ropeairfriction = autocvar_g_balance_grapplehook_airfriction;//0.2
// while hanging on the rope, this friction component will help you a
// bit to control the rope
dist = vlen(dir);
dir = normalize(dir);
- if(cvar("g_grappling_hook_tarzan"))
+ if(autocvar_g_grappling_hook_tarzan)
{
v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity);
v = v + frametime * dir * spd * rubberforce;
dv = ((v - v0) * dir) * dir;
- if(cvar("g_grappling_hook_tarzan") >= 2)
+ if(autocvar_g_grappling_hook_tarzan >= 2)
{
if(self.aiment.movetype == MOVETYPE_WALK)
{
self.aiment.velocity = self.aiment.velocity - dv * 0.5;
self.aiment.flags &~= FL_ONGROUND;
self.aiment.pusher = self.owner;
- self.aiment.pushltime = time + cvar("g_maxpushtime");
+ self.aiment.pushltime = time + autocvar_g_maxpushtime;
}
}
if(attacker != self.owner)
{
self.owner.pusher = attacker;
- self.owner.pushltime = time + cvar("g_maxpushtime");
+ self.owner.pushltime = time + autocvar_g_maxpushtime;
}
RemoveGrapplingHook(self.owner);
}
if((arena_roundbased && time < warmup) || (time < game_starttime))
return;
+ if(self.freezetag_frozen)
+ return;
+
makevectors(self.v_angle);
s = self.cvar_cl_gunalign;
missile.state = 0; // not latched onto anything
- W_SetupProjectileVelocityEx(missile, v_forward, v_up, cvar("g_balance_grapplehook_speed_fly"), 0, 0, 0);
+ W_SetupProjectileVelocityEx(missile, v_forward, v_up, autocvar_g_balance_grapplehook_speed_fly, 0, 0, 0, FALSE);
missile.angles = vectoangles (missile.velocity);
//missile.glow_color = 250; // 244, 250
//missile.glow_size = 120;
missile.touch = GrapplingHookTouch;
missile.think = GrapplingHookThink;
- missile.nextthink = time + 0.1;
+ missile.nextthink = time;
missile.effects = /*EF_FULLBRIGHT | EF_ADDITIVE |*/ EF_LOWPRECISION;
- missile.health = cvar("g_balance_grapplehook_health");//120
+ missile.health = autocvar_g_balance_grapplehook_health;//120
missile.event_damage = GrapplingHook_Damage;
missile.takedamage = DAMAGE_AIM;
missile.damageforcescale = 0;
self.think1 ();
}
+void SUB_CalcMove_controller_think (void)
+{
+ entity oldself;
+ float traveltime;
+ float phasepos;
+ float nexttick;
+ vector delta;
+ vector veloc;
+ vector nextpos;
+ if(time < self.animstate_endtime) {
+ delta = self.destvec;
+ nexttick = time + sys_frametime;
+
+ if(nexttick < self.animstate_endtime) {
+ traveltime = self.animstate_endtime - self.animstate_starttime;
+ phasepos = (nexttick - self.animstate_starttime) / traveltime; // range: [0, 1]
+ phasepos = 3.14159265 + (phasepos * 3.14159265); // range: [pi, 2pi]
+ phasepos = cos(phasepos); // cos [pi, 2pi] is in [-1, 1]
+ phasepos = phasepos + 1; // correct range to [0, 2]
+ phasepos = phasepos / 2; // correct range to [0, 1]
+ nextpos = self.origin + (delta * phasepos);
+
+ veloc = nextpos - self.owner.origin;
+ veloc = veloc * (1 / sys_frametime); // so it arrives for the next frame
+
+ } else {
+ veloc = self.finaldest - self.owner.origin;
+ veloc = veloc * (1 / sys_frametime); // so it arrives for the next frame
+ }
+ self.owner.velocity = veloc;
+ self.nextthink = nexttick;
+ } else {
+ oldself = self;
+ self.owner.think = self.think1;
+ self = self.owner;
+ remove(oldself);
+ self.think();
+ }
+}
+
void SUB_CalcMove (vector tdest, float tspeed, void() func)
{
vector delta;
float traveltime;
+ entity controller;
if (!tspeed)
objerror ("No speed is defined!");
return;
}
- self.velocity = delta * (1/traveltime); // QuakeC doesn't allow vector/float division
+ // Very short animations don't really show off the effect
+ // of controlled animation, so let's just use linear movement.
+ // Alternatively entities can choose to specify non-controlled movement.
+ // The only currently implemented alternative movement is linear (value 1)
+ if (traveltime < 0.15 || self.platmovetype == 1)
+ {
+ self.velocity = delta * (1/traveltime); // QuakeC doesn't allow vector/float division
+ self.nextthink = self.ltime + traveltime;
+ return;
+ }
+ controller = spawn();
+ controller.classname = "SUB_CalcMove_controller";
+ controller.owner = self;
+ controller.origin = self.origin; // starting point
+ controller.finaldest = (tdest + '0 0 0.125'); // where do we want to end? Offset to overshoot a bit.
+ controller.destvec = delta;
+ controller.animstate_starttime = time;
+ controller.animstate_endtime = time + traveltime;
+ controller.think = SUB_CalcMove_controller_think;
+ controller.think1 = self.think;
+
+ // the thinking is now done by the controller
+ self.think = SUB_Null;
self.nextthink = self.ltime + traveltime;
+
+ // invoke controller
+ self = controller;
+ self.think();
+ self = self.owner;
}
void SUB_CalcMoveEnt (entity ent, vector tdest, float tspeed, void() func)
}
void traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
{
- if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+ if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
lag = 0;
traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
}
void tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
{
- if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+ if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
lag = 0;
tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, FALSE);
}
}
void WarpZone_traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
{
- if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+ if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
lag = 0;
WarpZone_traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
}
void WarpZone_tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
{
- if (cvar("g_antilag") != 2 || source.cvar_cl_noantilag)
+ if (autocvar_g_antilag != 2 || source.cvar_cl_noantilag)
lag = 0;
tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, TRUE);
}
{
float d;
- if(cvar("loddebug"))
+ if(autocvar_loddebug)
{
- d = cvar("loddebug");
+ d = autocvar_loddebug;
if(d == 1)
self.modelindex = self.lodmodelindex0;
else if(d == 2 || !self.lodmodelindex2)
}
}
- if(cvar("loddebug") < 0)
+ if(autocvar_loddebug < 0)
{
self.lodmodel1 = self.lodmodel2 = ""; // don't even initialize
}
SetCustomizer(self, LOD_customize, LOD_uncustomize);
}
+void ApplyMinMaxScaleAngles(entity e)
+{
+ if(e.angles_x != 0 || e.angles_z != 0 || self.avelocity_x != 0 || self.avelocity_z != 0) // "weird" rotation
+ {
+ e.maxs = '1 1 1' * vlen(
+ '1 0 0' * max(-e.mins_x, e.maxs_x) +
+ '0 1 0' * max(-e.mins_y, e.maxs_y) +
+ '0 0 1' * max(-e.mins_z, e.maxs_z)
+ );
+ e.mins = -e.maxs;
+ }
+ else if(e.angles_y != 0 || self.avelocity_y != 0) // yaw only is a bit better
+ {
+ e.maxs_x = vlen(
+ '1 0 0' * max(-e.mins_x, e.maxs_x) +
+ '0 1 0' * max(-e.mins_y, e.maxs_y)
+ );
+ e.maxs_y = e.maxs_x;
+ e.mins_x = -e.maxs_x;
+ e.mins_y = -e.maxs_x;
+ }
+ if(e.scale)
+ setsize(e, e.mins * e.scale, e.maxs * e.scale);
+ else
+ setsize(e, e.mins, e.maxs);
+}
+
void SetBrushEntityModel()
{
if(self.model != "")
InitializeEntity(self, LODmodel_attach, INITPRIO_FINDTARGET);
}
setorigin(self, self.origin);
- if(self.scale)
- setsize(self, self.mins * self.scale, self.maxs * self.scale);
- else
- setsize(self, self.mins, self.maxs);
+ ApplyMinMaxScaleAngles(self);
}
void SetBrushEntityModelNoLOD()
setmodel(self, self.model); // no precision needed
}
setorigin(self, self.origin);
- if(self.scale)
- setsize(self, self.mins * self.scale, self.maxs * self.scale);
- else
- setsize(self, self.mins, self.maxs);
+ ApplyMinMaxScaleAngles(self);
}
/*
{
// trigger angles are used for one-way touches. An angle of 0 is assumed
// to mean no restrictions, so use a yaw of 360 instead.
- if (self.movedir == '0 0 0')
- if (self.angles != '0 0 0')
- SetMovedir ();
+ SetMovedir ();
self.solid = SOLID_TRIGGER;
SetBrushEntityModel();
self.movetype = MOVETYPE_NONE;
{
// trigger angles are used for one-way touches. An angle of 0 is assumed
// to mean no restrictions, so use a yaw of 360 instead.
- if (self.movedir == '0 0 0')
- if (self.angles != '0 0 0')
- SetMovedir ();
+ SetMovedir ();
self.solid = SOLID_BSP;
SetBrushEntityModel();
self.movetype = MOVETYPE_NONE; // why was this PUSH? -div0
t.message = self.message;
t.killtarget = self.killtarget;
t.target = self.target;
+ t.target2 = self.target2;
+ t.target3 = self.target3;
+ t.target4 = self.target4;
return;
}
void multi_touch()
{
if not(self.spawnflags & 2)
- {
if not(other.iscreature)
return;
- if(self.team)
- if(self.team == other.team)
+ if(self.team)
+ if((self.spawnflags & 4 == 0) == (self.team != other.team))
return;
- }
// if the trigger has an angles field, check player's facing direction
if (self.movedir != '0 0 0')
self.reset = counter_reset;
};
+void trigger_hurt_use()
+{
+ if(activator.classname == "player")
+ self.enemy = activator;
+ else
+ self.enemy = world; // let's just destroy it, if taking over is too much work
+}
+
.float triggerhurttime;
void trigger_hurt_touch()
{
{
EXACTTRIGGER_TOUCH;
other.triggerhurttime = time + 1;
- Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+
+ entity own;
+ own = self.enemy;
+ if(own.classname != "player")
+ {
+ own = self;
+ self.enemy = world; // I still hate you all
+ }
+
+ Damage (other, self, own, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
}
}
else
EXACTTRIGGER_INIT;
self.active = ACTIVE_ACTIVE;
self.touch = trigger_hurt_touch;
+ self.use = trigger_hurt_use;
+ self.enemy = world; // I hate you all
if (!self.dmg)
self.dmg = 1000;
if (!self.message)
if (other.health < self.max_health)
{
other.health = min(other.health + self.health, self.max_health);
- other.pauserothealth_finished = max(other.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
+ other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
}
}
// TODO add a way to do looped sounds with sound(); then complete this entity
.float volume, atten;
-void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);}
+void target_speaker_use_off();
+void target_speaker_use_activator()
+{
+ if(clienttype(activator) != CLIENTTYPE_REAL)
+ return;
+ string snd;
+ if(substring(self.noise, 0, 1) == "*")
+ {
+ var .string sample;
+ sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1));
+ if(GetPlayerSoundSampleField_notFound)
+ snd = "misc/null.wav";
+ else if(activator.sample == "")
+ snd = "misc/null.wav";
+ else
+ {
+ tokenize_console(activator.sample);
+ float n;
+ n = stof(argv(1));
+ if(n > 0)
+ snd = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization
+ else
+ snd = strcat(argv(0), ".wav"); // randomization
+ }
+ }
+ else
+ snd = self.noise;
+ msg_entity = activator;
+ soundto(MSG_ONE, self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+}
+void target_speaker_use_on()
+{
+ string snd;
+ if(substring(self.noise, 0, 1) == "*")
+ {
+ var .string sample;
+ sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1));
+ if(GetPlayerSoundSampleField_notFound)
+ snd = "misc/null.wav";
+ else if(activator.sample == "")
+ snd = "misc/null.wav";
+ else
+ {
+ tokenize_console(activator.sample);
+ float n;
+ n = stof(argv(1));
+ if(n > 0)
+ snd = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization
+ else
+ snd = strcat(argv(0), ".wav"); // randomization
+ }
+ }
+ else
+ snd = self.noise;
+ sound(self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+ if(self.spawnflags & 3)
+ self.use = target_speaker_use_off;
+}
+void target_speaker_use_off()
+{
+ sound(self, CHAN_TRIGGER, "misc/null.wav", VOL_BASE * self.volume, self.atten);
+ self.use = target_speaker_use_on;
+}
+void target_speaker_reset()
+{
+ if(self.spawnflags & 1) // LOOPED_ON
+ {
+ if(self.use == target_speaker_use_on)
+ target_speaker_use_on();
+ }
+ else if(self.spawnflags & 2)
+ {
+ if(self.use == target_speaker_use_off)
+ target_speaker_use_off();
+ }
+}
void spawnfunc_target_speaker()
{
+ // TODO: "*" prefix to sound file name
+ // TODO: wait and random (just, HOW? random is not a field)
if(self.noise)
precache_sound (self.noise);
- IFTARGETED
+
+ if(!self.atten && !(self.spawnflags & 4))
{
- if(!self.atten)
+ IFTARGETED
self.atten = ATTN_NORM;
- else if(self.atten < 0)
- self.atten = 0;
- if(!self.volume)
- self.volume = 1;
- self.use = target_speaker_use;
+ else
+ self.atten = ATTN_STATIC;
+ }
+ else if(self.atten < 0)
+ self.atten = 0;
+
+ if(!self.volume)
+ self.volume = 1;
+
+ IFTARGETED
+ {
+ if(self.spawnflags & 8) // ACTIVATOR
+ self.use = target_speaker_use_activator;
+ else if(self.spawnflags & 1) // LOOPED_ON
+ {
+ target_speaker_use_on();
+ self.reset = target_speaker_reset;
+ }
+ else if(self.spawnflags & 2) // LOOPED_OFF
+ {
+ self.use = target_speaker_use_on;
+ self.reset = target_speaker_reset;
+ }
+ else
+ self.use = target_speaker_use_on;
+ }
+ else if(self.spawnflags & 1) // LOOPED_ON
+ {
+ ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten);
+ remove(self);
+ }
+ else if(self.spawnflags & 2) // LOOPED_OFF
+ {
+ objerror("This sound entity can never be activated");
}
else
{
- if(!self.atten)
- self.atten = ATTN_STATIC;
- else if(self.atten < 0)
- self.atten = 0;
- if(!self.volume)
- self.volume = 1;
+ // Quake/Nexuiz fallback
ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten);
+ remove(self);
}
};
EXACTTRIGGER_INIT;
if(self.radius)
{
- if(!self.strength) self.strength = 2000 * cvar("g_triggerimpulse_radial_multiplier");
+ if(!self.strength) self.strength = 2000 * autocvar_g_triggerimpulse_radial_multiplier;
setorigin(self, self.origin);
setsize(self, '-1 -1 -1' * self.radius,'1 1 1' * self.radius);
self.touch = trigger_impulse_touch3;
{
if(self.target)
{
- if(!self.strength) self.strength = 950 * cvar("g_triggerimpulse_directional_multiplier");
+ if(!self.strength) self.strength = 950 * autocvar_g_triggerimpulse_directional_multiplier;
self.touch = trigger_impulse_touch1;
}
else
{
if(!self.strength) self.strength = 0.9;
- self.strength = pow(self.strength, cvar("g_triggerimpulse_accel_power")) * cvar("g_triggerimpulse_accel_multiplier");
+ self.strength = pow(self.strength, autocvar_g_triggerimpulse_accel_power) * autocvar_g_triggerimpulse_accel_multiplier;
self.touch = trigger_impulse_touch2;
}
}
attach_sameorigin(dst, src, self.message);
}
+ dst.solid = SOLID_NOT; // solid doesn't work with attachment
remove(self);
}
else
void SetDefaultAlpha()
{
- if(cvar("g_running_guns"))
+ if(autocvar_g_running_guns)
{
default_player_alpha = -1;
default_weapon_alpha = +1;
}
else if(g_cloaked)
{
- default_player_alpha = cvar("g_balance_cloaked_alpha");
+ default_player_alpha = autocvar_g_balance_cloaked_alpha;
default_weapon_alpha = default_player_alpha;
}
else
{
- default_player_alpha = cvar("g_player_alpha");
+ default_player_alpha = autocvar_g_player_alpha;
if(default_player_alpha == 0)
default_player_alpha = 1;
default_weapon_alpha = default_player_alpha;
{
float a, b;
- if(!cvar("developer_fteqccbugs"))
+ if(!autocvar_developer_fteqccbugs)
return;
dprint("*** fteqcc test: checking for bugs...\n");
centerprint_atprio(plr, CENTERPRIO_SPAM, timeStr);
}
}
- if(remainingTimeoutTime == cvar("sv_timeout_resumetime")) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
+ if(remainingTimeoutTime == autocvar_sv_timeout_resumetime) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
Announce("prepareforbattle");
}
remainingTimeoutTime -= 1;
void GotoFirstMap()
{
float n;
- if(cvar("_sv_init"))
+ if(autocvar__sv_init)
{
// cvar_set("_sv_init", "0");
// we do NOT set this to 0 any more, so someone "accidentally" changing
// to this "init" map on a dedicated server will cause no permanent
// harm
- if(cvar("g_maplist_shuffle"))
+ if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
- n = tokenizebyseparator(cvar_string("g_maplist"), " ");
+ n = tokenizebyseparator(autocvar_g_maplist, " ");
cvar_set("g_maplist_index", ftos(n - 1)); // jump to map 0 in GotoNextMap
MapInfo_Enumerate();
k = bufstr_get(h, i);
#define BADPREFIX(p) if(substring(k, 0, strlen(p)) == p) continue
+#define BADPRESUFFIX(p,s) if(substring(k, 0, strlen(p)) == p && substring(k, -strlen(s), -1) == s) continue
#define BADCVAR(p) if(k == p) continue
+
+ // general excludes and namespaces for server admin used cvars
+ BADPREFIX("help_"); // PN's server has this listed as changed, let's not rat him out for THAT
+
// internal
BADPREFIX("csqc_");
BADPREFIX("cvar_check_");
BADPREFIX("gl_");
BADPREFIX("joy");
BADPREFIX("hud_");
+ BADPREFIX("m_");
BADPREFIX("menu_");
BADPREFIX("net_slist_");
BADPREFIX("r_");
BADPREFIX("sbar_");
BADPREFIX("scr_");
BADPREFIX("snd_");
+ BADPREFIX("show");
+ BADPREFIX("sensitivity");
BADPREFIX("userbind");
BADPREFIX("v_");
BADPREFIX("vid_");
BADCVAR("bgmvolume");
// private
+ BADCVAR("developer");
+ BADCVAR("g_banned_list");
+ BADCVAR("log_dest_udp");
+ BADCVAR("log_file");
+ BADCVAR("net_address");
+ BADCVAR("net_address_ipv6");
+ BADCVAR("port");
+ BADCVAR("savedgamecfg");
BADCVAR("serverconfig");
+ BADCVAR("sv_heartbeatperiod");
+ BADCVAR("sv_vote_master_password");
+ BADCVAR("sys_colortranslation");
+ BADCVAR("sys_specialcharactertranslation");
+ BADCVAR("timestamps");
+ BADPREFIX("developer_");
BADPREFIX("g_ban_");
BADPREFIX("g_chat_flood_");
BADPREFIX("g_voice_flood_");
BADPREFIX("sv_eventlog");
BADPREFIX("sv_logscores_");
BADPREFIX("sv_master");
- BADCVAR("g_banned_list");
- BADCVAR("log_dest_udp");
- BADCVAR("log_file");
- BADCVAR("net_address");
- BADCVAR("port");
- BADCVAR("savedgamecfg");
- BADCVAR("sv_heartbeatperiod");
- BADCVAR("sv_vote_master_password");
- BADCVAR("sys_colortranslation");
- BADCVAR("sys_specialcharactertranslation");
- BADCVAR("timestamps");
- BADCVAR("net_address");
- BADCVAR("net_address_ipv6");
BADPREFIX("sv_weaponstats_");
- BADCVAR("developer");
- BADPREFIX("developer_");
+
+ // these can contain player IDs, so better hide
+ BADCVAR("g_forced_team_red");
+ BADCVAR("g_forced_team_blue");
+ BADCVAR("g_forced_team_yellow");
+ BADCVAR("g_forced_team_pink");
// mapinfo
- BADCVAR("timelimit");
BADCVAR("fraglimit");
- BADCVAR("leadlimit");
- BADCVAR("g_tdm_teams");
- BADCVAR("g_keyhunt_teams");
- BADCVAR("g_domination_default_teams");
- BADCVAR("g_race_qualifying_timelimit");
- BADCVAR("g_lms");
BADCVAR("g_arena");
- BADCVAR("g_ca");
BADCVAR("g_assault");
+ BADCVAR("g_ca");
BADCVAR("g_ctf");
+ BADCVAR("g_cts");
BADCVAR("g_dm");
BADCVAR("g_domination");
+ BADCVAR("g_domination_default_teams");
+ BADCVAR("g_freezetag");
+ BADCVAR("g_keepaway");
BADCVAR("g_keyhunt");
BADCVAR("g_keyhunt_teams");
+ BADCVAR("g_keyhunt_teams");
+ BADCVAR("g_lms");
+ BADCVAR("g_nexball");
BADCVAR("g_onslaught");
BADCVAR("g_race");
- BADCVAR("g_cts");
+ BADCVAR("g_race_qualifying_timelimit");
BADCVAR("g_runematch");
BADCVAR("g_tdm");
- BADCVAR("g_nexball");
+ BADCVAR("g_tdm_teams");
+ BADCVAR("leadlimit");
+ BADCVAR("nextmap");
BADCVAR("teamplay");
+ BADCVAR("timelimit");
// long
BADCVAR("hostname");
// does nothing visible
BADCVAR("captureleadlimit_override");
BADCVAR("g_arena_point_leadlimit");
+ BADCVAR("g_balance_kill_delay");
BADCVAR("g_ca_point_leadlimit");
+ BADCVAR("g_ctf_captimerecord_always");
BADCVAR("g_ctf_capture_leadlimit");
+ BADCVAR("g_ctf_flag_capture_effects");
+ BADCVAR("g_ctf_flag_glowtrails");
+ BADCVAR("g_ctf_flag_pickup_effects");
BADCVAR("g_domination_point_leadlimit");
+ BADCVAR("g_forced_respawn");
BADCVAR("g_keyhunt_point_leadlimit");
BADCVAR("g_nexball_goalleadlimit");
BADCVAR("g_runematch_point_leadlimit");
BADCVAR("leadlimit_and_fraglimit");
BADCVAR("leadlimit_override");
+ BADCVAR("pausable");
BADCVAR("sv_checkforpacketsduringsleep");
+ BADCVAR("sv_timeout");
+ BADCVAR("welcome_message_time");
BADPREFIX("crypto_");
BADPREFIX("g_chat_");
+ BADPREFIX("g_ctf_captimerecord_");
+ BADPREFIX("g_maplist_votable_");
+ BADPREFIX("net_");
BADPREFIX("prvm_");
+ BADPREFIX("skill_");
BADPREFIX("sv_fragmessage_");
+ BADPREFIX("sv_maxidle_");
BADPREFIX("sv_vote_");
BADPREFIX("timelimit_");
BADCVAR("g_nexball_goallimit");
BADCVAR("g_runematch_point_limit");
BADCVAR("g_start_delay");
+ BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
BADCVAR("hostname");
BADCVAR("log_file");
BADCVAR("maxplayers");
+ BADCVAR("g_maxplayers");
BADCVAR("minplayers");
BADCVAR("net_address");
BADCVAR("port");
BADCVAR("sv_autoscreenshot");
BADCVAR("sv_curl_defaulturl");
BADCVAR("sv_defaultcharacter");
+ BADCVAR("sv_defaultplayercolors");
BADCVAR("sv_defaultplayermodel");
BADCVAR("sv_defaultplayerskin");
BADCVAR("sv_maxidle");
BADCVAR("sv_vote_master_password");
BADCVAR("sv_vote_simple_majority_factor");
BADCVAR("timelimit_override");
+ BADCVAR("g_warmup");
+ BADPREFIX("g_warmup_");
+ BADCVAR("teamplay_mode");
+
+ if(autocvar_g_minstagib)
+ {
+ BADCVAR("g_grappling_hook");
+ BADCVAR("g_jetpack");
+ }
#undef BADPREFIX
#undef BADCVAR
TemporaryDB = db_create();
- /*
- TODO sound pack system
- // initialize sound pack system
- soundpack = cvar_string("g_soundpack");
- if(soundpack != "")
- soundpack = strcat(soundpack, "/");
- soundpack = strzone(soundpack);
- */
-
// 0 normal
lightstyle(0, "m");
// 63 testing
lightstyle(63, "a");
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
CampaignPreInit();
Map_MarkAsRecent(mapname);
LaserInit();
player_count = 0;
- bot_waypoints_for_items = cvar("g_waypoints_for_items");
+ bot_waypoints_for_items = autocvar_g_waypoints_for_items;
if(bot_waypoints_for_items == 1)
if(self.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
bot_waypoints_for_items = 0;
// for setting by mapinfo
- q3acompat_machineshotgunswap = cvar("sv_q3acompat_machineshotgunswap");
+ q3acompat_machineshotgunswap = autocvar_sv_q3acompat_machineshotgunswap;
cvar_set("sv_q3acompat_machineshotgunswap", "0");
precache();
// dom_init();
GameLogInit(); // prepare everything
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
{
- s = strcat(cvar_string("sv_eventlog_files_counter"), ".");
+ s = strcat(ftos(autocvar_sv_eventlog_files_counter), ".");
s = strcat(s, ftos(random()));
matchid = strzone(s);
s = ret_string;
// simple, probably not good in the mutator system
- if(cvar("g_grappling_hook"))
+ if(autocvar_g_grappling_hook)
s = strcat(s, ":grappling_hook");
// initialiation stuff, not good in the mutator system
- if(!cvar("g_use_ammunition"))
+ if(!autocvar_g_use_ammunition)
s = strcat(s, ":no_use_ammunition");
// initialiation stuff, not good in the mutator system
- if(!cvar("g_pickup_items"))
+ if(!autocvar_g_pickup_items)
s = strcat(s, ":no_pickup_items");
// initialiation stuff, not good in the mutator system
- if(cvar_string("g_weaponarena") != "0")
- s = strcat(s, ":", cvar_string("g_weaponarena"), " arena");
+ if(autocvar_g_weaponarena != "0")
+ s = strcat(s, ":", autocvar_g_weaponarena, " arena");
// TODO to mutator system
- if(cvar("g_norecoil"))
+ if(autocvar_g_norecoil)
s = strcat(s, ":norecoil");
// TODO to mutator system
- if(cvar("g_midair"))
+ if(autocvar_g_midair)
s = strcat(s, ":midair");
// TODO to mutator system
- if(cvar("g_minstagib"))
+ if(autocvar_g_minstagib)
s = strcat(s, ":minstagib");
GameLogEcho(s);
SetDefaultAlpha();
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
CampaignPostInit();
fteqcc_testbugs();
addstat(STAT_INVINCIBLE_FINISHED, AS_FLOAT, invincible_finished);
addstat(STAT_PRESSED_KEYS, AS_FLOAT, pressedkeys);
addstat(STAT_FUEL, AS_INT, ammo_fuel);
- addstat(STAT_DAMAGE_HITS, AS_INT, stat_hit);
- addstat(STAT_DAMAGE_FIRED, AS_INT, stat_fired);
addstat(STAT_SHOTORG, AS_INT, stat_shotorg);
addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit);
- addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter);
+ addstat(STAT_BULLETS_LOADED, AS_INT, sniperrifle_bulletcounter);
addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup);
+ addstat(STAT_HIT_TIME, AS_FLOAT, hit_time);
+ addstat(STAT_TYPEHIT_TIME, AS_FLOAT, typehit_time);
addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
+ addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_chargepool_ammo);
- if(g_ca)
+ if(g_ca || g_freezetag)
{
addstat(STAT_REDALIVE, AS_INT, redalive_stat);
addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
+ addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat);
+ addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat);
}
+ if(g_freezetag)
+ {
+ addstat(STAT_FROZEN, AS_INT, freezetag_frozen);
+ addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress);
+ }
+
// g_movementspeed hack
addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
+ addstat(STAT_MOVEVARS_MAXSPEED, AS_FLOAT, stat_sv_maxspeed);
addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
lsnewmaps_reply = strzone(strcat(lsnewmaps_reply, "\n"));
maplist_reply = "^7Maps in list: ";
- n = tokenize_console(cvar_string("g_maplist"));
+ n = tokenize_console(autocvar_g_maplist);
for(i = 0, j = 0; i < n; ++i)
{
if(MapInfo_CheckMap(argv(i)))
localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
// fill sv_curl_serverpackages from .serverpackage files
- if(cvar("sv_curl_serverpackages_auto"))
+ if(autocvar_sv_curl_serverpackages_auto)
{
fd = search_begin("*.serverpackage", TRUE, FALSE);
s = "";
cvar_set("sv_curl_serverpackages", substring(s, 1, -1));
}
+ PlayerStats_Init();
+
world_initialized = 1;
}
string map;
map = GetMapname();
- idx = cvar("g_maplist_index");
+ idx = autocvar_g_maplist_index;
if(idx >= 0)
if(idx < Map_Count)
float MapHasRightSize(string map)
{
float fh;
- if(currentbots || cvar("bot_number") || player_count < cvar("minplayers"))
- if(cvar("g_maplist_check_waypoints"))
+ if(currentbots || autocvar_bot_number || player_count < autocvar_minplayers)
+ if(autocvar_g_maplist_check_waypoints)
{
dprint("checkwp "); dprint(map);
fh = fopen(strcat("maps/", map, ".waypoints"), FILE_READ);
void Map_MarkAsRecent(string m)
{
- cvar_set("g_maplist_mostrecent", strwords(strcat(m, " ", cvar_string("g_maplist_mostrecent")), max(0, cvar("g_maplist_mostrecent_count"))));
+ cvar_set("g_maplist_mostrecent", strwords(strcat(m, " ", autocvar_g_maplist_mostrecent), max(0, autocvar_g_maplist_mostrecent_count)));
}
float Map_IsRecent(string m)
{
- return strhasword(cvar_string("g_maplist_mostrecent"), m);
+ return strhasword(autocvar_g_maplist_mostrecent, m);
}
float Map_Check(float position, float pass)
newlist = strcat(newlist, " ", argv(j));
newlist = substring(newlist, 1, strlen(newlist) - 1);
cvar_set("g_maplist", newlist);
- Map_Count = tokenizebyseparator(cvar_string("g_maplist"), " ");
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
// NOTE: the selected map has just been inserted at (insertpos-1)th position
Map_Current = insertpos - 1; // this is not really valid, but this way the fallback has a chance of working
void Maplist_Init()
{
- Map_Count = tokenizebyseparator(cvar_string("g_maplist"), " ");
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
if(Map_Count == 0)
{
bprint( "Maplist is empty! Resetting it to default map list.\n" );
cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
- if(cvar("g_maplist_shuffle"))
+ if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
- Map_Count = tokenizebyseparator(cvar_string("g_maplist"), " ");
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
}
if(Map_Count == 0)
error("empty maplist, cannot select a new map");
nextMap = -1;
if(nextMap == -1)
- if(cvar("g_maplist_shuffle") > 0)
- nextMap = MaplistMethod_Shuffle(cvar("g_maplist_shuffle") + 1);
+ if(autocvar_g_maplist_shuffle > 0)
+ nextMap = MaplistMethod_Shuffle(autocvar_g_maplist_shuffle + 1);
if(nextMap == -1)
- if(cvar("g_maplist_selectrandom"))
+ if(autocvar_g_maplist_selectrandom)
nextMap = MaplistMethod_Random();
if(nextMap == -1)
float DoNextMapOverride()
{
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
{
CampaignPostIntermission();
alreadychangedlevel = TRUE;
return TRUE;
}
- if(cvar("quit_when_empty"))
+ if(autocvar_quit_when_empty)
{
if(player_count <= currentbots)
{
return TRUE;
}
}
- if(cvar_string("quit_and_redirect") != "")
+ if(autocvar_quit_and_redirect != "")
{
- redirection_target = strzone(cvar_string("quit_and_redirect"));
+ redirection_target = strzone(autocvar_quit_and_redirect);
alreadychangedlevel = TRUE;
return TRUE;
}
- if (cvar("samelevel")) // if samelevel is set, stay on same level
+ if (autocvar_samelevel) // if samelevel is set, stay on same level
{
// this does not work because it tries to exec maps/nexdm01.mapcfg (which doesn't exist, it should be trying maps/dm_nexdm01.mapcfg for example)
//localcmd(strcat("exec \"maps/", mapname, ".mapcfg\"\n"));
alreadychangedlevel = TRUE;
return TRUE;
}
- if(cvar_string("nextmap") != "")
- if(MapInfo_CheckMap(cvar_string("nextmap")))
+ if(autocvar_nextmap != "")
+ if(MapInfo_CheckMap(autocvar_nextmap))
{
- Map_Goto_SetStr(cvar_string("nextmap"));
+ Map_Goto_SetStr(autocvar_nextmap);
Map_Goto();
alreadychangedlevel = TRUE;
return TRUE;
}
- if(cvar("lastlevel"))
+ if(autocvar_lastlevel)
{
GameResetCfg();
localcmd("set lastlevel 0\ntogglemenu\n");
{
bprint( "Maplist contains no single playable map! Resetting it to default map list.\n" );
cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
- if(cvar("g_maplist_shuffle"))
+ if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
}
{
FixIntermissionClient(self);
- if(cvar("sv_autoscreenshot"))
+ if(autocvar_sv_autoscreenshot)
if(self.autoscreenshot > 0)
if(time > self.autoscreenshot)
{
void DumpStats(float final)
{
- local float file;
- local string s;
- local float to_console;
- local float to_eventlog;
- local float to_file;
- local float i;
+ float file;
+ string s;
+ float to_console;
+ float to_eventlog;
+ float to_file;
+ float i;
+ entity e;
- to_console = cvar("sv_logscores_console");
- to_eventlog = cvar("sv_eventlog");
- to_file = cvar("sv_logscores_file");
+ to_console = autocvar_sv_logscores_console;
+ to_eventlog = autocvar_sv_eventlog;
+ to_file = autocvar_sv_logscores_file;
if(!final)
{
}
if(to_eventlog)
- if(cvar("sv_eventlog_console"))
+ if(autocvar_sv_eventlog_console)
to_console = FALSE; // otherwise we get the output twice
if(final)
GameLogEcho(s);
if(to_file)
{
- file = fopen(cvar_string("sv_logscores_filename"), FILE_APPEND);
+ file = fopen(autocvar_sv_logscores_filename, FILE_APPEND);
if(file == -1)
to_file = FALSE;
else
FOR_EACH_CLIENT(other)
{
- if ((clienttype(other) == CLIENTTYPE_REAL) || (clienttype(other) == CLIENTTYPE_BOT && cvar("sv_logscores_bots")))
+ if ((clienttype(other) == CLIENTTYPE_REAL) || (clienttype(other) == CLIENTTYPE_BOT && autocvar_sv_logscores_bots))
{
s = strcat(":player:see-labels:", GetPlayerScoreString(other, 0), ":");
s = strcat(s, ftos(rint(time - other.jointime)), ":");
if(clienttype(e) == CLIENTTYPE_REAL)
{
stuffcmd(e, "\nscr_printspeed 1000000\n");
- s = cvar_string("sv_intermission_cdtrack");
+ s = autocvar_sv_intermission_cdtrack;
if(s != "")
stuffcmd(e, strcat("\ncd loop ", s, "\n"));
msg_entity = e;
*/
void NextLevel()
{
- float i;
-
gameover = TRUE;
intermission_running = 1;
// enforce a wait time before allowing changelevel
if(player_count > 0)
- intermission_exittime = time + cvar("sv_mapchange_delay");
+ intermission_exittime = time + autocvar_sv_mapchange_delay;
else
intermission_exittime = -1;
DumpStats(TRUE);
- if(cvar("sv_eventlog"))
+ // send statistics
+ entity e;
+ PlayerStats_EndMatch(1);
+ FOR_EACH_CLIENT(e)
+ PlayerStats_AddGlobalInfo(e);
+ PlayerStats_Shutdown();
+
+ if(autocvar_sv_eventlog)
GameLogEcho(":gameover");
GameLogClose();
-// TO DO
-
-// save the stats to a text file on the client
-// stuffcmd(other, log_stats "stats/file_name");
-// bprint stats
-// stuffcmd(other, log_stats "");
-// use a filename similar to the demo name
- // string file_name;
- // file_name = strcat("\nlog_file \"stats/", strftime(TRUE, "%Y-%m-%d_%H-%M"), "_", mapname, ".txt\""); // open the log file
-
-// write a stats parser for the menu
-
- if(cvar("sv_accuracy_data_send")) {
- string stats_to_send;
-
- FOR_EACH_CLIENT(other) { // make the string to send
- FixIntermissionClient(other);
-
- if(other.cvar_cl_accuracy_data_share) {
- stats_to_send = strcat(stats_to_send, ":hits:", other.netname);
-
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- stats_to_send = strcat(stats_to_send, ":", ftos(other.stats_hit[i-1]));
-
- stats_to_send = strcat(stats_to_send, "\n:fired:", other.netname);
-
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- stats_to_send = strcat(stats_to_send, ":", ftos(other.stats_fired[i-1]));
-
- stats_to_send = strcat(stats_to_send, "\n");
- }
- }
-
- FOR_EACH_REALCLIENT(other) { // only spam humans
- Score_NicePrint(other); // print the score
-
- if(other.cvar_cl_accuracy_data_receive) // send the stats string to all the willing clients
- bprint(stats_to_send);
- }
- } else { // ye olde message
- FOR_EACH_PLAYER(other) {
- FixIntermissionClient(other);
-
- if(other.winning)
- bprint(other.netname, " ^7wins.\n");
- }
+ FOR_EACH_PLAYER(other) {
+ FixIntermissionClient(other);
+ if(other.winning)
+ bprint(other.netname, " ^7wins.\n");
}
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
CampaignPreIntermission();
localcmd("\nsv_hook_gameend\n");
// - for this timelimit_overtime needs to be >0 of course
// - also check the winning condition calculated in the previous frame and only add normal overtime
// again, if at the point at which timelimit would be extended again, still no winner was found
- if ((checkrules_overtimesadded >= 0) && (checkrules_overtimesadded < cvar("timelimit_overtimes")) && cvar("timelimit_overtime") && !(g_race && !g_race_qualifying))
+ if ((checkrules_overtimesadded >= 0) && (checkrules_overtimesadded < autocvar_timelimit_overtimes) && autocvar_timelimit_overtime && !(g_race && !g_race_qualifying))
{
return 1; // need to call InitiateOvertime later
}
{
if(!checkrules_suddendeathend)
{
- checkrules_suddendeathend = time + 60 * cvar("timelimit_suddendeath");
+ checkrules_suddendeathend = time + 60 * autocvar_timelimit_suddendeath;
if(g_race && !g_race_qualifying)
race_StartCompleting();
}
++checkrules_overtimesadded;
//add one more overtime by simply extending the timelimit
float tl;
- tl = cvar("timelimit");
- tl += cvar("timelimit_overtime");
+ tl = autocvar_timelimit;
+ tl += autocvar_timelimit_overtime;
cvar_set("timelimit", ftos(tl));
string minutesPlural;
- if (cvar("timelimit_overtime") == 1)
+ if (autocvar_timelimit_overtime == 1)
minutesPlural = " ^3minute";
else
minutesPlural = " ^3minutes";
bcenterprint(
strcat(
"^3Now playing ^1OVERTIME^3!\n\n^3Added ^1",
- ftos(cvar("timelimit_overtime")),
+ ftos(autocvar_timelimit_overtime),
minutesPlural,
" to the game!"
)
float GetWinningCode(float fraglimitreached, float equality)
{
- if(cvar("g_campaign") == 1)
+ if(autocvar_g_campaign == 1)
if(fraglimitreached)
return WINNING_YES;
else
float LMS_NewPlayerLives()
{
float fl;
- fl = cvar("fraglimit");
+ fl = autocvar_fraglimit;
if(fl == 0)
fl = 999;
if(lms_lowest_lives < 1)
return 0;
- if(!cvar("g_lms_join_anytime"))
- if(lms_lowest_lives < fl - cvar("g_lms_last_join"))
+ if(!autocvar_g_lms_join_anytime)
+ if(lms_lowest_lives < fl - autocvar_g_lms_last_join)
return 0;
return bound(1, lms_lowest_lives, fl);
TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0));
- if(ent.cnt == 1 || cvar("g_campaign")) // this was the second round
+ if(ent.cnt == 1 || autocvar_g_campaign) // this was the second round
{
status = WINNING_YES;
}
void ShuffleMaplist()
{
- cvar_set("g_maplist", shufflewords(cvar_string("g_maplist")));
+ cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
}
float leaderfrags;
{
float leadlimitreached;
leadlimitreached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
- if(cvar("leadlimit_and_fraglimit"))
+ if(autocvar_leadlimit_and_fraglimit)
limitreached = (limitreached && leadlimitreached);
else
limitreached = (limitreached || leadlimitreached);
return;
}
- timelimit = cvar("timelimit") * 60;
- fraglimit = cvar("fraglimit");
- leadlimit = cvar("leadlimit");
+ timelimit = autocvar_timelimit * 60;
+ fraglimit = autocvar_fraglimit;
+ leadlimit = autocvar_leadlimit;
if(inWarmupStage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
{
float i;
if(m == "")
return "That's not how to use this command.";
- if(!cvar("g_maplist_votable_suggestions"))
+ if(!autocvar_g_maplist_votable_suggestions)
return "Suggestions are not accepted on this server.";
if(mapvote_initialized)
return "Can't suggest - voting is already in progress!";
m = MapInfo_FixName(m);
if(!m)
return "The map you suggested is not available on this server.";
- if(!cvar("g_maplist_votable_suggestions_override_mostrecent"))
+ if(!autocvar_g_maplist_votable_suggestions_override_mostrecent)
if(Map_IsRecent(m))
return "This server does not allow for recent maps to be played again. Please be patient for some rounds.";
if(mapvote_suggestions[i] != "")
strunzone(mapvote_suggestions[i]);
mapvote_suggestions[i] = strzone(m);
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:suggested:", m, ":", ftos(self.playerid)));
return strcat("Suggestion of ", m, " accepted.");
}
MapVote_ClearAllVotes();
mapvote_count = 0;
- mapvote_detail = !cvar("g_maplist_votable_nodetail");
- mapvote_abstain = cvar("g_maplist_votable_abstain");
+ mapvote_detail = !autocvar_g_maplist_votable_nodetail;
+ mapvote_abstain = autocvar_g_maplist_votable_abstain;
if(mapvote_abstain)
- nmax = min(MAPVOTE_COUNT - 1, cvar("g_maplist_votable"));
+ nmax = min(MAPVOTE_COUNT - 1, autocvar_g_maplist_votable);
else
- nmax = min(MAPVOTE_COUNT, cvar("g_maplist_votable"));
- smax = min3(nmax, cvar("g_maplist_votable_suggestions"), mapvote_suggestion_ptr);
+ nmax = min(MAPVOTE_COUNT, autocvar_g_maplist_votable);
+ smax = min3(nmax, autocvar_g_maplist_votable_suggestions, mapvote_suggestion_ptr);
// we need this for AddVotable, as that cycles through the screenshot dirs
- mapvote_screenshot_dirs_count = tokenize_console(cvar_string("g_maplist_votable_screenshot_dir"));
+ mapvote_screenshot_dirs_count = tokenize_console(autocvar_g_maplist_votable_screenshot_dir);
if(mapvote_screenshot_dirs_count == 0)
mapvote_screenshot_dirs_count = tokenize_console("maps levelshots");
mapvote_screenshot_dirs_count = min(mapvote_screenshot_dirs_count, MAPVOTE_SCREENSHOT_DIRS_COUNT);
{
bprint( "Maplist contains no single playable map! Resetting it to default map list.\n" );
cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
- if(cvar("g_maplist_shuffle"))
+ if(autocvar_g_maplist_shuffle)
ShuffleMaplist();
localcmd("\nmenu_cmd sync\n");
for(i = 0; i < 100 && mapvote_count < nmax; ++i)
//dprint("mapvote count is ", ftos(mapvote_count), "\n");
- mapvote_keeptwotime = time + cvar("g_maplist_votable_keeptwotime");
- mapvote_timeout = time + cvar("g_maplist_votable_timeout");
+ mapvote_keeptwotime = time + autocvar_g_maplist_votable_keeptwotime;
+ mapvote_timeout = time + autocvar_g_maplist_votable_timeout;
if(mapvote_count_real < 3 || mapvote_keeptwotime <= time)
mapvote_keeptwotime = 0;
mapvote_message = "Choose a map and press its key!";
float i;
float didntvote;
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
{
result = strcat(":vote:finished:", mapvote_maps[mappos]);
result = strcat(result, ":", ftos(mapvote_votes[mappos]), "::");
}
}
result = strcat(result, ":didn't vote:", ftos(didntvote));
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(result);
}
if(mapvote_run)
return;
+ // wait for stats to be sent first
+ if(!playerstats_waitforme)
+ return;
+
MapInfo_Enumerate();
if(MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1))
mapvote_run = TRUE;
if(!mapvote_initialized)
{
- if(cvar("rescan_pending") == 1)
+ if(autocvar_rescan_pending == 1)
{
cvar_set("rescan_pending", "2");
localcmd("fs_rescan\nrescan_pending 3\n");
return;
}
- else if(cvar("rescan_pending") == 2)
+ else if(autocvar_rescan_pending == 2)
{
return;
}
- else if(cvar("rescan_pending") == 3)
+ else if(autocvar_rescan_pending == 3)
{
// now build missing mapinfo files
if(!MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1))
mapvote_initialized = TRUE;
if(DoNextMapOverride())
return;
- if(!cvar("g_maplist_votable") || player_count <= 0)
+ if(!autocvar_g_maplist_votable || player_count <= 0)
{
GotoNextMap();
return;
if(self.classname == "spectator")
{
if(self.enemy.typehitsound)
- play2(self, "misc/typehit.wav");
- else if(self.enemy.hitsound && self.cvar_cl_hitsound)
- play2(self, "misc/hit.wav");
+ self.typehit_time = time;
+ else if(self.enemy.hitsound)
+ self.hit_time = time;
}
else
{
if(self.typehitsound)
- play2(self, "misc/typehit.wav");
- else if(self.hitsound && self.cvar_cl_hitsound)
- play2(self, "misc/hit.wav");
+ self.typehit_time = time;
+ else if(self.hitsound)
+ self.hit_time = time;
}
}
- altime = time + frametime * (1 + cvar("g_antilag_nudge"));
+ altime = time + frametime * (1 + autocvar_g_antilag_nudge);
// add 1 frametime because after this, engine SV_Physics
// increases time by a frametime and then networks the frame
// add another frametime because client shows everything with
void SV_Shutdown()
{
+ entity e;
+
if(gameover > 1) // shutting down already?
return;
world_initialized = 0;
print("Saving persistent data...\n");
Ban_SaveBans();
+
+ PlayerStats_EndMatch(0);
+ FOR_EACH_CLIENT(e)
+ PlayerStats_AddGlobalInfo(e);
+ PlayerStats_Shutdown();
+
if(!cheatcount_total)
{
- if(cvar("sv_db_saveasdump"))
+ if(autocvar_sv_db_saveasdump)
db_dump(ServerProgsDB, "server.db");
else
db_save(ServerProgsDB, "server.db");
}
- if(cvar("developer"))
+ if(autocvar_developer)
{
- if(cvar("sv_db_saveasdump"))
+ if(autocvar_sv_db_saveasdump)
db_dump(TemporaryDB, "server-temp.db");
else
db_save(TemporaryDB, "server-temp.db");
}
}
+void changematchtime(float delta, float mi, float ma)
+{
+ float cur;
+ float new;
+ float lim;
+
+ if(delta == 0)
+ return;
+ if(autocvar_timelimit < 0)
+ return;
+
+ if(mi <= 10)
+ mi = 10; // at least ten sec in the future
+ cur = time - game_starttime;
+ if(cur > 0)
+ mi += cur; // from current time!
+
+ lim = autocvar_timelimit * 60;
+
+ if(delta > 0)
+ {
+ if(lim == 0)
+ return; // cannot increase any further
+ else if(lim < ma)
+ new = min(ma, lim + delta);
+ else // already above maximum: FAIL
+ return;
+ }
+ else
+ {
+ if(lim == 0) // infinite: try reducing to max, if we are allowed to
+ new = max(mi, ma);
+ else if(lim > mi) // above minimum: decrease
+ new = max(mi, lim + delta);
+ else // already below minimum: FAIL
+ return;
+ }
+
+ cvar_set("timelimit", ftos(new));
+}
+
void GameCommand(string command)
{
float argc;
print(" cvar_changes\n");
print(" cvar_purechanges\n");
print(" find classname\n");
+ print(" extendmatchtime\n");
+ print(" reducematchtime\n");
GameCommand_Vote("help", world);
GameCommand_Ban("help");
GameCommand_Generic("help");
if(plr.classname == "spectator" || plr.classname == "observer")
{
plr.spectatortime = time;
- sprint(plr, strcat("^7You have to become a player within the next ", ftos(cvar("g_maxplayers_spectator_blocktime")), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
+ sprint(plr, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
}
}
- bprint(strcat("^7All spectators will be automatically kicked when not joining the game after ", ftos(cvar("g_maxplayers_spectator_blocktime")), " seconds!\n"));
+ bprint(strcat("^7All spectators will be automatically kicked when not joining the game after ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds!\n"));
return;
}
bprint("That command can only be used in a team-based gamemode.\n");
return;
}
- if(argv(0) == "movetoteam")
- if(argc == 3 || argc == 4) {
-// sv_cmd movetoteam player_id team_colour
-// sv_cmd movetoteam player_id team_colour type_of_move
+ if(argv(0) == "movetoteam") if(argc == 3 || argc == 4) {
+ // sv_cmd movetoteam player_id team_colour
+ // sv_cmd movetoteam player_id team_colour type_of_move
-// type of move
-// 0 (00) automove centerprint, admin message
-// 1 (01) automove centerprint, no admin message
-// 2 (10) no centerprint, admin message
-// 3 (11) no centerprint, no admin message
+ // type of move
+ // 0 (00) automove centerprint, admin message
+ // 1 (01) automove centerprint, no admin message
+ // 2 (10) no centerprint, admin message
+ // 3 (11) no centerprint, no admin message
if(!teams_matter) { // death match
print("Currently not playing a team game\n");
return;
}
- client = edict_num(entno);
+ client = edict_num(entno);
// player entity is not a client
if not(client.flags & FL_CLIENT) {
// find the team to move the player to
float team_colour;
+ float save;
+
+ save = client.team_forced;
+ client.team_forced = 0;
team_colour = ColourToNumber(argv(2));
if(team_colour == client.team) { // player already on the team
print("Player ", argv(1), " (", client.netname, ") is already on the ", ColoredTeamName(client.team), "\n");
+ // keep the forcing undone
return;
} else if(team_colour == 0) // auto team
team_colour = NumberToTeamNumber(FindSmallestTeam(client, FALSE));
+ else
+ CheckAllowedTeams(client);
+
+ client.team_forced = save;
switch(team_colour) {
case COLOR_TEAM1:
if(c1 == -1) {
print("Sorry, there isn't a red team\n");
return;
- }
- break;
+ }
+ break;
case COLOR_TEAM2:
if(c2 == -1) {
print("Sorry, there isn't a blue team\n");
- return;
- }
- break;
+ return;
+ }
+ break;
case COLOR_TEAM3:
if(c3 == -1) {
print("Sorry, there isn't a yellow team\n");
return;
}
- break;
+ break;
case COLOR_TEAM4:
if(c4 == -1) {
print("Sorry, there isn't a pink team\n");
return;
}
- break;
+ break;
default:
print("Sorry, team ", argv(2), " doesn't exist\n");
}
print("Player ", argv(1), " (", client.netname, ") has been moved to the ", ColoredTeamName(team_colour), "\n");
+ client.team_forced = 0;
MoveToTeam(client, team_colour, 6, stof(argv(3)));
return;
return;
}
+ if(argv(0) == "extendmatchtime")
+ {
+ changematchtime(autocvar_timelimit_increment* 60, autocvar_timelimit_min*60, autocvar_timelimit_max*60);
+ return;
+ }
+
+ if(argv(0) == "reducematchtime")
+ {
+ changematchtime(autocvar_timelimit_decrement*-60, autocvar_timelimit_min*60, autocvar_timelimit_max*60);
+ return;
+ }
+
print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
}
string uri;
float i, n;
- uri = strcat( "action=ban&hostname=", uri_escape(cvar_string("hostname")));
+ uri = strcat( "action=ban&hostname=", uri_escape(autocvar_hostname));
uri = strcat(uri, "&ip=", uri_escape(ip));
uri = strcat(uri, "&duration=", ftos(bantime));
uri = strcat(uri, "&reason=", uri_escape(reason));
- n = tokenize_console(cvar_string("g_ban_sync_uri"));
+ n = tokenize_console(autocvar_g_ban_sync_uri);
if(n >= MAX_IPBAN_URIS)
n = MAX_IPBAN_URIS;
for(i = 0; i < n; ++i)
string uri;
float i, n;
- uri = strcat( "action=unban&hostname=", uri_escape(cvar_string("hostname")));
+ uri = strcat( "action=unban&hostname=", uri_escape(autocvar_hostname));
uri = strcat(uri, "&ip=", uri_escape(ip));
- n = tokenize_console(cvar_string("g_ban_sync_uri"));
+ n = tokenize_console(autocvar_g_ban_sync_uri);
if(n >= MAX_IPBAN_URIS)
n = MAX_IPBAN_URIS;
for(i = 0; i < n; ++i)
return;
}
- tokenize_console(cvar_string("g_ban_sync_uri"));
+ tokenize_console(autocvar_g_ban_sync_uri);
uri = argv(id);
print("Received ban list from ", uri, ": ");
return;
}
- syncinterval = cvar("g_ban_sync_interval");
+ syncinterval = autocvar_g_ban_sync_interval;
if(syncinterval == 0)
{
print("rejected (syncing disabled)\n");
dprint(" timeleft=", ftos(timeleft), " reason=", reason);
dprint(" serverip=", serverip, "\n");
- timeleft -= 1.5 * cvar("g_ban_sync_timeout");
+ timeleft -= 1.5 * autocvar_g_ban_sync_timeout;
if(timeleft < 0)
continue;
}
}
- if(cvar("g_ban_sync_trusted_servers_verify"))
+ if(autocvar_g_ban_sync_trusted_servers_verify)
if((strstrofs(strcat(";", OnlineBanList_Servers, ";"), strcat(";", serverip, ";"), 0) == -1))
continue;
string uri;
float i, n;
- if(cvar_string("g_ban_sync_uri") == "")
+ if(autocvar_g_ban_sync_uri == "")
goto killme;
- if(cvar("g_ban_sync_interval") == 0) // < 0 is okay, it means "sync on level start only"
+ if(autocvar_g_ban_sync_interval == 0) // < 0 is okay, it means "sync on level start only"
goto killme;
- argc = tokenize_console(cvar_string("g_ban_sync_trusted_servers"));
+ argc = tokenize_console(autocvar_g_ban_sync_trusted_servers);
if(argc == 0)
goto killme;
OnlineBanList_Servers = strcat(OnlineBanList_Servers, ";", argv(i));
OnlineBanList_Servers = strzone(OnlineBanList_Servers);
- uri = strcat( "action=list&hostname=", uri_escape(cvar_string("hostname")));
+ uri = strcat( "action=list&hostname=", uri_escape(autocvar_hostname));
uri = strcat(uri, "&servers=", uri_escape(OnlineBanList_Servers));
- OnlineBanList_Timeout = time + cvar("g_ban_sync_timeout");
+ OnlineBanList_Timeout = time + autocvar_g_ban_sync_timeout;
- n = tokenize_console(cvar_string("g_ban_sync_uri"));
+ n = tokenize_console(autocvar_g_ban_sync_uri);
if(n >= MAX_IPBAN_URIS)
n = MAX_IPBAN_URIS;
for(i = 0; i < n; ++i)
uri_get(strcat(argv(i), "?", uri), URI_GET_IPBAN + i); // 1000 = "banlist" callback target
}
- if(cvar("g_ban_sync_interval") > 0)
- self.nextthink = time + max(60, cvar("g_ban_sync_interval") * 60);
+ if(autocvar_g_ban_sync_interval > 0)
+ self.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60);
else
goto killme;
return;
Ban_Delete(i);
ban_count = 0;
ban_loaded = TRUE;
- n = tokenize_console(cvar_string("g_banned_list"));
+ n = tokenize_console(autocvar_g_banned_list);
if(stof(argv(0)) == 1)
{
ban_count = (n - 1) / 2;
if(ban_idfp == s) return TRUE;
}
if(ipbanned)
- if(!cvar("g_banned_list_idmode") || !ban_idfp)
+ if(!autocvar_g_banned_list_idmode || !ban_idfp)
return TRUE;
return FALSE;
}
client = edict_num(entno);
INITARG(3);
- GETARG(bantime, cvar("g_ban_default_bantime"));
- GETARG(masksize, cvar("g_ban_default_masksize"));
+ GETARG(bantime, autocvar_g_ban_default_bantime);
+ GETARG(masksize, autocvar_g_ban_default_masksize);
RESTARG(reason);
Ban_KickBanClient(client, bantime, masksize, reason);
ip = argv(1);
INITARG(2);
- GETARG(bantime, cvar("g_ban_default_bantime"));
+ GETARG(bantime, autocvar_g_ban_default_bantime);
RESTARG(reason);
Ban_Insert(ip, bantime, reason, 1);
string admin_name(void)
{
- if(cvar_string("sv_adminnick") != "")
- return cvar_string("sv_adminnick");
+ if(autocvar_sv_adminnick != "")
+ return autocvar_sv_adminnick;
else
return "SERVER ADMIN";
}
else
strPlayerPingColor = "^2";
- if((cvar("sv_fragmessage_information_stats")) && (enPlayer.health >= 1))
+ if((autocvar_sv_fragmessage_information_stats) && (enPlayer.health >= 1))
strMessage = strcat(strMessage, "\n^7(Health ^1", ftos(nPlayerHealth), "^7 / Armor ^2", ftos(nPlayerArmor), "^7)");
- if(cvar("sv_fragmessage_information_ping")) {
+ if(autocvar_sv_fragmessage_information_ping) {
if(clienttype(enPlayer) == CLIENTTYPE_BOT) // Bots have no ping
strMessage = strcat(strMessage, " ^7(^2Bot");
else
strMessage = strcat(strMessage, " ^7(Ping ", strPlayerPingColor, ftos(nPlayerPing), "ms");
- if(cvar("sv_fragmessage_information_handicap"))
- if(cvar("sv_fragmessage_information_handicap") == 2)
+ if(autocvar_sv_fragmessage_information_handicap)
+ if(autocvar_sv_fragmessage_information_handicap == 2)
if(nPlayerHandicap <= 1)
strMessage = strcat(strMessage, "^7 / Handicap ^2Off^7)");
else
strMessage = strcat(strMessage, "^7 / Handicap ^2", ftos(nPlayerHandicap), "^7)");
else
strMessage = strcat(strMessage, "^7)");
- } else if(cvar("sv_fragmessage_information_handicap")) {
- if(cvar("sv_fragmessage_information_handicap") == 2)
+ } else if(autocvar_sv_fragmessage_information_handicap) {
+ if(autocvar_sv_fragmessage_information_handicap == 2)
if(nPlayerHandicap <= 1)
strMessage = strcat(strMessage, "\n^7(Handicap ^2Off^7)");
else
string fn;
float matches;
- if (cvar("sv_eventlog_files"))
+ if (autocvar_sv_eventlog_files)
{
if (!logfile_open)
{
logfile_open = TRUE;
- matches = cvar("sv_eventlog_files_counter") + 1;
+ matches = autocvar_sv_eventlog_files_counter + 1;
cvar_set("sv_eventlog_files_counter", ftos(matches));
fn = ftos(matches);
if (strlen(fn) < 8)
fn = strcat(substring("00000000", 0, 8 - strlen(fn)), fn);
- fn = strcat(cvar_string("sv_eventlog_files_nameprefix"), fn, cvar_string("sv_eventlog_files_namesuffix"));
+ fn = strcat(autocvar_sv_eventlog_files_nameprefix, fn, autocvar_sv_eventlog_files_namesuffix);
logfile = fopen(fn, FILE_APPEND);
fputs(logfile, ":logversion:3\n");
}
if (logfile >= 0)
{
- if (cvar("sv_eventlog_files_timestamps"))
+ if (autocvar_sv_eventlog_files_timestamps)
fputs(logfile, strcat(":time:", strftime(TRUE, "%Y-%m-%d %H:%M:%S", "\n", s, "\n")));
else
fputs(logfile, strcat(s, "\n"));
}
}
- if (cvar("sv_eventlog_console"))
+ if (autocvar_sv_eventlog_console)
{
print(s, "\n");
}
float spawnpoint_nag;
void relocate_spawnpoint()
{
- PL_VIEW_OFS = stov(cvar_string("sv_player_viewoffset"));
- PL_MIN = stov(cvar_string("sv_player_mins"));
- PL_MAX = stov(cvar_string("sv_player_maxs"));
- PL_HEAD = stov(cvar_string("sv_player_headsize"));
- PL_CROUCH_VIEW_OFS = stov(cvar_string("sv_player_crouch_viewoffset"));
- PL_CROUCH_MIN = stov(cvar_string("sv_player_crouch_mins"));
- PL_CROUCH_MAX = stov(cvar_string("sv_player_crouch_maxs"));
+ PL_VIEW_OFS = stov(autocvar_sv_player_viewoffset);
+ PL_MIN = stov(autocvar_sv_player_mins);
+ PL_MAX = stov(autocvar_sv_player_maxs);
+ PL_HEAD = stov(autocvar_sv_player_headsize);
+ PL_CROUCH_VIEW_OFS = stov(autocvar_sv_player_crouch_viewoffset);
+ PL_CROUCH_MIN = stov(autocvar_sv_player_crouch_mins);
+ PL_CROUCH_MAX = stov(autocvar_sv_player_crouch_maxs);
// nudge off the floor
setorigin(self, self.origin + '0 0 1');
print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
print(" ", ftos(self.origin_y - o_y));
print(" ", ftos(self.origin_z - o_z), "'\n");
- if (cvar("g_spawnpoints_auto_move_out_of_solid"))
+ if (autocvar_g_spawnpoints_auto_move_out_of_solid)
{
if (!spawnpoint_nag)
print("\{1}^1NOTE: this map needs FIXING (it contains spawnpoints in solid, see server log)\n");
if (self.team)
have_team_spawns = 1;
- if (cvar("r_showbboxes"))
+ if (autocvar_r_showbboxes)
{
// show where spawnpoints point at too
makevectors(self.angles);
replacement = ftos(vlen(self.velocity - self.velocity_z * '0 0 1'));
else if (escape == "S")
replacement = ftos(vlen(self.velocity));
- else if (escape == "v") {
- float weapon_number;
- local entity stats;
-
- if(self.classname == "spectator")
- stats = self.enemy;
- else
- stats = self;
-
- weapon_number = stats.weapon;
-
- if (!weapon_number)
- weapon_number = stats.switchweapon;
-
- if (!weapon_number)
- weapon_number = stats.cnt;
-
- if(stats.cvar_cl_accuracy_data_share && stats.stats_fired[weapon_number - 1])
- replacement = ftos(bound(0, floor(100 * stats.stats_hit[weapon_number - 1] / stats.stats_fired[weapon_number - 1]), 100));
- else
- replacement = "~"; // or something to indicate NULL, not available
- }
msg = strcat(substring(msg, 0, p), replacement, substring(msg, p+2, strlen(msg) - (p+2)));
p = p + strlen(replacement);
GetCvars_handleFloat(s, f, cvar_cl_noantilag, "cl_noantilag");
GetCvars_handleFloat(s, f, cvar_cl_voice_directional, "cl_voice_directional");
GetCvars_handleFloat(s, f, cvar_cl_voice_directional_taunt_attenuation, "cl_voice_directional_taunt_attenuation");
- GetCvars_handleFloat(s, f, cvar_cl_hitsound, "cl_hitsound");
GetCvars_handleFloat(s, f, cvar_cl_accuracy_data_share, "cl_accuracy_data_share");
GetCvars_handleFloat(s, f, cvar_cl_accuracy_data_receive, "cl_accuracy_data_receive");
#endif
GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign");
GetCvars_handleFloat(s, f, cvar_cl_allow_uid2name, "cl_allow_uid2name");
+ GetCvars_handleFloat(s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking");
// fixup of switchweapon (needed for LMS or when spectating is disabled, as PutClientInServer comes too early)
if (f > 0)
void backtrace(string msg)
{
float dev, war;
- dev = cvar("developer");
- war = cvar("prvm_backtraceforwarnings");
+ dev = autocvar_developer;
+ war = autocvar_prvm_backtraceforwarnings;
cvar_set("developer", "1");
cvar_set("prvm_backtraceforwarnings", "1");
print("\n");
return v;
};
+//#NO AUTOCVARS START
+
float g_pickup_shells;
float g_pickup_shells_max;
float g_pickup_nails;
float g_pickup_weapons_anyway;
float g_weaponarena;
float g_weaponarena_random;
+float g_weaponarena_random_with_laser;
string g_weaponarena_list;
float g_weaponspeedfactor;
float g_weaponratefactor;
t = (weaponinfo.spawnflags & WEP_FLAG_NORMAL);
else if(t < -1)
t = 0;
- else if (g_race || g_cts)
- t = (i == WEP_LASER);
+ else if (g_cts)
+ t = (i == WEP_SHOTGUN);
else if (g_nexball)
t = 0; // weapon is set a few lines later
else
g_weaponarena = 0;
s = cvar_string("g_weaponarena");
- if (s == "0")
+ if (s == "0" || s == "")
+ {
+ if(g_lms || g_ca)
+ s = "most";
+ }
+
+ if (s == "off")
{
+ // forcibly turn off weaponarena
}
else if (s == "all")
{
g_weaponarena_random = cvar("g_weaponarena_random");
else
g_weaponarena_random = 0;
+ g_weaponarena_random_with_laser = cvar("g_weaponarena_random_with_laser");
if (g_weaponarena)
{
start_weapons = g_weaponarena;
- if (g_weaponarena & (WEPBIT_GRENADE_LAUNCHER | WEPBIT_MINE_LAYER | WEPBIT_HAGAR | WEPBIT_ROCKET_LAUNCHER))
- start_ammo_rockets = 999;
- if (g_weaponarena & WEPBIT_SHOTGUN)
- start_ammo_shells = 999;
- if (g_weaponarena & (WEPBIT_ELECTRO | WEPBIT_CRYLINK | WEPBIT_NEX | WEPBIT_MINSTANEX | WEPBIT_HLAC | WEPBIT_HOOK))
- start_ammo_cells = 999;
- if (g_weaponarena & (WEPBIT_UZI | WEPBIT_CAMPINGRIFLE))
- start_ammo_nails = 999;
- if (g_weaponarena & WEPBIT_HOOK)
- start_ammo_fuel = 999;
- start_items |= IT_UNLIMITED_AMMO;
+ if(!(g_lms || g_ca))
+ start_items |= IT_UNLIMITED_AMMO;
}
else if (g_minstagib)
{
start_armorvalue = 0;
start_weapons = WEPBIT_MINSTANEX;
weapon_action(WEP_MINSTANEX, WR_PRECACHE);
- start_ammo_cells = cvar("g_minstagib_ammo_start");
g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
- start_ammo_fuel = cvar("g_start_ammo_fuel");
if (g_minstagib_invis_alpha <= 0)
g_minstagib_invis_alpha = -1;
}
else
{
- if (g_lms || g_ca)
+ for (i = WEP_FIRST; i <= WEP_LAST; ++i)
+ {
+ e = get_weaponinfo(i);
+ if(want_weapon("g_start_weapon_", e, FALSE))
+ start_weapons |= e.weapons;
+ }
+ }
+
+ if(!cvar("g_use_ammunition"))
+ start_items |= IT_UNLIMITED_AMMO;
+
+ if(g_minstagib)
+ {
+ start_ammo_cells = cvar("g_minstagib_ammo_start");
+ start_ammo_fuel = cvar("g_start_ammo_fuel");
+ }
+ else if(start_items & IT_UNLIMITED_WEAPON_AMMO)
+ {
+ for (j = WEP_FIRST; j <= WEP_LAST; ++j)
+ {
+ e = get_weaponinfo(j);
+ if(start_weapons & e.weapons)
+ {
+ if(e.items & IT_ROCKETS)
+ start_ammo_rockets = 999;
+ if(e.items & IT_SHELLS)
+ start_ammo_shells = 999;
+ if(e.items & IT_CELLS)
+ start_ammo_cells = 999;
+ if(e.items & IT_NAILS)
+ start_ammo_nails = 999;
+ if(e.items & IT_FUEL)
+ start_ammo_fuel = 999;
+ }
+ }
+ }
+ else
+ {
+ if(g_lms || g_ca)
{
start_ammo_shells = cvar("g_lms_start_ammo_shells");
start_ammo_nails = cvar("g_lms_start_ammo_nails");
start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
start_ammo_cells = cvar("g_lms_start_ammo_cells");
start_ammo_fuel = cvar("g_lms_start_ammo_fuel");
- start_health = cvar("g_lms_start_health");
- start_armorvalue = cvar("g_lms_start_armor");
}
else
{
start_ammo_cells = cvar("g_start_ammo_cells");
start_ammo_fuel = cvar("g_start_ammo_fuel");
}
+ }
- for (i = WEP_FIRST; i <= WEP_LAST; ++i)
- {
- e = get_weaponinfo(i);
- if(want_weapon("g_start_weapon_", e, FALSE))
- start_weapons |= e.weapons;
- }
+ if (g_lms || g_ca)
+ {
+ start_health = cvar("g_lms_start_health");
+ start_armorvalue = cvar("g_lms_start_armor");
}
if (inWarmupStage)
warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
}
- if(!cvar("g_use_ammunition"))
- {
- start_ammo_shells = cvar("g_pickup_shells_max");
- start_ammo_nails = cvar("g_pickup_nails_max");
- start_ammo_rockets = cvar("g_pickup_rockets_max");
- start_ammo_cells = cvar("g_pickup_cells_max");
- start_ammo_fuel = cvar("g_pickup_fuel_max");
- start_items |= IT_UNLIMITED_AMMO;
- warmup_start_ammo_shells = cvar("g_pickup_shells_max");
- warmup_start_ammo_nails = cvar("g_pickup_nails_max");
- warmup_start_ammo_rockets = cvar("g_pickup_rockets_max");
- warmup_start_ammo_cells = cvar("g_pickup_cells_max");
- warmup_start_ammo_fuel = cvar("g_pickup_fuel_max");
- //warmup_start_items |= IT_UNLIMITED_AMMO;
- }
-
if (g_jetpack)
start_items |= IT_JETPACK;
float sv_pitch_max;
float sv_pitch_fixyaw;
-float sv_accuracy_data_share;
-
+string GetGametype(); // g_world.qc
void readlevelcvars(void)
{
// first load all the mutators
if(cvar("g_vampire"))
MUTATOR_ADD(mutator_vampire);
- serverflags = 0;
if(cvar("sv_allow_fullbright"))
serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
sv_gentle = cvar("sv_gentle");
sv_foginterval = cvar("sv_foginterval");
g_cloaked = cvar("g_cloaked");
+ if(g_cts)
+ g_cloaked = 1; // always enable cloak in CTS
g_jump_grunt = cvar("g_jump_grunt");
g_footsteps = cvar("g_footsteps");
g_grappling_hook = cvar("g_grappling_hook");
g_pinata = cvar("g_pinata");
- g_weapon_stay = cvar("g_weapon_stay");
+ g_weapon_stay = cvar(strcat("g_", GetGametype(), "_weapon_stay"));
+ if(!g_weapon_stay)
+ g_weapon_stay = cvar("g_weapon_stay");
if (!g_weapon_stay && (cvar("deathmatch") == 2))
g_weapon_stay = 1;
sv_pitch_max = cvar("sv_pitch_max");
sv_pitch_fixyaw = cvar("sv_pitch_fixyaw");
- sv_accuracy_data_share = boolean(cvar("sv_accuracy_data_share"));
-
readplayerstartcvars();
}
-/*
-// TODO sound pack system
-string soundpack;
-
-string precache_sound_builtin (string s) = #19;
-void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8;
-string precache_sound(string s)
-{
- return precache_sound_builtin(strcat(soundpack, s));
-}
-void play2(entity e, string filename)
-{
- stuffcmd(e, strcat("play2 ", soundpack, filename, "\n"));
-}
-void sound(entity e, float chan, string samp, float vol, float atten)
-{
- sound_builtin(e, chan, strcat(soundpack, samp), vol, atten);
-}
-*/
+//#NO AUTOCVARS END
// Sound functions
string precache_sound (string s) = #19;
if (e == msg_entity)
return TRUE;
// sounds by players can be removed
- if (cvar("bot_sound_monopoly"))
+ if (autocvar_bot_sound_monopoly)
if (clienttype(e) == CLIENTTYPE_REAL)
return FALSE;
// anything else may pass
{
local entity head;
- if (cvar("bot_sound_monopoly"))
+ if (autocvar_bot_sound_monopoly)
return;
FOR_EACH_REALPLAYER(head)
void play2all(string samp)
{
- if (cvar("bot_sound_monopoly"))
+ if (autocvar_bot_sound_monopoly)
return;
sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE);
precache_model(m);
if(sv_loddistance1)
{
- precache_model(strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)));
- precache_model(strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1)));
+ f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1));
+ if(fexists(f))
+ precache_model(f);
+ f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1));
+ if(fexists(f))
+ precache_model(f);
}
globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
}
#ifdef TTURRETS_ENABLED
- if (cvar("g_turrets"))
+ if (autocvar_g_turrets)
turrets_precash();
#endif
// Precache all player models if desired
- if (cvar("sv_precacheplayermodels"))
+ if (autocvar_sv_precacheplayermodels)
{
PrecachePlayerSounds("sound/player/default.sounds");
precache_all_playermodels("models/player/*.zym");
precache_all_playermodels("models/player/*.iqm");
}
- if (cvar("sv_defaultcharacter"))
+ if (autocvar_sv_defaultcharacter)
{
string s;
- s = cvar_string("sv_defaultplayermodel_red");
+ s = autocvar_sv_defaultplayermodel_red;
if (s != "")
precache_playermodel(s);
- s = cvar_string("sv_defaultplayermodel_blue");
+ s = autocvar_sv_defaultplayermodel_blue;
if (s != "")
precache_playermodel(s);
- s = cvar_string("sv_defaultplayermodel_yellow");
+ s = autocvar_sv_defaultplayermodel_yellow;
if (s != "")
precache_playermodel(s);
- s = cvar_string("sv_defaultplayermodel_pink");
+ s = autocvar_sv_defaultplayermodel_pink;
if (s != "")
precache_playermodel(s);
- s = cvar_string("sv_defaultplayermodel");
+ s = autocvar_sv_defaultplayermodel;
if (s != "")
precache_playermodel(s);
}
precache_sound ("misc/gib_splat02.wav");
precache_sound ("misc/gib_splat03.wav");
precache_sound ("misc/gib_splat04.wav");
- precache_sound ("misc/hit.wav");
- precache_sound ("misc/typehit.wav");
PrecacheGlobalSound((globalsound_fall = "misc/hitground 4"));
PrecacheGlobalSound((globalsound_metalfall = "misc/metalhitground 4"));
precache_sound ("misc/null.wav");
precache_sound ("weapons/hook_impact.wav"); // hook
}
- if(cvar("sv_precacheweapons"))
+ if(autocvar_sv_precacheweapons)
{
//precache weapon models/sounds
local float wep;
objerror_builtin(s);
}
+.float remove_except_protected_forbidden;
+void remove_except_protected(entity e)
+{
+ if(e.remove_except_protected_forbidden)
+ error("not allowed to remove this at this point");
+ remove_builtin(e);
+}
+
void remove_unsafely(entity e)
{
remove_builtin(e);
entity startoflist;
startoflist = initialize_entity_first;
initialize_entity_first = world;
+ remove = remove_except_protected;
+ for (self = startoflist; self; self = self.initialize_entity_next)
+ {
+ self.remove_except_protected_forbidden = 1;
+ }
for (self = startoflist; self; )
{
entity e;
self.initialize_entity_order = 0;
self.initialize_entity = func_null;
self.initialize_entity_next = world;
+ self.remove_except_protected_forbidden = 0;
if (self.classname == "initialize_entity")
{
entity e_old;
self = e_old;
}
//dprint("Delayed initialization: ", self.classname, "\n");
- func();
+ if(func != func_null)
+ func();
+ else
+ {
+ eprint(self);
+ backtrace(strcat("Null function in: ", self.classname, "\n"));
+ }
self = e;
}
+ remove = remove_unsafely;
}
.float uncustomizeentityforclient_set;
}
#define PROJECTILE_TOUCH if(WarpZone_Projectile_Touch()) return
-float MAX_IPBAN_URIS = 16;
-
-float URI_GET_DISCARD = 0;
-float URI_GET_IPBAN = 1;
-float URI_GET_IPBAN_END = 16;
+float MAX_IPBAN_URIS = 16;
+
+float URI_GET_DISCARD = 0;
+float URI_GET_IPBAN = 1;
+float URI_GET_IPBAN_END = 16;
+float URI_GET_PLAYERSTATS_SENT = 17;
void URI_Get_Callback(float id, float status, string data)
{
// online ban list
OnlineBanList_URI_Get_Callback(id, status, data);
}
+ else if (id == URI_GET_PLAYERSTATS_SENT)
+ {
+ PlayerStats_Sent_URI_Get_Callback(id, status, data);
+ }
else
{
print("Received HTTP request data for an invalid id ", ftos(id), ".\n");
// rule 6: we must not end up in trigger_hurt
if (tracebox_hits_trigger_hurt(start, e.mins, e.maxs, enddown))
- {
- dprint("trigger_hurt! ouch! and nothing else could find it!\n");
continue;
- }
break;
}
zcurveparticles(effectno, start, end, end_dz, vlen(vel));
}
-string GetGametype(); // g_world.qc
void write_recordmarker(entity pl, float tstart, float dt)
{
GameLogEcho(strcat(":recordset:", ftos(pl.playerid), ":", ftos(dt)));
string s;
vector v;
- if (cvar("g_shootfromeye"))
+ if (autocvar_g_shootfromeye)
{
if (visual)
{
vecs_z = 0;
}
}
- else if (cvar("g_shootfromcenter"))
+ else if (autocvar_g_shootfromcenter)
{
if (visual)
{
vecs_z -= 2;
}
}
- else if ((s = cvar_string("g_shootfromfixedorigin")) != "")
+ else if ((s = autocvar_g_shootfromfixedorigin) != "")
{
v = stov(s);
if (y_is_right)
vecs_y = v_y;
vecs_z = v_z;
}
- else if (cvar("g_shootfromclient"))
+ else if (autocvar_g_shootfromclient)
{
- vecs = shotorg_adjustfromclient(vecs, y_is_right, (cvar("g_shootfromclient") >= 2), algn);
+ vecs = shotorg_adjustfromclient(vecs, y_is_right, (autocvar_g_shootfromclient >= 2), algn);
}
return vecs;
}
float ParseCommandPlayerSlotTarget_firsttoken;
entity GetCommandPlayerSlotTargetFromTokenizedCommand(float tokens, float idx) // idx = start index
{
- string s;
- entity e, head;
- float n;
+ string s;
+ entity e, head;
+ float n;
- s = string_null;
+ s = string_null;
- ParseCommandPlayerSlotTarget_firsttoken = -1;
+ ParseCommandPlayerSlotTarget_firsttoken = -1;
- if (tokens > idx)
- {
- if (substring(argv(idx), 0, 1) == "#")
- {
- s = substring(argv(idx), 1, -1);
- ++idx;
- if (s == "")
- if (tokens > idx)
- {
- s = argv(idx);
- ++idx;
- }
+ if (tokens > idx)
+ {
+ if (substring(argv(idx), 0, 1) == "#")
+ {
+ s = substring(argv(idx), 1, -1);
+ ++idx;
+ if (s == "") if (tokens > idx)
+ {
+ s = argv(idx);
+ ++idx;
+ }
ParseCommandPlayerSlotTarget_firsttoken = idx;
- if (s == ftos(stof(s)))
- {
- e = edict_num(stof(s));
- if (e.flags & FL_CLIENT)
- return e;
- }
- }
- else
- {
- // it must be a nick name
- s = argv(idx);
- ++idx;
+ n = stof(s);
+ if (s == ftos(n) && n > 0 && n <= maxclients)
+ {
+ e = edict_num(n);
+ if (e.flags & FL_CLIENT)
+ return e;
+ }
+ }
+ else
+ {
+ // it must be a nick name
+ s = argv(idx);
+ ++idx;
ParseCommandPlayerSlotTarget_firsttoken = idx;
- n = 0;
- FOR_EACH_CLIENT(head)
- if (head.netname == s)
- {
- e = head;
- ++n;
- }
- if (n == 1)
- return e;
+ n = 0;
+ FOR_EACH_CLIENT(head)
+ if (head.netname == s)
+ {
+ e = head;
+ ++n;
+ }
+ if (n == 1)
+ return e;
- s = strdecolorize(s);
- n = 0;
- FOR_EACH_CLIENT(head)
- if (strdecolorize(head.netname) == s)
- {
- e = head;
- ++n;
- }
- if (n == 1)
- return e;
- }
- }
+ s = strdecolorize(s);
+ n = 0;
+ FOR_EACH_CLIENT(head)
+ if (strdecolorize(head.netname) == s)
+ {
+ e = head;
+ ++n;
+ }
+ if (n == 1)
+ return e;
+ }
+ }
- return world;
+ return world;
}
.float scale2;
self.nextthink = ceil(time + 1);
if (!gameover)
{
- if (cvar("timelimit"))
- if (time > game_starttime + cvar("timelimit") * 60)
+ if (autocvar_timelimit)
+ if (time > game_starttime + autocvar_timelimit * 60)
{
// self.max_health / 300 gives 5 minutes of overtime.
// control points reduce the overtime duration.
void onslaught_generator_reset()
{
self.team = self.team_saved;
- self.lasthealth = self.max_health = self.health = cvar("g_onslaught_gen_health");
+ self.lasthealth = self.max_health = self.health = autocvar_g_onslaught_gen_health;
self.takedamage = DAMAGE_AIM;
self.bot_attack = TRUE;
self.iscaptured = TRUE;
self.colormap = 1024 + (self.team - 1) * 17;
self.solid = SOLID_BBOX;
self.movetype = MOVETYPE_NONE;
- self.lasthealth = self.max_health = self.health = cvar("g_onslaught_gen_health");
+ self.lasthealth = self.max_health = self.health = autocvar_g_onslaught_gen_health;
setmodel(self, "models/onslaught/generator.md3");
setsize(self, '-52 -52 -14', '52 52 75');
setorigin(self, self.origin);
if (self.health >= self.max_health)
{
self.health = self.max_health;
- self.count = cvar("g_onslaught_cp_regen") * sys_frametime; // slow repair rate from now on
+ self.count = autocvar_g_onslaught_cp_regen * sys_frametime; // slow repair rate from now on
self.think = onslaught_controlpoint_icon_think;
sound(self, CHAN_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
bprint(ColoredTeamName(self.team), " captured ", self.owner.message, " control point\n");
self.goalentity = e = spawn();
e.classname = "onslaught_controlpoint_icon";
e.owner = self;
- e.max_health = cvar("g_onslaught_cp_health");
- e.health = cvar("g_onslaught_cp_buildhealth");
+ e.max_health = autocvar_g_onslaught_cp_health;
+ e.health = autocvar_g_onslaught_cp_buildhealth;
e.solid = SOLID_BBOX;
e.movetype = MOVETYPE_NONE;
setmodel(e, "models/onslaught/controlpoint_icon.md3");
e.colormap = 1024 + (e.team - 1) * 17;
e.think = onslaught_controlpoint_icon_buildthink;
e.nextthink = time + sys_frametime;
- e.count = (e.max_health - e.health) * sys_frametime / cvar("g_onslaught_cp_buildtime"); // how long it takes to build
+ e.count = (e.max_health - e.health) * sys_frametime / autocvar_g_onslaught_cp_buildtime; // how long it takes to build
sound(e, CHAN_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
self.team = e.team;
self.colormap = e.colormap;
void() monster_checkbossflag =
{
+//#NO AUTOCVARS START
#if 0
local float healthboost;
local float r;
while (self.colormod_x > 0.6 && self.colormod_y > 0.6 && self.colormod_z > 0.6);
}
#endif
+//#NO AUTOCVARS END
};
float SKILL4_MINALPHA = 0.4;
float monsterwander;
+//#NO AUTOCVARS START
/*
monsterwander = cvar("monsterwander");
// monsterwander is always on in skill 5
if (skill >= 5)
monsterwander = TRUE;
*/
+//#NO AUTOCVARS END
.float candrown;
void() monsterinwall =
{
local entity e;
- if (!cvar("developer"))
+ if (!autocvar_developer)
return;
// this is handy for level designers,
// puts a spikey ball where the error is...
+++ /dev/null
-
-string(float c) colorname =
-{
- // yikes, the quake color set is HARD to describe
- // many are easy, but, uh, 2 browns???
- // 2 purples???
- // that 'pink' is hard to classify
- // I think 'biege' is a fairly good name for color 10
- // oh well, gotta do all the color names...
- if (c == 0) return "white";
- else if (c == 1) return "brown";
- else if (c == 2) return "lightblue";
- else if (c == 3) return "green";
- else if (c == 4) return "red";
- else if (c == 5) return "lighterbrown";
- else if (c == 6) return "orange";
- else if (c == 7) return "pink";
- else if (c == 8) return "purple";
- else if (c == 9) return "redishpurple";
- else if (c == 10) return "biege";
- else if (c == 11) return "aqua";
- else if (c == 12) return "yellow";
- else if (c == 13) return "blue";
- else if (c == 14) return "flamingorange";
- else if (c == 15) return "psychadelic";
- else return "INVALID COLOR";
-};
-
-float mode_shirtmustmatchpants;
-float mode_numteams;
-float mode_allowedteams[17];
-float mode_teamcount[17];
-float mode_teamscore[17];
-
-void() mode_initallowedteams =
-{
- local float c;
- c = 0;
- while(c < 17)
- {
- mode_allowedteams[c] = FALSE;
- c = c + 1;
- }
- mode_allowedteams[5] = TRUE; // red
- mode_allowedteams[14] = TRUE; // blue
- if (deathmatch == DM_ELIM
- || deathmatch == DM_ONEVSALL
- || deathmatch == DM_CTF_2TEAM
- || deathmatch == DM_DOMINATION
- || deathmatch == DM_SUPERDOMINATION)
- mode_numteams = 2;
- else if (deathmatch == DM_CTF_3TEAM)
- {
- mode_numteams = 3;
- mode_allowedteams[13] = TRUE; // yellow
- }
- else
- {
- mode_numteams = 16;
- c = 1;
- while(c < 17)
- {
- mode_allowedteams[c] = TRUE;
- c = c + 1;
- }
- }
-};
-
-float(float t) validteam =
-{
- return mode_allowedteams[t];
-};
-
-float() weakestteam =
-{
- local float bestteam;
- local float bestteamcount;
- local float headcount;
- local float c;
- bestteam = -1;
- bestteamcount = 0;
- c = 1;
- while (c < 17)
- {
- if (mode_allowedteams[c])
- {
- headcount = mode_teamcount[c];
- if (bestteamcount > headcount || bestteam == -1)
- {
- bestteamcount = headcount;
- bestteam = c;
- }
- }
- c = c + 1;
- }
- return bestteam;
-};
-
-void() updateteams =
-{
- local entity head;
- local float c;
- c = 1;
- while (c < 17)
- {
- mode_teamcount[c] = 0;
- mode_teamscore[c] = 0;
- c = c + 1;
- }
- c = 0;
- head = nextent(world);
- while (c < maxclients)
- {
- mode_teamcount[head.team] = mode_teamcount[head.team] + 1;
- mode_teamscore[head.team] = mode_teamscore[head.team] + head.frags;
- c = c + 1;
- head = nextent(head);
- }
-};
-
-float(float p) checkteamcolor =
-{
- if (!validteam(p + 1))
- p = weakestteam() - 1;
- return p;
-};
-
-void(float c) SV_ChangeTeam =
-{
- local float pants, shirt, old;
- old = self.clientcolors & 15;
- if (c >= 0)
- {
- pants = c & 15;
- shirt = (c / 16) & 15;
- }
- else
- {
- pants = -1;
- shirt = -1;
- }
- pants = checkteamcolor(pants);
- if (mode_shirtmustmatchpants || shirt < 0)
- shirt = pants;
- setcolor(self, pants + shirt * 16);
- if (pants != old && old >= 0 && teamplay && deathmatch)
- {
- T_Damage(self, self, self, 0, 0, " changed teams", DT_TELEFRAG, self.origin, '0 0 0', Obituary_Generic);
- self.frags = 0;
- PutClientInServer ();
- }
-};
-
-void() checkinvalidteam =
-{
- // call SV_ChangeTeam to trigger the weakestteam change
- if (!validteam(self.team))
- SV_ChangeTeam(self.team - 1);
-};
-
-
-string dmmessage;
-
-void(string m) setdm =
-{
- dmmessage = m;
- if (cvar_string("deathmatch") != m)
- cvar_set("deathmatch", m);
-}
-
-void(string m) setteamplay =
-{
- dmmessage = m;
- if (cvar_string("teamplay") != m)
- cvar_set("teamplay", m);
-}
-
-void() mode_updatecvars =
-{
- local float dm, tp;
- dm = cvar("deathmatch");
- tp = cvar("teamplay");
- // now set deathmatch cvar
- if (dm == 0) setdm("0?Dark Places - Coop");
- else if (dm == 1) setdm("1?Dark Places - Deathmatch");
- else if (dm == 2) setdm("2?Dark Places - Deathmatch 2 (can only pickup gun once)");
- else if (dm == 3) setdm("3?Dark Places - Deathmatch 3 (quick ammo respawn)");
- else if (dm == 5) setdm("5?Dark Places - Frag Fest (spawn with full pack)");
-// else if (dm == 6) setdm("6?Dark Places - Random Weapons (spawn with 2 random weapons)"); // removed
- else if (dm == 7) setdm("7?Dark Places - Monsters");
-// else if (dm == 8) setdm("8?Dark Places - Elimination");
-// else if (dm == 9) setdm("9?Dark Places - Kill The Leader Mode");
- else if (dm == 10) setdm("10?Dark Places - Capture The Flag - 2 Team");
- else if (dm == 11) setdm("11?Dark Places - Capture The Flag - 3 Team");
- else if (dm == 12) setdm("12?Dark Places - Domination");
- else if (dm == 13) setdm("13?Dark Places - Monster Capture The Flag - 2 Team");
- else if (dm == 14) setdm("14?Dark Places - Super Domination");
- else if (dm == 30) setdm("30?Dark Places - Role Playing Game");
- else setdm("1?Dark Places - Deathmatch");
-
- // now set teamplay cvar
- if (dm == 0) setteamplay("4?Dark Places - Coop (Can't hurt other players)");
- //else if (dm == 8) setteamplay("3?Dark Places - Elimination");
- //else if (dm == 9) setteamplay("3?Dark Places - Kill The Leader");
- else if (dm == 10) setteamplay("3?Dark Places - Capture The Flag - 2 Team");
- else if (dm == 11) setteamplay("3?Dark Places - Capture The Flag - 3 Team");
- else if (dm == 12) setteamplay("3?Dark Places - Domination");
- else if (dm == 13) setteamplay("3?Dark Places - Monster Capture The Flag - 2 Team");
- else
- {
- if (tp == 0) setteamplay("0?Dark Places - No Teamplay");
- else if (tp == 1) setteamplay("1?Dark Places - No team damage");
- else if (tp == 2) setteamplay("2?Dark Places - Can hurt anyone");
- else if (tp == 3) setteamplay("3?Dark Places - No team damage, but can hurt self");
- else setteamplay("0?Dark Places - No Teamplay");
- }
-};
-
-float nextcvarupdate;
-void() deathmatch7update;
-void() modeupdate =
-{
- if (time > nextcvarupdate)
- {
- nextcvarupdate = time + 1;
- mode_updatecvars();
- }
- deathmatch7update();
-};
-
-// true if items should respawn
-float itemrespawn;
-// when the next monster spawning check will occur in deathmatch 7 mode
-float spawnchecktime;
-
-void() precachemonsters;
-void() superdomination_precache;
-void() modesetup =
-{
- mode_shirtmustmatchpants = deathmatch >= DM_TEAM_MODS_START && deathmatch < DM_TEAM_MODS_END;
- mode_initallowedteams();
-
- itemrespawn = cvar("deathmatch") + cvar("coop");
-
- // don't spawn any monsters until 15 seconds
- spawnchecktime = 15;
- if (deathmatch == 7 || cvar("spawnmonsters") >= 1)
- precachemonsters();
-
- superdomination_precache();
-};
-
-float monsterspawn;
-void() spawnmonster_think =
-{
- //local float c;
- local void() sfunc;
- self.nextthink = time;
- if (time > self.cnt)
- {
- remove(self);
- return;
- }
- if (vlen(self.velocity) > 5)
- return; // try again later
-
- //if (!(self.flags & FL_FLY))
- // droptofloor();
- // don't spawn if something is in the way
- /*
- // walk around a lot
- if (walkmove(0,0))
- {
- if (self.lefty > 0)
- {
- c = 100;
- self.lefty = self.lefty - 1;
- self.angles = '0 0 0';
- while(c > 0)
- {
- c = c - 1;
- if (!walkmove(self.angles_y, 16))
- self.angles_y = random() * 360;
- }
- self.angles = '0 0 0';
- return;
- }
- }
- */
- // don't spawn if something is in the way
- if (!walkmove(0,0))
- {
- self.lefty = 10;
- setorigin(self, self.dest);
- self.flags = self.flags - (self.flags & FL_ONGROUND);
- self.velocity = randomvec() * 700 + '0 0 1000';
- return;
- }
- newmis = findchain(classname, "player");
- while (newmis)
- {
- if (vlen(newmis.origin - self.origin) < 300)
- return;
- newmis = newmis.chain;
- }
-
- if (self.netname == "monster_fish")
- {
- if (pointcontents(self.origin) != CONTENT_WATER)
- {
- remove(self);
- return;
- }
- }
-
- // spawn in
- self.movetype = MOVETYPE_NONE;
- self.solid = SOLID_NOT;
- self.velocity = '0 0 0';
- self.flags = 0;
- self.model = "";
- self.modelindex = 0;
- setorigin(self, self.origin);
- self.angles = '0 360 0' * random();
- self.classname = self.netname;
- self.netname = "";
- self.cnt = 0;
- self.think = SUB_Remove;
- sfunc = self.th_run;
- self.th_run = SUB_Null;
- te_teleport(self.origin);
- monsterspawn = TRUE;
- sfunc();
- monsterspawn = FALSE;
-};
-
-void(vector org, float c1, float c2, string cname, void() spawnfunc, vector m1, vector m2) spawnmonster =
-{
- local float c;
- c = (c2 - c1) * random() + c1;
- c = rint(c);
- while (c > 0)
- {
- c = c - 1;
-
- newmis = spawn();
- newmis.cnt = time + 10;
- if (cname == "monster_wizard")
- newmis.cnt = time + 2;
- newmis.lefty = 10;
- newmis.dest = org;
- newmis.classname = "spawningmonster";
- newmis.netname = cname;
- newmis.solid = SOLID_TRIGGER;
- newmis.movetype = MOVETYPE_TOSS;
- newmis.flags = FL_MONSTER; // make this count as a monster even though it hasn't spawned in yet
- newmis.velocity = randomvec() * 700 + '0 0 1000';
- newmis.th_run = spawnfunc;
- newmis.think = spawnmonster_think;
- newmis.nextthink = time + random() * 0.5 + 0.3;
- setorigin(newmis, org);
- setmodel(newmis, "progs/s_explod.spr");
- setsize(newmis, m1, m2);
- }
-};
-
-void() monster_army;
-void() monster_demon1;
-void() monster_dog;
-void() monster_enforcer;
-void() monster_hell_knight;
-void() monster_knight;
-void() monster_ogre;
-void() monster_shalrath;
-void() monster_shambler;
-void() monster_tarbaby;
-void() monster_wizard;
-void() monster_zombie;
-void() monster_fish;
-void() monster_hellfish;
-
-void() spawnmonsters =
-{
- local float r;
- local vector org;
- local entity head, e;
- head = findchain(classname, "info_player_deathmatch");
- if (head == world)
- {
- head = findchain(classname, "info_player_coop");
- if (head == world)
- {
- head = findchain(classname, "info_player_start");
- if (head == world)
- return;
- }
- }
-
- // count the spawn points
- r = 0;
- e = head;
- while (e)
- {
- r = r + 1;
- e = e.chain;
- }
-
- // pick a random one
- r = random() * r;
- e = head;
- while (r > 0)
- {
- r = r - 1;
- org = e.origin;
- e = e.chain;
- }
-
- // pick a type of monster
- if (cvar("registered"))
- {
- r = floor(random() * 13);
- if (r > 12)
- r = 12;
- }
- else
- {
- r = floor(random() * 8);
- if (r > 7)
- r = 7;
- }
- if (r == 0) spawnmonster(org, 5, 10, "monster_army" , monster_army , '-16 -16 -24', '16 16 32');
- else if (r == 1) spawnmonster(org, 3, 6, "monster_demon1" , monster_demon1 , '-32 -32 -24', '32 32 64');
- else if (r == 2) spawnmonster(org, 6, 12, "monster_dog" , monster_dog , '-16 -16 -24', '16 16 32');
- else if (r == 3) spawnmonster(org, 6, 12, "monster_knight" , monster_knight , '-16 -16 -24', '16 16 32');
- else if (r == 4) spawnmonster(org, 3, 6, "monster_ogre" , monster_ogre , '-32 -32 -24', '32 32 64');
- else if (r == 5) spawnmonster(org, 1, 1, "monster_shambler" , monster_shambler , '-32 -32 -24', '32 32 64');
- else if (r == 6) spawnmonster(org, 6, 10, "monster_wizard" , monster_wizard , '-16 -16 -24', '16 16 32');
- else if (r == 7) spawnmonster(org, 8, 16, "monster_zombie" , monster_zombie , '-16 -16 -24', '16 16 32');
- else if (r == 8) spawnmonster(org, 4, 8, "monster_enforcer" , monster_enforcer , '-16 -16 -24', '16 16 32');
- else if (r == 9) spawnmonster(org, 4, 8, "monster_hell_knight", monster_hell_knight, '-16 -16 -24', '16 16 32');
- else if (r == 10) spawnmonster(org, 1, 3, "monster_shalrath" , monster_shalrath , '-32 -32 -24', '32 32 64');
- else if (r == 11) spawnmonster(org, 10, 15, "monster_tarbaby" , monster_tarbaby , '-16 -16 -24', '16 16 32');
- else if (r == 12) spawnmonster(org, 4, 8, "monster_fish" , monster_fish , '-16 -16 -24', '16 16 32');
-};
-
-float monstersprecached;
-void() precachemonster_army;
-void() precachemonster_demon1;
-void() precachemonster_dog;
-void() precachemonster_enforcer;
-void() precachemonster_hell_knight;
-void() precachemonster_knight;
-void() precachemonster_ogre;
-void() precachemonster_shalrath;
-void() precachemonster_shambler;
-void() precachemonster_tarbaby;
-void() precachemonster_wizard;
-void() precachemonster_zombie;
-void() precachemonster_fish;
-
-void() precachemonsters =
-{
- precachemonster_army();
- precachemonster_demon1();
- precachemonster_dog();
- precachemonster_knight();
- precachemonster_ogre();
- precachemonster_shambler();
- precachemonster_wizard();
- precachemonster_zombie();
- if (cvar("registered"))
- {
- precachemonster_enforcer();
- precachemonster_hell_knight();
- precachemonster_shalrath();
- precachemonster_tarbaby();
- precachemonster_fish();
- }
- monstersprecached = TRUE;
-};
-
-float spawnedexitmonsters;
-void() deathmatch7update =
-{
- local entity e;
- local float f, monster_count, monsters;
- if (skill >= 5)
- if (!deathmatch)
- {
- if (!spawnedexitmonsters)
- if (time >= 2)
- {
- spawnedexitmonsters = TRUE;
- e = find(world, classname, "target_changelevel");
- while (e)
- {
- spawnmonster(e.origin + (e.mins + e.maxs) * 0.5, 8, 8, "monster_hellfish", monster_hellfish, '-16 -16 -24', '16 16 32');
- e = find(e, classname, "target_changelevel");
- }
- }
- return;
- }
- if (time < spawnchecktime)
- return;
- if (!monstersprecached)
- return;
- spawnchecktime = time + 0.2;
- monsters = 0;
- if (deathmatch == 7)
- monsters = 50;
- f = cvar("spawnmonsters");
- if (f >= 1)
- monsters = f;
- if (monsters < 1)
- return;
- monster_count = 0;
- e = findchainflags(flags, FL_MONSTER);
- while (e)
- {
- monster_count = monster_count + 1;
- e = e.chain;
- }
- if (monster_count >= monsters)
- return;
- spawnmonsters();
-}
if(trace_ent != trg)
return 0;
- return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+ return (autocvar_g_monster_zombie_targetrange - vlen(self.origin - trg.origin)) * tmp;
}
else if(self.enemy == trg)
- return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+ return (autocvar_g_monster_zombie_targetrange - vlen(self.origin - trg.origin)) * tmp;
}
}
self.event_damage = SUB_Null;
self.enemy = world;
self.think = zombie_spawn;
- self.nextthink = time + cvar("g_monster_zombie_respawntime");
+ self.nextthink = time + autocvar_g_monster_zombie_respawntime;
self.pain_finished = self.nextthink;
}
float vz, tdiff, tspeed;
tdiff = time - self.zoomstate;
- tspeed = tdiff * cvar("g_monster_zombie_turnspeed");
+ tspeed = tdiff * autocvar_g_monster_zombie_turnspeed;
vz = self.velocity_z;
self.zoomstate = time;
if(vlen(self.origin - self.moveto) > 64)
{
- movelib_move_simple(v_forward ,cvar("g_monster_zombie_movespeed"),0.6);
+ movelib_move_simple(v_forward ,autocvar_g_monster_zombie_movespeed,0.6);
if(time > self.pain_finished)
if(self.attack_finished_single < time)
self.frame = zombie_anim_runforward;
}
else
{
- movelib_beak_simple(cvar("g_monster_zombie_stopspeed"));
+ movelib_beak_simple(autocvar_g_monster_zombie_stopspeed);
if(time > self.pain_finished)
if(self.attack_finished_single < time)
self.frame = zombie_anim_idle;
case VCM_DO:
float t;
- t = cvar("g_monster_zombie_idle_timer_max") - cvar("g_monster_zombie_idle_timer_min");
- t = cvar("g_monster_zombie_idle_timer_min") + (random() * t);
+ t = autocvar_g_monster_zombie_idle_timer_max - autocvar_g_monster_zombie_idle_timer_min;
+ t = autocvar_g_monster_zombie_idle_timer_min + (random() * t);
if(random() < 0.5)
verbstack_push(self.verbs_idle, zombie_verb_idle_roam, ZV_IDLE + 1, t, self);
entity trg, best_trg;
float trg_score, best_trg_score;
- trg = findradius(self.origin,cvar("g_monster_zombie_targetrange"));
+ trg = findradius(self.origin,autocvar_g_monster_zombie_targetrange);
while(trg)
{
trg_score = zombie_scoretarget(trg);
oldself = self;
self = self.owner;
- if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_hitrange"))
+ if(vlen(self.origin - self.enemy.origin) > autocvar_g_monster_zombie_attack_run_hitrange)
return;
if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
return;
- Damage(self.enemy, self, self, cvar("g_monster_zombie_attack_run_damage"), DEATH_TURRET, self.enemy.origin, normalize(self.enemy.origin - self.origin) * cvar("g_monster_zombie_attack_run_force"));
+ Damage(self.enemy, self, self, autocvar_g_monster_zombie_attack_run_damage, DEATH_TURRET, self.enemy.origin, normalize(self.enemy.origin - self.origin) * autocvar_g_monster_zombie_attack_run_force);
self = oldself;
self.think = SUB_Remove;
if(self.attack_finished_single > time)
return VS_CALL_NO;
- if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_range"))
+ if(vlen(self.origin - self.enemy.origin) > autocvar_g_monster_zombie_attack_run_range)
return VS_CALL_NO;
if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
pain = spawn();
pain.owner = self;
pain.think = zombie_runattack_damage;
- pain.nextthink = time + cvar("g_monster_zombie_attack_run_delay");
+ pain.nextthink = time + autocvar_g_monster_zombie_attack_run_delay;
self.attack_finished_single = time + 0.7;
self.frame = zombie_anim_attackrun1 + rint(random() * 2);
//self = self.owner;
setorigin(self,self.owner.origin + v_forward * 32);
- RadiusDamage(self, self.owner, cvar("g_monster_zombie_attack_stand_damage"),cvar("g_monster_zombie_attack_stand_damage"),16,self, cvar("g_monster_zombie_attack_stand_force"),DEATH_TURRET,world);
+ RadiusDamage(self, self.owner, autocvar_g_monster_zombie_attack_stand_damage,autocvar_g_monster_zombie_attack_stand_damage,16,self, autocvar_g_monster_zombie_attack_stand_force,DEATH_TURRET,world);
//float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
if(self.attack_finished_single > time)
return VS_CALL_NO;
- if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_stand_range"))
+ if(vlen(self.origin - self.enemy.origin) > autocvar_g_monster_zombie_attack_stand_range)
return VS_CALL_NO;
if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.8)
pain = spawn();
pain.owner = self;
pain.think = zombie_runattack_damage;
- pain.nextthink = time + cvar("g_monster_zombie_attack_stand_delay");
+ pain.nextthink = time + autocvar_g_monster_zombie_attack_stand_delay;
self.attack_finished_single = time + 0.7;
self.frame = zombie_anim_attackstanding1 + rint(random() * 1);
self.nextthink = time + 2.1;
self.pain_finished = self.nextthink;
self.movetype = MOVETYPE_WALK;
- self.health = cvar("g_monster_zombie_health");
+ self.health = autocvar_g_monster_zombie_health;
self.velocity = '0 0 0';
self.angles = self.pos2;
self.moveto = self.origin;
void spawnfunc_monster_zombie()
{
- if not(cvar("g_monsters"))
+ if not(autocvar_g_monsters)
{
remove(self);
return;
if (self.waterlevel > 1)
{
self.velocity = self.velocity + force * (acceleration * deltatime);
- self.velocity = self.velocity + '0 0 0.05' * sv_gravity * deltatime;
+ self.velocity = self.velocity + '0 0 0.05' * autocvar_sv_gravity * deltatime;
}
else
- self.velocity = self.velocity + '0 0 -1' * sv_gravity * deltatime;
+ self.velocity = self.velocity + '0 0 -1' * autocvar_sv_gravity * deltatime;
mspeed = vlen(self.velocity);
old_speed = vlen(self.velocity);
old_dir = normalize(self.velocity);
- //ggravity = (sv_gravity / self.mass) * '0 0 100';
+ //ggravity = (autocvar_sv_gravity / self.mass) * '0 0 100';
acceleration = (force / self.mass) * dir;
//acceleration -= old_dir * (old_speed / self.mass);
acceleration -= ggravity;
return r; // callbacks return an error status, so 0 is default return value
}
-float Mutator_Add(float(float) func)
+#define MAX_MUTATORS 8
+string loaded_mutators[MAX_MUTATORS];
+float Mutator_Add(mutatorfunc_t func, string name)
{
+ float i, j;
+ j = -1;
+ for(i = 0; i < MAX_MUTATORS; ++i)
+ {
+ if(name == loaded_mutators[i])
+ return 1; // already added
+ if(!loaded_mutators[i])
+ j = i;
+ }
+ if(j < 0)
+ {
+ backtrace("WARNING: too many mutators, cannot add any more\n");
+ return 0;
+ }
+ loaded_mutators[j] = name;
+
if(func(MUTATOR_ADDING) == 0)
{
// good
return 1;
}
backtrace("WARNING: when adding mutator: adding failed\n");
- Mutator_Remove(func);
+ Mutator_Remove(func, name);
return 0;
}
-void Mutator_Remove(float(float) func)
+void Mutator_Remove(float(float) func, string name)
{
+ float i;
+ for(i = 0; i < MAX_MUTATORS; ++i)
+ if(name == loaded_mutators[i])
+ break;
+ if(i >= MAX_MUTATORS)
+ {
+ backtrace("WARNING: removing not-added mutator\n");
+ return;
+ }
+ loaded_mutators[i] = string_null;
+
if(func(MUTATOR_REMOVING) != 0)
{
// baaaaad
#define MUTATOR_REMOVING 0
#define MUTATOR_ADDING 1
-float Mutator_Add(float(float) func);
-void Mutator_Remove(float(float) func); // calls error() on fail
+typedef float(float) mutatorfunc_t;
+float Mutator_Add(mutatorfunc_t func, string name);
+void Mutator_Remove(mutatorfunc_t func, string name); // calls error() on fail
-#define MUTATOR_ADD(name) Mutator_Add(MUTATOR_##name)
-#define MUTATOR_REMOVE(name) Mutator_Remove(MUTATOR_##name)
+#define MUTATOR_ADD(name) Mutator_Add(MUTATOR_##name, #name)
+#define MUTATOR_REMOVE(name) Mutator_Remove(MUTATOR_##name, #name)
#define MUTATOR_DEFINITION(name) float MUTATOR_##name(float mode)
#define MUTATOR_DECLARATION(name) float MUTATOR_##name(float mode)
#define MUTATOR_HOOKFUNCTION(name) float HOOKFUNCTION_##name()
// checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields)
// return error to request removal
+MUTATOR_HOOKABLE(TurretSpawn);
+ // return error to request removal
+ // INPUT: self - turret
+
MUTATOR_HOOKABLE(OnEntityPreSpawn);
// return error to prevent entity spawn, or modify the entity
entity self;
entity other;
-MUTATOR_HOOKABLE(PlayerDamage);
+MUTATOR_HOOKABLE(PlayerDamage_SplitHealthArmor);
// called when a player gets damaged to e.g. remove stuff he was carrying.
// INPUT:
entity frag_inflictor;
entity frag_attacker;
entity frag_target; // same as self
- vector damage_force; // NOTE: this force already HAS been applied (create and use a Damage hook to change that one)
+ vector damage_force; // NOTE: this force already HAS been applied
// INPUT, OUTPUT:
float damage_take;
float damage_save;
+
+MUTATOR_HOOKABLE(PlayerDamage_Calculate);
+ // called to adjust damage and force values which are applied to the player, used for e.g. strength damage/force multiplier or runematch runes
+ // i'm not sure if I should change this around slightly (Naming of the entities, and also how they're done in g_damage).
+ // INPUT:
+ entity frag_attacker;
+ entity frag_target;
+ float frag_deathtype;
+ // INPUT, OUTPUT:
+ float frag_damage;
+ vector frag_force;
+
+MUTATOR_HOOKABLE(PlayerPowerups);
+ // called at the end of player_powerups() in cl_client.qc, used for manipulating the values which are set by powerup items.
+ // INPUT
+ entity self;
+ float olditems; // also technically output, but since it is at the end of the function it's useless for that :P
--- /dev/null
+void freezetag_Initialize()
+{
+ precache_model("models/ice/ice.md3");
+ warmup = time + autocvar_g_start_delay + autocvar_g_freezetag_warmup;
+ ScoreRules_freezetag();
+}
+
+void freezetag_CheckWinner()
+{
+ if(time <= game_starttime) // game didn't even start yet! nobody can win in that case.
+ return;
+
+ if(next_round || (time > warmup - autocvar_g_freezetag_warmup && time < warmup))
+ return; // already waiting for next round to start
+
+ if((redalive >= 1 && bluealive >= 1) // counted in arena.qc
+ || (redalive >= 1 && yellowalive >= 1)
+ || (redalive >= 1 && pinkalive >= 1)
+ || (bluealive >= 1 && yellowalive >= 1)
+ || (bluealive >= 1 && pinkalive >= 1)
+ || (yellowalive >= 1 && pinkalive >= 1))
+ return; // we still have active players on two or more teams, nobody won yet
+
+ entity e, winner;
+ string teamname;
+ winner = world;
+
+ FOR_EACH_PLAYER(e)
+ {
+ if(e.freezetag_frozen == 0 && e.classname == "player" && e.health >= 1) // here's one player from the winning team... good
+ {
+ winner = e;
+ break; // break, we found the winner
+ }
+ }
+
+ if(winner != world) // just in case a winner wasn't found
+ {
+ if(winner.team == COLOR_TEAM1)
+ teamname = "^1Red Team";
+ else if(winner.team == COLOR_TEAM2)
+ teamname = "^4Blue Team";
+ else if(winner.team == COLOR_TEAM3)
+ teamname = "^3Yellow Team";
+ else
+ teamname = "^6Pink Team";
+ FOR_EACH_PLAYER(e) {
+ centerprint(e, strcat(teamname, "^5 wins the round, all other teams were frozen.\n"));
+ }
+ bprint(teamname, "^5 wins the round since all the other teams were frozen.\n");
+ TeamScore_AddToTeam(winner.team, ST_SCORE, +1);
+ }
+
+ next_round = time + 5;
+}
+
+// this is needed to allow the player to turn his view around (fixangle can't
+// be used to freeze his view, as that also changes the angles), while not
+// turning that ice object with the player
+void freezetag_Ice_Think()
+{
+ setorigin(self, self.owner.origin - '0 0 16');
+ self.nextthink = time;
+}
+
+void freezetag_Freeze(entity attacker)
+{
+ if(self.freezetag_frozen)
+ return;
+ self.freezetag_frozen = 1;
+ self.freezetag_revive_progress = 0;
+
+ entity ice;
+ ice = spawn();
+ ice.owner = self;
+ ice.classname = "freezetag_ice";
+ ice.think = freezetag_Ice_Think;
+ ice.nextthink = time;
+ ice.frame = floor(random() * 21); // ice model has 20 different looking frames
+ setmodel(ice, "models/ice/ice.md3");
+
+ entity oldself;
+ oldself = self;
+ self = ice;
+ freezetag_Ice_Think();
+ self = oldself;
+
+ // add waypoint
+ WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
+ if(self.waypointsprite_attached)
+ {
+ WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
+ }
+
+ if(attacker == self)
+ {
+ // you froze your own dumb self
+ // counted as "suicide" already
+ PlayerScore_Add(self, SP_SCORE, -1);
+ }
+ else if(attacker.classname == "player")
+ {
+ // got frozen by an enemy
+ // counted as "kill" and "death" already
+ PlayerScore_Add(self, SP_SCORE, -1);
+ PlayerScore_Add(attacker, SP_SCORE, +1);
+ }
+ else
+ {
+ // nothing - got frozen by the game type rules themselves
+ }
+}
+
+void freezetag_Unfreeze(entity attacker)
+{
+ self.freezetag_frozen = 0;
+ self.freezetag_revive_progress = 0;
+
+ // remove the ice block
+ entity ice;
+ for(ice = world; (ice = find(ice, classname, "freezetag_ice")); ) if(ice.owner == self)
+ {
+ remove(ice);
+ break;
+ }
+
+ // remove waypoint
+ if(self.waypointsprite_attached)
+ WaypointSprite_Kill(self.waypointsprite_attached);
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
+{
+ if(self.freezetag_frozen == 0)
+ {
+ if(self.team == COLOR_TEAM1)
+ --redalive;
+ else if(self.team == COLOR_TEAM2)
+ --bluealive;
+ else if(self.team == COLOR_TEAM3)
+ --yellowalive;
+ else if(self.team == COLOR_TEAM4)
+ --pinkalive;
+ --totalalive;
+ }
+
+ if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
+ freezetag_CheckWinner();
+
+ freezetag_Unfreeze(world);
+
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
+{
+ if(self.freezetag_frozen == 0)
+ {
+ if(self.team == COLOR_TEAM1)
+ --redalive;
+ else if(self.team == COLOR_TEAM2)
+ --bluealive;
+ else if(self.team == COLOR_TEAM3)
+ --yellowalive;
+ else if(self.team == COLOR_TEAM4)
+ --pinkalive;
+ --totalalive;
+
+ freezetag_Freeze(frag_attacker);
+ }
+
+ if(frag_attacker.classname == STR_PLAYER)
+ centerprint(frag_attacker, strcat("^2You froze ^7", frag_target.netname, ".\n"));
+
+ if(frag_attacker == frag_target || frag_attacker == world)
+ {
+ if(frag_target.classname == STR_PLAYER)
+ centerprint(frag_target, "^1You froze yourself.\n");
+ bprint("^7", frag_target.netname, "^1 froze himself.\n");
+ }
+ else
+ {
+ if(frag_target.classname == STR_PLAYER)
+ centerprint(frag_target, strcat("^1You were frozen by ^7", frag_attacker.netname, ".\n"));
+ bprint("^7", frag_target.netname, "^1 was frozen by ^7", frag_attacker.netname, ".\n");
+ }
+
+ frag_target.health = autocvar_g_balance_health_start; // "respawn" the player :P
+
+ freezetag_CheckWinner();
+
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
+{
+ freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed
+
+ if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately
+ if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round
+ {
+ next_round = time;
+ return 1;
+ }
+ if(warmup && time > warmup) // spawn too late, freeze player
+ {
+ centerprint(self, "^1You spawned after the round started, you'll spawn as frozen.\n");
+ freezetag_Freeze(world);
+ }
+
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill)
+{
+ frag_score = 0; // no frags counted in Freeze Tag
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
+{
+ float n;
+ vector revive_extra_size;
+
+ revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
+
+ entity o;
+ o = world;
+ n = 0;
+ FOR_EACH_PLAYER(other) if(self != other)
+ {
+ if(other.freezetag_frozen == 0)
+ {
+ if(other.team == self.team)
+ {
+ if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+ {
+ if(!o)
+ o = other;
+ ++n;
+ }
+ }
+ }
+ }
+
+ if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
+ {
+ self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * autocvar_g_freezetag_revive_speed, 1);
+
+ if(self.freezetag_revive_progress >= 1)
+ {
+ freezetag_Unfreeze(self);
+
+ // EVERY team mate nearby gets a point (even if multiple!)
+ FOR_EACH_PLAYER(other) if(self != other)
+ {
+ if(other.freezetag_frozen == 0)
+ {
+ if(other.team == self.team)
+ {
+ if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+ {
+ PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1);
+ PlayerScore_Add(other, SP_SCORE, +1);
+ }
+ }
+ }
+ }
+
+ if(n > 1)
+ centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n"));
+ else
+ centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n"));
+ centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n"));
+ if(n > 1)
+ bprint("^7", o.netname, "^5 et al revived ^7", self.netname, "^5.\n");
+ else
+ bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n");
+ }
+
+ // now find EVERY teammate within reviving radius, set their revive_progress values correct
+ FOR_EACH_PLAYER(other) if(self != other)
+ {
+ if(other.freezetag_frozen == 0)
+ {
+ if(other.team == self.team)
+ {
+ if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+ other.freezetag_revive_progress = self.freezetag_revive_progress;
+ }
+ }
+ }
+ }
+ else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
+ {
+ self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
+ }
+ else if(!n)
+ {
+ self.freezetag_revive_progress = 0; // thawing nobody
+ }
+
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics)
+{
+ if(self.freezetag_frozen)
+ {
+ self.movement = '0 0 0';
+ self.disableclientprediction = 1;
+ }
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
+{
+ if(g_freezetag)
+ {
+ if(frag_target.freezetag_frozen == 1 && frag_deathtype != DEATH_HURTTRIGGER)
+ {
+ frag_damage = 0;
+ frag_force = frag_force * autocvar_g_freezetag_frozen_force;
+ }
+ }
+ return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon)
+{
+ if (self.freezetag_frozen)
+ return 1;
+ return 0;
+}
+
+MUTATOR_DEFINITION(gamemode_freezetag)
+{
+ MUTATOR_HOOK(MakePlayerObserver, freezetag_RemovePlayer, CBC_ORDER_ANY);
+ MUTATOR_HOOK(ClientDisconnect, freezetag_RemovePlayer, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDies, freezetag_PlayerDies, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerSpawn, freezetag_PlayerSpawn, CBC_ORDER_ANY);
+ MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST);
+ MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
+ MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);
+ MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY);
+ MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_FIRST); //first, last or any? dunno.
+
+ MUTATOR_ONADD
+ {
+ if(time > 1) // game loads at time 1
+ error("This is a game type and it cannot be added at runtime.");
+ g_freezetag = 1;
+ freezetag_Initialize();
+ }
+
+ MUTATOR_ONREMOVE
+ {
+ g_freezetag = 0;
+ error("This is a game type and it cannot be removed at runtime.");
+ }
+
+ return 0;
+}
--- /dev/null
+void ka_SpawnBall(void);
+void ka_TouchEvent(void);
+void ka_RespawnBall(void);
+void ka_DropEvent(entity);
+void ka_TimeScoring(void);
+
+float ka_ballcarrier_waypointsprite_visible_for_player(entity);
+
+void ka_Initialize() // run at the start of a match, initiates game mode
+{
+ if(!g_keepaway)
+ return;
+
+ precache_sound("keepaway/pickedup.wav");
+ precache_sound("keepaway/dropped.wav");
+ precache_sound("keepaway/respawn.wav");
+ precache_sound("keepaway/touch.wav");
+
+ ScoreRules_keepaway();
+ ka_SpawnBall();
+}
+
+void ka_Reset() // used to clear the ballcarrier whenever the match switches from warmup to normal
+{
+ if(self.owner)
+ if(self.owner.classname == "player")
+ ka_DropEvent(self.owner);
+
+ ka_RespawnBall();
+}
+
+void ka_SpawnBall() // loads various values for the ball, runs only once at start of match
+{
+ if(!g_keepaway) { return; }
+
+ entity e;
+ e = spawn();
+ e.model = "models/orbs/orbblue.md3";
+ precache_model(e.model);
+ setmodel(e, e.model);
+ setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off
+ e.classname = "keepawayball";
+ e.damageforcescale = autocvar_g_keepawayball_damageforcescale;
+ e.takedamage = DAMAGE_YES;
+ e.solid = SOLID_TRIGGER;
+ e.movetype = MOVETYPE_BOUNCE;
+ e.glow_color = autocvar_g_keepawayball_trail_color;
+ e.glow_trail = TRUE;
+ e.flags = FL_ITEM;
+ e.reset = ka_Reset;
+ e.touch = ka_TouchEvent;
+ e.owner = world;
+
+ InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So.
+}
+
+void ka_RespawnBall() // runs whenever the ball needs to be relocated
+{
+ if(gameover) { return; }
+ vector oldballorigin = self.origin;
+
+ if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, 10, 1024, 256))
+ {
+ makevectors(self.angles);
+ self.movetype = MOVETYPE_BOUNCE;
+ self.velocity = '0 0 200';
+ self.angles = '0 0 0';
+ self.effects = autocvar_g_keepawayball_effects;
+ self.think = ka_RespawnBall;
+ self.nextthink = time + autocvar_g_keepawayball_respawntime;
+
+ pointparticles(particleeffectnum("electro_combo"), oldballorigin, '0 0 0', 1);
+ pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 1);
+
+ WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
+ WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+ WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
+
+ sound(self, CHAN_AUTO, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+ }
+ else
+ {
+ ka_RespawnBall(); // finding a location failed, retry
+ }
+}
+
+void ka_TouchEvent() // runs any time that the ball comes in contact with something
+{
+ if(gameover) { return; }
+ if(!self) { return; }
+ if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ { // The ball fell off the map, respawn it since players can't get to it
+ ka_RespawnBall();
+ return;
+ }
+ if(other.deadflag != DEAD_NO) { return; }
+ if(other.classname != "player")
+ { // The ball just touched an object, most likely the world
+ pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1);
+ sound(self, CHAN_AUTO, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
+ return;
+ }
+ else if(self.wait > time) { return; }
+
+ // attach the ball to the player
+ self.owner = other;
+ other.ballcarried = self;
+ setattachment(self, other, "");
+ setorigin(self, '0 0 0');
+
+ // make the ball invisible/unable to do anything/set up time scoring
+ self.velocity = '0 0 0';
+ self.movetype = MOVETYPE_NONE;
+ self.effects |= EF_NODRAW;
+ self.touch = SUB_Null;
+ self.think = ka_TimeScoring;
+ self.nextthink = time + autocvar_g_keepaway_score_timeinterval;
+ self.takedamage = DAMAGE_NO;
+
+ // apply effects to player
+ other.glow_color = autocvar_g_keepawayball_trail_color;
+ other.glow_trail = TRUE;
+ other.effects |= autocvar_g_keepaway_ballcarrier_effects;
+
+ // messages and sounds
+ Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
+ WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
+ WriteString(MSG_BROADCAST, strcat("\n\n", other.netname, "^7 has picked up the ball!\n"));
+ sound(self.owner, CHAN_AUTO, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+
+ // scoring
+ PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
+
+ // waypoints
+ WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+ other.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = ka_ballcarrier_waypointsprite_visible_for_player;
+ WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+ WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
+ WaypointSprite_Ping(other.waypointsprite_attachedforcarrier);
+ WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
+}
+
+void ka_DropEvent(entity plyr) // runs any time that a player is supposed to lose the ball
+{
+ entity ball;
+ ball = plyr.ballcarried;
+
+ if(!ball) { return; }
+
+ // reset the ball
+ setattachment(ball, world, "");
+ ball.movetype = MOVETYPE_BOUNCE;
+ ball.wait = time + 1;
+ ball.touch = ka_TouchEvent;
+ ball.think = ka_RespawnBall;
+ ball.nextthink = time + autocvar_g_keepawayball_respawntime;
+ ball.takedamage = DAMAGE_YES;
+ ball.effects &~= EF_NODRAW;
+ setorigin(ball, plyr.origin + '0 0 10');
+ ball.velocity = '0 0 200' + '0 100 0'*crandom() + '100 0 0'*crandom();
+ ball.owner.ballcarried = world; // I hope nothing checks to see if the world has the ball in the rest of my code :P
+ ball.owner = world;
+
+ // reset the player effects
+ plyr.glow_trail = FALSE;
+ plyr.effects &~= autocvar_g_keepaway_ballcarrier_effects;
+
+ // messages and sounds
+ Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
+ WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
+ WriteString(MSG_BROADCAST, strcat("\n\n", plyr.netname, "^7 has dropped the ball!\n"));
+ sound(other, CHAN_AUTO, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere)
+
+ // scoring
+ // PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1); Not anymore, this is 100% the same as pickups and is useless.
+
+ // waypoints
+ WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+ WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+ WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+ WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
+ WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
+}
+
+float ka_ballcarrier_waypointsprite_visible_for_player(entity e) // runs on waypoints which are attached to ballcarriers, updates once per frame
+{
+ if(e.ballcarried)
+ if(other.classname == "spectator")
+ return FALSE; // we don't want spectators of the ballcarrier to see the attached waypoint on the top of their screen
+
+ // TODO: Make the ballcarrier lack a waypointsprite whenever they have the invisibility powerup
+
+ return TRUE;
+}
+
+void ka_TimeScoring()
+{
+ if(self.owner.ballcarried)
+ { // add points for holding the ball after a certain amount of time
+ if(autocvar_g_keepaway_score_timepoints)
+ PlayerScore_Add(self.owner, SP_SCORE, autocvar_g_keepaway_score_timepoints);
+
+ PlayerScore_Add(self.owner, SP_KEEPAWAY_BCTIME, (autocvar_g_keepaway_score_timeinterval / 1)); // interval is divided by 1 so that time always shows "seconds"
+ self.nextthink = time + autocvar_g_keepaway_score_timeinterval;
+ }
+}
+
+MUTATOR_HOOKFUNCTION(ka_Scoring)
+{
+ if((frag_attacker != frag_target) && (frag_attacker.classname == "player"))
+ {
+ if(frag_target.ballcarried) { // add to amount of times killing carrier
+ PlayerScore_Add(frag_attacker, SP_KEEPAWAY_CARRIERKILLS, 1);
+ if(autocvar_g_keepaway_score_bckill) // add bckills to the score
+ PlayerScore_Add(frag_attacker, SP_SCORE, autocvar_g_keepaway_score_bckill);
+ }
+ else if(!frag_attacker.ballcarried)
+ if(autocvar_g_keepaway_noncarrier_warn)
+ centerprint_atprio(frag_attacker, (CENTERPRIO_SPAM + 5), "Killing people while you don't have the ball gives no points!");
+
+ if(frag_attacker.ballcarried) // add to amount of kills while ballcarrier
+ PlayerScore_Add(frag_attacker, SP_SCORE, autocvar_g_keepaway_score_killac);
+ }
+
+ if(self.ballcarried) { ka_DropEvent(self); } // a player with the ball has died, drop it
+ return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_GiveFragsForKill)
+{
+ frag_score = 0; // no frags counted in keepaway
+ return 1; // you deceptive little bugger ;3 This needs to be true in order for this function to even count.
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerPreThink)
+{
+ // clear the item used for the ball in keepaway
+ self.items &~= IT_KEY1;
+
+ // if the player has the ball, make sure they have the item for it (Used for HUD primarily)
+ if(self.ballcarried)
+ self.items |= IT_KEY1;
+
+ // drop the ball if the player presses the use button
+ if(self.BUTTON_USE)
+ if(self.ballcarried) { ka_DropEvent(self); }
+
+ return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerDamage) // for changing damage and force values that are applied to players in g_damage.qc
+{
+ if(frag_attacker.ballcarried) // if the attacker is a ballcarrier
+ {
+ if(frag_target == frag_attacker) // damage done to yourself
+ {
+ frag_damage *= autocvar_g_keepaway_ballcarrier_selfdamage;
+ frag_force *= autocvar_g_keepaway_ballcarrier_selfforce;
+ }
+ else // damage done to noncarriers
+ {
+ frag_damage *= autocvar_g_keepaway_ballcarrier_damage;
+ frag_force *= autocvar_g_keepaway_ballcarrier_force;
+ }
+ }
+ else if not(frag_target.ballcarried) // if the target is a noncarrier
+ {
+ if(frag_target == frag_attacker) // damage done to yourself
+ {
+ frag_damage *= autocvar_g_keepaway_noncarrier_selfdamage;
+ frag_force *= autocvar_g_keepaway_noncarrier_selfforce;
+ }
+ else // damage done to other noncarriers
+ {
+ frag_damage *= autocvar_g_keepaway_noncarrier_damage;
+ frag_force *= autocvar_g_keepaway_noncarrier_force;
+ }
+ }
+ return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_RemovePlayer)
+{
+ if(self.ballcarried) { ka_DropEvent(self); } // a player with the ball has left the match, drop it
+ return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ka_PlayerPowerups)
+{
+ // In the future this hook is supposed to allow me to do some extra stuff with waypointsprites and invisibility powerup
+ // So bare with me until I can fix a certain bug with ka_ballcarrier_waypointsprite_visible_for_player()
+
+ self.effects &~= autocvar_g_keepaway_ballcarrier_effects;
+
+ if(self.ballcarried)
+ self.effects |= autocvar_g_keepaway_ballcarrier_effects;
+
+ return 0;
+}
+
+MUTATOR_DEFINITION(gamemode_keepaway)
+{
+ MUTATOR_HOOK(MakePlayerObserver, ka_RemovePlayer, CBC_ORDER_ANY);
+ MUTATOR_HOOK(ClientDisconnect, ka_RemovePlayer, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDies, ka_Scoring, CBC_ORDER_ANY);
+ MUTATOR_HOOK(GiveFragsForKill, ka_GiveFragsForKill, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDamage_Calculate, ka_PlayerDamage, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPowerups, ka_PlayerPowerups, CBC_ORDER_ANY);
+
+ MUTATOR_ONADD
+ {
+ if(time > 1) // game loads at time 1
+ error("This is a game type and it cannot be added at runtime.");
+ g_keepaway = 1;
+ ka_Initialize();
+ }
+
+ MUTATOR_ONREMOVE
+ {
+ g_keepaway = 0;
+ error("This is a game type and it cannot be removed at runtime.");
+ }
+
+ return 0;
+}
// #define KH_PLAYER_USE_ATTACHMENT
// #define KH_PLAYER_USE_CARRIEDMODEL
-// #define KH_KEY_ATTACHMENT_DEBUG
#ifdef KH_PLAYER_USE_ATTACHMENT
vector KH_PLAYER_ATTACHMENT_DIST_ROTATED = '0 -4 0';
if(key && key.owner && frags_owner)
UpdateFrags(key.owner, frags_owner);
- if(!cvar("sv_eventlog")) //output extra info to the console or text file
+ if(!autocvar_sv_eventlog) //output extra info to the console or text file
return;
s = strcat(":keyhunt:", what, ":", ftos(player.playerid), ":", ftos(frags_player));
key.flags = FL_ITEM;
key.solid = SOLID_TRIGGER;
key.movetype = MOVETYPE_TOSS;
- key.pain_finished = time + cvar("g_balance_keyhunt_delay_return");
- key.damageforcescale = cvar("g_balance_keyhunt_damageforcescale");
+ key.pain_finished = time + autocvar_g_balance_keyhunt_delay_return;
+ key.damageforcescale = autocvar_g_balance_keyhunt_damageforcescale;
key.takedamage = DAMAGE_YES;
// let key.team stay
key.modelindex = kh_key_dropped;
if(key.kh_dropperteam != player.team)
{
- kh_Scores_Event(player, key, "collect", cvar("g_balance_keyhunt_score_collect"), 0);
+ kh_Scores_Event(player, key, "collect", autocvar_g_balance_keyhunt_score_collect, 0);
PlayerScore_Add(player, SP_KH_PICKUPS, 1);
}
key.kh_dropperteam = 0;
if(other.deadflag != DEAD_NO)
return;
if(other == self.enemy)
- if(time < self.kh_droptime + cvar("g_balance_keyhunt_delay_collect"))
+ if(time < self.kh_droptime + autocvar_g_balance_keyhunt_delay_collect)
return; // you just dropped it!
kh_Key_Collect(self, other);
}
kh_Key_Remove(key);
kh_no_radar_circles = FALSE;
- kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
}
void kh_WinnerTeam(float teem) // runs when a team wins
float first;
entity key;
float score;
- score = (kh_teams - 1) * cvar("g_balance_keyhunt_score_capture");
+ score = (kh_teams - 1) * autocvar_g_balance_keyhunt_score_capture;
DistributeEvenly_Init(score, kh_teams);
// twice the score for 3 team games, three times the score for 4 team games!
// note: for a win by destroying the key, this should NOT be applied
if(attacker)
{
if(lostkey.kh_previous_owner)
- kh_Scores_Event(lostkey.kh_previous_owner, world, "pushed", 0, -cvar("g_balance_keyhunt_score_push"));
+ kh_Scores_Event(lostkey.kh_previous_owner, world, "pushed", 0, -autocvar_g_balance_keyhunt_score_push);
// don't actually GIVE him the -nn points, just log
- kh_Scores_Event(attacker, world, "push", cvar("g_balance_keyhunt_score_push"), 0);
+ kh_Scores_Event(attacker, world, "push", autocvar_g_balance_keyhunt_score_push, 0);
PlayerScore_Add(attacker, SP_KH_PUSHES, 1);
centerprint(attacker, "Your push is the best!");
bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "^7 when ", attacker.netname, "^7 came\n");
else
{
float of, fragsleft, i, j, thisteam;
- of = cvar("g_balance_keyhunt_score_destroyed_ownfactor");
+ of = autocvar_g_balance_keyhunt_score_destroyed_ownfactor;
FOR_EACH_PLAYER(player)
if(player.team != teem)
++keys;
if(lostkey.kh_previous_owner)
- kh_Scores_Event(lostkey.kh_previous_owner, world, "destroyed", 0, -cvar("g_balance_keyhunt_score_destroyed"));
+ kh_Scores_Event(lostkey.kh_previous_owner, world, "destroyed", 0, -autocvar_g_balance_keyhunt_score_destroyed);
// don't actually GIVE him the -nn points, just log
if(lostkey.kh_previous_owner.playerid == lostkey.kh_previous_owner_playerid)
PlayerScore_Add(lostkey.kh_previous_owner, SP_KH_DESTROYS, 1);
- DistributeEvenly_Init(cvar("g_balance_keyhunt_score_destroyed"), keys * of + players);
+ DistributeEvenly_Init(autocvar_g_balance_keyhunt_score_destroyed, keys * of + players);
FOR_EACH_KH_KEY(key)
if(key.owner && key.team != teem)
if(intermission_running)
return;
-#ifdef KH_KEY_ATTACHMENT_DEBUG
- if(self.kh_prev == self.owner)
- {
- if(cvar_string("_angles") != "")
- {
- self.angles = stov(cvar_string("_angles"));
- setorigin(self, stov(cvar_string("_origin")));
- }
- }
-#endif
-
if(self.owner)
{
#ifndef KH_PLAYER_USE_ATTACHMENT
#endif
if(self.owner.BUTTON_USE)
- if(time >= self.owner.kh_droptime + cvar("g_balance_keyhunt_delay_drop"))
+ if(time >= self.owner.kh_droptime + autocvar_g_balance_keyhunt_delay_drop)
{
self.owner.kh_droptime = time;
self.kh_droptime = time; // prevent collecting this one for some time
bprint(self.owner.netname, "^7 dropped the ", self.netname, "\n");
sound(self.owner, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
makevectors(self.owner.v_angle);
- self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, cvar("g_balance_keyhunt_throwvelocity") * v_forward);
+ self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE);
kh_Key_AssignTo(self, world);
- self.pushltime = time + cvar("g_balance_keyhunt_protecttime");
+ self.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
self.kh_dropperteam = self.team;
}
}
vector p;
p = self.owner.origin;
FOR_EACH_KH_KEY(key)
- if(vlen(key.owner.origin - p) > cvar("g_balance_keyhunt_maxdist"))
+ if(vlen(key.owner.origin - p) > autocvar_g_balance_keyhunt_maxdist)
goto not_winning;
kh_WinnerTeam(self.team);
:not_winning
bprint(player.netname, "^7 died and lost the ", key.netname, "\n");
kh_Key_AssignTo(key, world);
makevectors('-1 0 0' * (45 + 45 * random()) + '0 360 0' * random());
- key.velocity = W_CalculateProjectileVelocity(player.velocity, cvar("g_balance_keyhunt_dropvelocity") * v_forward);
+ key.velocity = W_CalculateProjectileVelocity(player.velocity, autocvar_g_balance_keyhunt_dropvelocity * v_forward, FALSE);
key.pusher = mypusher;
- key.pushltime = time + cvar("g_balance_keyhunt_protecttime");
+ key.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
if(suicide)
key.kh_dropperteam = player.team;
}
teams_missing = kh_CheckEnoughPlayers();
if(teams_missing == "")
- kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
else
kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
}
}
kh_tracking_enabled = FALSE;
- kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_tracking"), "Scanning frequency range...", kh_EnableTrackingDevice);
+ kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_tracking, "Scanning frequency range...", kh_EnableTrackingDevice);
}
float kh_HandleFrags(entity attacker, entity targ, float f) // adds to the player score
nk = 0;
for(k = targ.kh_next; k != world; k = k.kh_next)
++nk;
- kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", -nk * cvar("g_balance_keyhunt_score_collect"), 0);
+ kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", -nk * autocvar_g_balance_keyhunt_score_collect, 0);
}
else
{
- kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", cvar("g_balance_keyhunt_score_carrierfrag")-1, 0);
+ kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", autocvar_g_balance_keyhunt_score_carrierfrag-1, 0);
PlayerScore_Add(attacker, SP_KH_KCKILLS, 1);
// the frag gets added later
}
precache_model("models/keyhunt/key.md3");
// setup variables
- kh_teams = cvar("g_keyhunt_teams_override");
+ kh_teams = autocvar_g_keyhunt_teams_override;
if(kh_teams < 2)
- kh_teams = cvar("g_keyhunt_teams");
+ kh_teams = autocvar_g_keyhunt_teams;
kh_teams = bound(2, kh_teams, 4);
// make a KH entity for controlling the game
// if we have e.g. 0.5 sec ramptime and a frametime of 0.25, then the ramp code
// will be called ramp_time/frametime times = 2 times. so, we need to
// add 0.5 * the total speed each frame until the dodge action is done..
- common_factor = sys_frametime / cvar("sv_dodging_ramp_time");
+ common_factor = sys_frametime / autocvar_sv_dodging_ramp_time;
// if ramp time is smaller than frametime we get problems ;D
if (common_factor > 1)
common_factor = 1;
- new_velocity_gain = self.dodging_velocity_gain - (common_factor * cvar("sv_dodging_horiz_speed"));
+ new_velocity_gain = self.dodging_velocity_gain - (common_factor * autocvar_sv_dodging_horiz_speed);
if (new_velocity_gain < 0)
new_velocity_gain = 0;
self.velocity =
self.velocity
- + (cvar("sv_dodging_up_speed") * v_up);
+ + (autocvar_sv_dodging_up_speed * v_up);
- if (cvar("sv_dodging_sound") == 1)
+ if (autocvar_sv_dodging_sound == 1)
PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
setanim(self, self.anim_jump, TRUE, FALSE, TRUE);
}
// are we done with the dodging ramp yet?
- if((self.dodging_action == 1) && ((time - self.last_dodging_time) > cvar("sv_dodging_ramp_time")))
+ if((self.dodging_action == 1) && ((time - self.last_dodging_time) > autocvar_sv_dodging_ramp_time))
{
// reset state so next dodge can be done correctly
self.dodging_action = 0;
// returns 1 if the player is close to a wall
float check_close_to_wall(float threshold) {
- if (cvar("sv_dodging_wall_dodging") == 0)
+ if (autocvar_sv_dodging_wall_dodging == 0)
return 0;
vector trace_start;
dodge_detected = 0;
// first check if the last dodge is far enough back in time so we can dodge again
- if ((time - self.last_dodging_time) < cvar("sv_dodging_delay"))
+ if ((time - self.last_dodging_time) < autocvar_sv_dodging_delay)
return 0;
- if (check_close_to_ground(cvar("sv_dodging_height_threshold")) != 1
- && check_close_to_wall(cvar("sv_dodging_wall_distance_threshold")) != 1)
+ if (check_close_to_ground(autocvar_sv_dodging_height_threshold) != 1
+ && check_close_to_wall(autocvar_sv_dodging_wall_distance_threshold) != 1)
return 0;
if (self.movement_x > 0) {
self.dodging_action = 1;
self.dodging_single_action = 1;
- self.dodging_velocity_gain = cvar("sv_dodging_horiz_speed");
+ self.dodging_velocity_gain = autocvar_sv_dodging_horiz_speed;
self.dodging_direction_x = tap_direction_x;
self.dodging_direction_y = tap_direction_y;
nix_weapon = nix_nextweapon;
nix_weapon_ammo = nix_nextweapon_ammo;
nix_nextweapon = 0;
- nix_nextchange = time + cvar("g_balance_nix_roundtime");
+ nix_nextchange = time + autocvar_g_balance_nix_roundtime;
//weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
}
if (self.items & IT_UNLIMITED_WEAPON_AMMO)
{
self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
- cvar("g_pickup_shells_max") : 0;
+ autocvar_g_pickup_shells_max : 0;
self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
- cvar("g_pickup_nails_max") : 0;
+ autocvar_g_pickup_nails_max : 0;
self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
- cvar("g_pickup_rockets_max") : 0;
+ autocvar_g_pickup_rockets_max : 0;
self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
- cvar("g_pickup_cells_max") : 0;
+ autocvar_g_pickup_cells_max : 0;
self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
- cvar("g_pickup_fuel_max") : 0;
+ autocvar_g_pickup_fuel_max : 0;
}
else
{
self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
- cvar("g_balance_nix_ammo_shells") : 0;
+ autocvar_g_balance_nix_ammo_shells : 0;
self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
- cvar("g_balance_nix_ammo_nails") : 0;
+ autocvar_g_balance_nix_ammo_nails : 0;
self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
- cvar("g_balance_nix_ammo_rockets") : 0;
+ autocvar_g_balance_nix_ammo_rockets : 0;
self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
- cvar("g_balance_nix_ammo_cells") : 0;
+ autocvar_g_balance_nix_ammo_cells : 0;
self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
- cvar("g_balance_nix_ammo_fuel") : 0;
+ autocvar_g_balance_nix_ammo_fuel : 0;
}
- self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
+ self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
if(dt >= 1 && dt <= 5)
self.nix_lastinfotime = -42;
else
if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
{
if (nix_weapon_ammo & IT_SHELLS)
- self.ammo_shells = self.ammo_shells + cvar("g_balance_nix_ammoincr_shells");
+ self.ammo_shells = self.ammo_shells + autocvar_g_balance_nix_ammoincr_shells;
else if (nix_weapon_ammo & IT_NAILS)
- self.ammo_nails = self.ammo_nails + cvar("g_balance_nix_ammoincr_nails");
+ self.ammo_nails = self.ammo_nails + autocvar_g_balance_nix_ammoincr_nails;
else if (nix_weapon_ammo & IT_ROCKETS)
- self.ammo_rockets = self.ammo_rockets + cvar("g_balance_nix_ammoincr_rockets");
+ self.ammo_rockets = self.ammo_rockets + autocvar_g_balance_nix_ammoincr_rockets;
else if (nix_weapon_ammo & IT_CELLS)
- self.ammo_cells = self.ammo_cells + cvar("g_balance_nix_ammoincr_cells");
+ self.ammo_cells = self.ammo_cells + autocvar_g_balance_nix_ammoincr_cells;
if (nix_weapon_ammo & IT_FUEL) // hook uses cells and fuel
- self.ammo_fuel = self.ammo_fuel + cvar("g_balance_nix_ammoincr_fuel");
- self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
+ self.ammo_fuel = self.ammo_fuel + autocvar_g_balance_nix_ammoincr_fuel;
+ self.nix_nextincr = time + autocvar_g_balance_nix_incrtime;
}
self.weapons = 0;
case IT_25HP:
case IT_ARMOR:
case IT_ARMOR_SHARD:
- if (cvar("g_nix_with_healtharmor"))
+ if (autocvar_g_nix_with_healtharmor)
return 0;
break;
case IT_STRENGTH:
case IT_INVINCIBLE:
- if (cvar("g_nix_with_powerups"))
+ if (autocvar_g_nix_with_powerups)
return 0;
break;
}
MUTATOR_ONADD
{
- g_nix_with_laser = cvar("g_nix_with_laser");
+ g_nix_with_laser = autocvar_g_nix_with_laser;
nix_nextchange = time;
nix_nextweapon = 0;
MUTATOR_DEFINITION(mutator_vampire)
{
- MUTATOR_HOOK(PlayerDamage, vampire_PlayerDamage, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, vampire_PlayerDamage, CBC_ORDER_ANY);
MUTATOR_HOOK(BuildMutatorsString, vampire_BuildMutatorsString, CBC_ORDER_ANY);
MUTATOR_HOOK(BuildMutatorsPrettyString, vampire_BuildMutatorsPrettyString, CBC_ORDER_ANY);
MUTATOR_DECLARATION(gamemode_keyhunt);
+MUTATOR_DECLARATION(gamemode_freezetag);
+MUTATOR_DECLARATION(gamemode_keepaway);
MUTATOR_DECLARATION(mutator_nix);
MUTATOR_DECLARATION(mutator_dodging);
CVTOV(g_nexball_delay_idle); //10
CVTOV(g_nexball_football_physics); //0
- radar_showennemies = cvar("g_nexball_radar_showallplayers");
+ radar_showennemies = autocvar_g_nexball_radar_showallplayers;
InitializeEntity(world, nb_delayedinit, INITPRIO_GAMETYPE);
}
void LogNB(string mode, entity actor)
{
string s;
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
s = strcat(":nexball:", mode);
if(actor != world)
void nexball_setstatus (void)
{
local entity oldself;
- if (!g_nexball)
- return;
+ self.items &~= IT_KEY1;
if (self.ballcarried)
{
if (self.ballcarried.teamtime && (self.ballcarried.teamtime < time))
}
WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
- WaypointSprite_AttachCarrier("nb-ball", ball);
+ //WaypointSprite_AttachCarrier("nb-ball", ball);
+ WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE); // no health bar please
WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
setorigin(self, self.spawnorigin); // make sure it's positioned correctly anyway
self.movetype = MOVETYPE_NONE;
self.think = InitBall;
- self.nextthink = max(time, game_starttime) + cvar("g_nexball_delay_start");
+ self.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
}
}
football_touch();
return;
}
- if (!self.cnt && other.classname == "player" && (other.playerid != self.dropperid || time > self.ctf_droptime + cvar("g_nexball_delay_collect"))) {
+ if (!self.cnt && other.classname == "player" && (other.playerid != self.dropperid || time > self.ctf_droptime + autocvar_g_nexball_delay_collect)) {
if (other.health <= 0)
return;
LogNB("caught", other);
ball.think = ResetBall;
if (ball.classname == "nexball_basketball")
ball.touch = football_touch; // better than SUB_Null: football control until the ball gets reset
- ball.nextthink = time + cvar("g_nexball_delay_goal") * (self.team != GOAL_OUT);
+ ball.nextthink = time + autocvar_g_nexball_delay_goal * (self.team != GOAL_OUT);
}
//=======================//
if (cvar(strcat("g_", self.classname, "_trail"))) //nexball_basketball :p
{
- self.glow_color = cvar("g_nexball_trail_color");
+ self.glow_color = autocvar_g_nexball_trail_color;
self.glow_trail = TRUE;
}
self.movetype = MOVETYPE_FLY;
- if (!cvar("g_nexball_sound_bounce"))
+ if (!autocvar_g_nexball_sound_bounce)
self.noise = "";
else if (!self.noise)
self.noise = "sound/nexball/bounce.wav";
self.reset = ball_restart;
self.think = InitBall;
- self.nextthink = game_starttime + cvar("g_nexball_delay_start");
+ self.nextthink = game_starttime + autocvar_g_nexball_delay_start;
}
void spawnfunc_nexball_basketball (void)
self.effects = g_nexball_basketball_effects_default;
self.solid = SOLID_TRIGGER;
balls |= BALL_BASKET;
- self.bouncefactor = cvar("g_nexball_basketball_bouncefactor");
- self.bouncestop = cvar("g_nexball_basketball_bouncestop");
+ self.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
+ self.bouncestop = autocvar_g_nexball_basketball_bouncestop;
SpawnBall();
}
self.classname = "nexball_football";
self.solid = SOLID_TRIGGER;
balls |= BALL_FOOT;
- self.bouncefactor = cvar("g_nexball_football_bouncefactor");
- self.bouncestop = cvar("g_nexball_football_bouncestop");
+ self.bouncefactor = autocvar_g_nexball_football_bouncefactor;
+ self.bouncestop = autocvar_g_nexball_football_bouncestop;
SpawnBall();
}
if(attacker.team != other.team || g_nexball_basketball_teamsteal)
if((ball = other.ballcarried) && (attacker.classname == "player" || attacker.classname == "gib"))
{
- other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * cvar("g_balance_nexball_secondary_force");
+ other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
other.flags &~= FL_ONGROUND;
if(!attacker.ballcarried)
{
if (!(ball = self.ballcarried))
return;
- W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav",0);
+ W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CHAN_WEAPON, 0);
tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
if(trace_startsolid)
{
mul = 1;
else
{
- mi = cvar("g_nexball_basketball_meter_minpower");
- ma = max(mi, cvar("g_nexball_basketball_meter_maxpower")); // avoid confusion
+ mi = autocvar_g_nexball_basketball_meter_minpower;
+ ma = max(mi, autocvar_g_nexball_basketball_meter_maxpower); // avoid confusion
//One triangle wave period with 1 as max
mul = 2 * mod(t, g_nexball_meter_period) / g_nexball_meter_period;
if (mul > 1)
mul = 2 - mul;
mul = mi + (ma - mi) * mul; // range from the minimal power to the maximal power
}
- DropBall (ball, w_shotorg, W_CalculateProjectileVelocity(self.velocity, w_shotdir * cvar("g_balance_nexball_primary_speed") * mul));
+ DropBall (ball, w_shotorg, W_CalculateProjectileVelocity(self.velocity, w_shotdir * autocvar_g_balance_nexball_primary_speed * mul, FALSE));
//TODO: use the speed_up cvar too ??
}
local entity missile;
if (!(balls & BALL_BASKET))
return;
- W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav",0);
+ W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CHAN_WEAPON, 0);
// pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
setsize (missile, '0 0 0', '0 0 0');
setorigin (missile, w_shotorg);
- W_SetupProjectileVelocity(missile, cvar("g_balance_nexball_secondary_speed"), 0);
+ W_SetupProjectileVelocity(missile, autocvar_g_balance_nexball_secondary_speed, 0);
missile.angles = vectoangles (missile.velocity);
missile.touch = W_Nexball_Touch;
missile.think = SUB_Remove;
- missile.nextthink = time + cvar("g_balance_nexball_secondary_lifetime"); //FIXME: use a distance instead?
+ missile.nextthink = time + autocvar_g_balance_nexball_secondary_lifetime; //FIXME: use a distance instead?
missile.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
missile.flags = FL_PROJECTILE;
if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_nexball_primary_refire")))
- if (cvar("g_nexball_basketball_meter"))
+ if (weapon_prepareattack(0, autocvar_g_balance_nexball_primary_refire))
+ if (autocvar_g_nexball_basketball_meter)
{
if (self.ballcarried && !self.metertime)
self.metertime = time;
else
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nexball_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
}
else
{
W_Nexball_Attack(-1);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nexball_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
}
if (self.BUTTON_ATCK2)
- if (weapon_prepareattack(1, cvar("g_balance_nexball_secondary_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_nexball_secondary_refire))
{
W_Nexball_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_nexball_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_nexball_secondary_animtime, w_ready);
}
if (!self.BUTTON_ATCK && self.metertime && self.ballcarried)
{
W_Nexball_Attack(time - self.metertime);
// DropBall or stealing will set metertime back to 0
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nexball_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
}
}
else if (req == WR_PRECACHE)
precache_model ("models/elaser.mdl");
precache_sound ("nexball/shoot1.wav");
precache_sound ("nexball/shoot2.wav");
+ precache_sound ("misc/typehit.wav");
}
else if (req == WR_SETUP)
weapon_setup(WEP_PORTO);
--- /dev/null
+float playerstats_db;
+string playerstats_last;
+string events_last;
+.float playerstats_addedglobalinfo;
+float playerstats_requested;
+.string playerstats_id;
+
+void PlayerStats_Init()
+{
+ string uri;
+ playerstats_db = -1;
+ playerstats_waitforme = TRUE;
+ uri = autocvar_g_playerstats_uri;
+ if(uri == "")
+ return;
+ playerstats_db = db_create();
+ if(playerstats_db >= 0)
+ playerstats_waitforme = FALSE; // must wait for it at match end
+
+ PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
+ PlayerStats_AddEvent(PLAYERSTATS_WINS);
+ PlayerStats_AddEvent(PLAYERSTATS_MATCHES);
+ PlayerStats_AddEvent(PLAYERSTATS_JOINS);
+ PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_VALID);
+
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_BOTLIKE);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD);
+ PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM);
+}
+
+void PlayerStats_AddPlayer(entity e)
+{
+ if(playerstats_db < 0)
+ return;
+
+ if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
+ e.playerstats_id = strzone(e.crypto_idfp);
+ else if(clienttype(e) == CLIENTTYPE_BOT)
+ e.playerstats_id = strzone(sprintf("bot#%d", e.playerid));
+ else
+ e.playerstats_id = strzone(sprintf("player#%d", e.playerid));
+
+ string key;
+ key = sprintf("%s:*", e.playerstats_id);
+
+ string p;
+ p = db_get(playerstats_db, key);
+ if(p == "")
+ {
+ if(playerstats_last)
+ {
+ db_put(playerstats_db, key, playerstats_last);
+ strunzone(playerstats_last);
+ }
+ else
+ db_put(playerstats_db, key, "#");
+ playerstats_last = strzone(e.playerstats_id);
+ }
+}
+
+void PlayerStats_AddTeam(float t)
+{
+ if(playerstats_db < 0)
+ return;
+
+ string key;
+ key = sprintf("team#%d:*", t);
+
+ string p;
+ p = db_get(playerstats_db, key);
+ if(p == "")
+ {
+ if(playerstats_last)
+ {
+ db_put(playerstats_db, key, playerstats_last);
+ strunzone(playerstats_last);
+ }
+ else
+ db_put(playerstats_db, key, "#");
+ playerstats_last = strzone(sprintf("team%d", t));
+ }
+}
+
+void PlayerStats_AddEvent(string event_id)
+{
+ if(playerstats_db < 0)
+ return;
+
+ string key;
+ key = sprintf("*:%s", event_id);
+
+ string p;
+ p = db_get(playerstats_db, key);
+ if(p == "")
+ {
+ if(events_last)
+ {
+ db_put(playerstats_db, key, events_last);
+ strunzone(events_last);
+ }
+ else
+ db_put(playerstats_db, key, "#");
+ events_last = strzone(event_id);
+ }
+}
+
+void PlayerStats_Event(entity e, string event_id, float value)
+{
+ if(!e.playerstats_id || playerstats_db < 0)
+ return;
+
+ string key;
+ float val;
+ key = sprintf("%s:%s", e.playerstats_id, event_id);
+ val = stof(db_get(playerstats_db, key));
+ val += value;
+ db_put(playerstats_db, key, ftos(val));
+}
+
+void PlayerStats_TeamScore(float t, string event_id, float value)
+{
+ string key;
+ float val;
+ key = sprintf("team#%d:%s", t, event_id);
+ val = stof(db_get(playerstats_db, key));
+ val += value;
+ db_put(playerstats_db, key, ftos(val));
+}
+
+void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data)
+{
+ if(playerstats_requested)
+ playerstats_waitforme = TRUE;
+}
+
+/*
+ format spec:
+
+ A collection of lines of the format <key> SPACE <value> NEWLINE, where
+ <key> is always a single character.
+
+ The following keys are defined:
+
+ V: format version (always 1)
+ T: time at which the game ended
+ G: game type
+ M: map name
+ S: "hostname" of the server
+ C: number of "unpure" cvar changes
+ P: player ID of an existing player; this also sets the owner for all following "n" and "e" lines (lower case!)
+ n: nickname of the player (optional)
+ e: followed by an event name, a space, and the event count/score
+ event names can be:
+ alivetime: total playing time of the player
+ wins: number of games won (can only be set if matches is set)
+ matches: number of matches played to the end (not aborted by map switch)
+ joins: number of matches joined (always 1 unless player never played during the match)
+ scoreboardvalid: set to 1 if the player was there at the end of the match
+ total-<scoreboardname>: total score of that scoreboard item
+ scoreboard-<scoreboardname>: end-of-game score of that scoreboard item (can differ in non-team games)
+ achievement-<achievementname>: achievement counters
+*/
+
+//#NO AUTOCVARS START
+void PlayerStats_Shutdown()
+{
+ string p, pn;
+ string e, en;
+ string nn;
+ float b;
+ float i;
+ string uri;
+
+ if(playerstats_db < 0)
+ return;
+
+ uri = autocvar_g_playerstats_uri;
+ if(uri != "")
+ {
+ b = buf_create();
+ i = 0;
+
+ db_dump(playerstats_db, "foo.db");
+
+ bufstr_set(b, i++, "V 1");
+ bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000)));
+ bufstr_set(b, i++, sprintf("G %s", GetGametype()));
+ bufstr_set(b, i++, sprintf("M %s", GetMapname()));
+ bufstr_set(b, i++, sprintf("S %s", cvar_string("hostname")));
+ bufstr_set(b, i++, sprintf("C %d", cvar_purechanges_count));
+ for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
+ {
+ bufstr_set(b, i++, sprintf("P %s", p));
+ nn = db_get(playerstats_db, sprintf("%s:_netname", p));
+ if(nn != "")
+ bufstr_set(b, i++, sprintf("n %s", nn));
+ for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
+ {
+ float v;
+ v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
+ if(v != 0)
+ bufstr_set(b, i++, sprintf("e %s %g", e, v));
+ }
+ }
+ bufstr_set(b, i++, "");
+
+ if(autocvar_g_playerstats_debug)
+ {
+ for(i = 0; i < buf_getsize(b); ++i)
+ print(bufstr_get(b, i), "\n");
+ }
+
+ if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0))
+ playerstats_requested = TRUE;
+ else
+ playerstats_waitforme = TRUE; // if posting fails, we must continue anyway
+
+ buf_del(b);
+ }
+ else
+ playerstats_waitforme = TRUE;
+
+ db_close(playerstats_db);
+ playerstats_db = -1;
+}
+//#NO AUTOCVARS END
+
+void PlayerStats_AddGlobalInfo(entity p)
+{
+ if(playerstats_db < 0)
+ return;
+ if(!p.playerstats_id || playerstats_db < 0)
+ return;
+ p.playerstats_addedglobalinfo = TRUE;
+
+ // add global info!
+ if(p.alivetime)
+ PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+
+ if(p.alivetime)
+ PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+
+ if(p.cvar_cl_allow_uid2name == 1 || clienttype(p) == CLIENTTYPE_BOT)
+ db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
+
+ if(p.alivetime > 0)
+ PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
+
+ strunzone(p.playerstats_id);
+ p.playerstats_id = string_null;
+}
+
+void PlayerStats_EndMatch(float finished)
+{
+ entity p;
+ FOR_EACH_PLAYER(p)
+ {
+ PlayerScore_PlayerStats(p);
+ PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1);
+ if(finished)
+ {
+ PlayerStats_Event(p, PLAYERSTATS_WINS, p.winning);
+ PlayerStats_Event(p, PLAYERSTATS_MATCHES, 1);
+ }
+ }
+}
--- /dev/null
+// time the player was alive and kicking
+string PLAYERSTATS_ALIVETIME = "alivetime";
+string PLAYERSTATS_WINS = "wins";
+string PLAYERSTATS_MATCHES = "matches";
+string PLAYERSTATS_JOINS = "joins";
+string PLAYERSTATS_SCOREBOARD_VALID = "scoreboardvalid";
+
+string PLAYERSTATS_TOTAL = "total-";
+string PLAYERSTATS_SCOREBOARD = "scoreboard-";
+
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3 = "achievement-kill-spree-3";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5 = "achievement-kill-spree-5";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10 = "achievement-kill-spree-10";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15 = "achievement-kill-spree-15";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20 = "achievement-kill-spree-20";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25 = "achievement-kill-spree-25";
+string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30 = "achievement-kill-spree-30";
+string PLAYERSTATS_ACHIEVEMENT_BOTLIKE = "achievement-botlike";
+string PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD = "achievement-firstblood";
+string PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM = "achievement-firstvictim";
+
+// delay map switch until this is set
+float playerstats_waitforme;
+
+// call at initialization
+void PlayerStats_Init();
+
+// add a new player
+void PlayerStats_AddPlayer(entity e);
+
+// add a new team
+void PlayerStats_AddTeam(float t);
+
+// add a new event
+void PlayerStats_AddEvent(string event_id);
+
+// call on each event to track, or at player disconnect OR match end for "global stuff"
+void PlayerStats_Event(entity e, string event_id, float value);
+
+// add a team score
+void PlayerStats_TeamScore(float t, string event_id, float value);
+
+// call at game over
+void PlayerStats_Shutdown(); // send stats to the server
+
+// URI GET callback
+void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data);
+
+// call this whenever a player leaves
+void PlayerStats_AddGlobalInfo(entity p);
+
+// call this at the end of the match
+void PlayerStats_EndMatch(float finished);
// reset fade counter
teleporter.portal_wants_to_vanish = 0;
- teleporter.fade_time = time + cvar("g_balance_portal_lifetime");
- teleporter.health = cvar("g_balance_portal_health");
- teleporter.enemy.health = cvar("g_balance_portal_health");
+ teleporter.fade_time = time + autocvar_g_balance_portal_lifetime;
+ teleporter.health = autocvar_g_balance_portal_health;
+ teleporter.enemy.health = autocvar_g_balance_portal_health;
return 1;
}
if(IS_INDEPENDENT_PLAYER(other.aiment) || IS_INDEPENDENT_PLAYER(self.aiment))
return; // cannot go through someone else's portal
fixedmakevectors(self.mangle);
- g = frametime * '0 0 -1' * cvar("sv_gravity");
+ g = frametime * '0 0 -1' * autocvar_sv_gravity;
if(!Portal_WillHitPlane(other.origin, other.mins, other.maxs, other.velocity + g, self.origin, v_forward, self.maxs_x))
return;
destination.enemy = teleporter;
Portal_MakeInPortal(teleporter);
Portal_MakeOutPortal(destination);
- teleporter.fade_time = time + cvar("g_balance_portal_lifetime");
+ teleporter.fade_time = time + autocvar_g_balance_portal_lifetime;
destination.fade_time = teleporter.fade_time;
teleporter.portal_wants_to_vanish = 0;
destination.portal_wants_to_vanish = 0;
self.solid = SOLID_BBOX;
self.aiment = world;
- g = frametime * '0 0 -1' * cvar("sv_gravity");
+ g = frametime * '0 0 -1' * autocvar_sv_gravity;
fixedmakevectors(self.mangle);
portal.portal_activatetime = time + 0.1;
portal.takedamage = DAMAGE_AIM;
portal.event_damage = Portal_Damage;
- portal.fade_time = time + cvar("g_balance_portal_lifetime");
- portal.health = cvar("g_balance_portal_health");
+ portal.fade_time = time + autocvar_g_balance_portal_lifetime;
+ portal.health = autocvar_g_balance_portal_health;
setmodel(portal, "models/portal.md3");
portal.modelindex_lod0 = portal.modelindex;
portal.customizeentityforclient = Portal_Customize;
../common/mapinfo.qh
../common/util.qc
+accuracy.qh
csqcprojectile.qh
csqceffects.qc
anticheat.qh
cheats.qh
+playerstats.qh
portals.qh
monsters/ai.qc
monsters/m_monsters.qc
monsters/monster_zombie.qc
+accuracy.qc
csqcprojectile.qc
playerdemo.qc
anticheat.qc
cheats.qc
+playerstats.qc
mutators/base.qc
mutators/gamemode_keyhunt.qc
+mutators/gamemode_freezetag.qc
+mutators/gamemode_keepaway.qc
mutators/mutator_nix.qc
mutators/mutator_dodging.qc
mutators/mutator_rocketflying.qc
// if we didn't hit a return yet, we have a new record!
+ // if the player does not have a UID we can unfortunately not store the record, as the rankings system relies on UIDs
+ if(myuid == "")
+ {
+ bprint(mynetname, "^1 scored a new record with ^7", TIME_ENCODED_TOSTRING(t), "^1, but lacks a UID, so the record will unfortunately be lost.\n");
+ return;
+ }
+
oldrec = race_readTime(GetMapname(), newpos);
oldrec_holder = race_readName(GetMapname(), newpos);
PlayerScore_Add(e, SP_RACE_TIME, snew - s);
l = PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1);
- if(cvar("fraglimit"))
- if(l >= cvar("fraglimit"))
+ if(autocvar_fraglimit)
+ if(l >= autocvar_fraglimit)
race_StartCompleting();
if(race_completing)
if(cp == race_timed_checkpoint)
{
race_setTime(GetMapname(), t, e.crypto_idfp, e.netname, e);
- if(g_cts && cvar("g_cts_finish_kill_delay"))
+ if(g_cts && autocvar_g_cts_finish_kill_delay)
{
- CTS_ClientKill(cvar("g_cts_finish_kill_delay"));
+ CTS_ClientKill(e);
}
}
if(t < recordtime || recordtime == 0)
for(trigger = world; (trigger = find(trigger, classname, "trigger_multiple")); )
for(targ = world; (targ = find(targ, targetname, trigger.target)); )
if (targ.classname == "target_checkpoint" || targ.classname == "target_startTimer" || targ.classname == "target_stopTimer") {
- targ.wait = -2;
+ trigger.wait = 0;
+ trigger.delay = 0;
+ targ.wait = 0;
targ.delay = 0;
- setsize(targ, trigger.mins, trigger.maxs);
- setorigin(targ, trigger.origin);
+ // These just make the game crash on some maps with oddly shaped triggers.
+ // (on the other hand they used to fix the case when two players ran through a checkpoint at once,
+ // and often one of them just passed through without being registered. Hope it's fixed in a better way now.
+ // (happened on item triggers too)
+ //
+ //targ.wait = -2;
+ //targ.delay = 0;
+
+ //setsize(targ, trigger.mins, trigger.maxs);
+ //setorigin(targ, trigger.origin);
//remove(trigger);
}
}
void spawnfunc_runematch_spawn_point()
{
- if(!g_runematch || !cvar("g_runematch_fixedspawns"))
+ if(!g_runematch || !autocvar_g_runematch_fixedspawns)
{
remove(self);
return;
if(r == CURSE_EMPATHY)
_color = '179 0 204';//'128 0 255';
- return _color * (1 / 255) * cvar("g_runematch_rune_color_strength");
+ return _color * (1 / 255) * autocvar_g_runematch_rune_color_strength;
}
void rune_respawn();
self.solid = SOLID_TRIGGER;
self.touch = rune_touch;
self.think = rune_respawn;
- self.nextthink = time + cvar("g_runematch_shuffletime");//30 + random()*5; // fixme: cvar
+ self.nextthink = time + autocvar_g_runematch_shuffletime;//30 + random()*5; // fixme: cvar
}
else
{
e.solid = SOLID_TRIGGER;
// reposition itself if not picked up soon
e.think = rune_respawn;
- e.nextthink = time + cvar("g_runematch_respawntime");//15 + random()*5; // fixme: cvar
+ e.nextthink = time + autocvar_g_runematch_respawntime;//15 + random()*5; // fixme: cvar
e.touch = rune_touch;
pl.runes = pl.runes - (pl.runes & (e.runes | e.enemy.runes));
curse = find(curse, classname, "curse");
}
- numtodrop = cvar("g_runematch_drop_runes_max");
- prevent_same = !cvar("g_runematch_allow_same");
+ numtodrop = autocvar_g_runematch_drop_runes_max;
+ prevent_same = !autocvar_g_runematch_allow_same;
rune = curse = world;
do
runes_used = 0;
curses_used = 0;
- prevent_same = !cvar("g_runematch_allow_same");
+ prevent_same = !autocvar_g_runematch_allow_same;
numrunes = RUNE_COUNT;
while(numrunes > 0)
e.colormod = RuneColormod(rn);
e.enemy.colormod = RuneColormod(cs);
- e.alpha = e.enemy.alpha = cvar("g_runematch_rune_alpha");//0.78;
- e.effects = e.enemy.effects = cvar("g_runematch_rune_effects") | EF_LOWPRECISION;//EF_ADDITIVE;// | EF_FULLBRIGHT;
+ e.alpha = e.enemy.alpha = autocvar_g_runematch_rune_alpha;//0.78;
+ e.effects = e.enemy.effects = autocvar_g_runematch_rune_effects | EF_LOWPRECISION;//EF_ADDITIVE;// | EF_FULLBRIGHT;
//e.glow_size = e.enemy.glow_size = cvar("g_runematch_rune_glow_size");
//e.glow_color = e.enemy.glow_color = cvar("g_runematch_rune_glow_color");
{
entity rune;
- if(!g_runematch || !cvar("g_runematch_pointamt"))
+ if(!g_runematch || !autocvar_g_runematch_pointamt)
return;
if(gameover)
if(runematch_point_time > time)
return;
- runematch_point_time = time + cvar("g_runematch_pointrate");
+ runematch_point_time = time + autocvar_g_runematch_pointrate;
rune = world;
do
if(rune.owner.classname == "player")
{
- UpdateFrags(rune.owner, cvar("g_runematch_pointamt"));
+ UpdateFrags(rune.owner, autocvar_g_runematch_pointamt);
}
}while(rune);
}
}
if(!arunes && !trunes)
- return f - 1 + cvar("g_runematch_frags_norune"); // don't give points to players when no runes are involved.
+ return f - 1 + autocvar_g_runematch_frags_norune; // don't give points to players when no runes are involved.
if(arunes)
{ // got a kill while holding runes
- newfrags = newfrags + cvar("g_runematch_frags_killedby_runeholder");//5;
+ newfrags = newfrags + autocvar_g_runematch_frags_killedby_runeholder;//5;
}
if(trunes)
{ // killed an enemy holding runes
- newfrags = newfrags + cvar("g_runematch_frags_killed_runeholder");//5;
+ newfrags = newfrags + autocvar_g_runematch_frags_killed_runeholder;//5;
}
if(newfrags)
f = f - 1 + newfrags;
Net_LinkEntity(ts, FALSE, 0, TeamScore_SendEntity);
teamscorekeepers[t - 1] = ts;
++teamscores_entities_count;
+ PlayerStats_AddTeam(t);
}
float TeamScore_AddToTeam(float t, float scorefield, float score)
scores_primary = scores[i];
scores_flags_primary = scoreflags;
}
+ if(label != "")
+ {
+ PlayerStats_AddEvent(strcat(PLAYERSTATS_TOTAL, label));
+ PlayerStats_AddEvent(strcat(PLAYERSTATS_SCOREBOARD, label));
+ }
}
void ScoreInfo_SetLabel_TeamScore(float i, string label, float scoreflags)
if(teamscores_entities_count)
return;
+
if(g_lms) return;
if(g_arena || g_ca) return;
if(g_race && !g_race_qualifying) return;
if(score)
if(scores_label[scorefield] != "")
s.SendFlags |= pow(2, scorefield);
+ PlayerStats_Event(s.owner, strcat(PLAYERSTATS_TOTAL, scores_label[scorefield]), score);
+ s.(scores_accumulated[scorefield]) += score;
return (s.(scores[scorefield]) += score);
}
entity winnerscorekeeper;
entity secondscorekeeper;
entity sk;
+ float slots;
+
+ // format:
+ // gametype:P<pure>:S<slots>::plabel,plabel:tlabel,tlabel:teamid:tscore,tscore:teamid:tscore,tscore
+ // score labels always start with a symbol or with lower case
+ // so to match pure, match for :P0:
+ // to match full, match for :S0:
s = GetGametype();
- s = strcat(s, ":", cvar_string("g_xonoticversion"));
+ s = strcat(s, ":", autocvar_g_xonoticversion);
s = strcat(s, ":P", ftos(cvar_purechanges_count));
+ s = strcat(s, ":S", ftos(nJoinAllowed(0)));
s = strcat(s, "::", GetPlayerScoreString(world, 1)); // make this 1 once we can, note: this doesn't contain any :<letter>
- fullstatus = cvar("g_full_getstatus_responses");
+ fullstatus = autocvar_g_full_getstatus_responses;
if(teamscores_entities_count)
{
}
}
+void PlayerScore_PlayerStats(entity p)
+{
+ entity s;
+ float i;
+ s = p.scorekeeper;
+
+ for(i = 0; i < MAX_SCORE; ++i)
+ if(s.(scores[i]) != 0)
+ if(scores_label[i] != "")
+ PlayerStats_Event(s.owner, strcat(PLAYERSTATS_SCOREBOARD, scores_label[i]), s.(scores[i]));
+}
+
+void PlayerScore_TeamStats(void)
+{
+ entity sk;
+ float t, i;
+ for(t = 0; t < 16; ++t)
+ {
+ sk = teamscorekeepers[t];
+ if(!sk)
+ continue;
+ for(i = 0; i < MAX_TEAMSCORE; ++i)
+ if(sk.(teamscores[i]) != 0)
+ if(teamscores_label[i] != "")
+ PlayerStats_TeamScore(t, strcat(PLAYERSTATS_SCOREBOARD, teamscores_label[i]), sk.(teamscores[i]));
+ }
+}
.float scores[MAX_SCORE];
.float teamscores[MAX_TEAMSCORE];
+.float scores_accumulated[MAX_SCORE]; // for player stats only
+
/**
* Attaches a PlayerScore entity to a player. Use that in ClientConnect.
* Remember to detach it in ClientDisconnect!
}
void ScoreRules_generic()
{
- CheckAllowedTeams(world);
if(teams_matter)
{
CheckAllowedTeams(world);
{
float sp_domticks, sp_score;
sp_score = sp_domticks = 0;
- if(cvar("g_domination_disable_frags"))
+ if(autocvar_g_domination_disable_frags)
sp_domticks = SFL_SORT_PRIO_PRIMARY;
else
sp_score = SFL_SORT_PRIO_PRIMARY;
ScoreInfo_SetLabel_PlayerScore(SP_NEXBALL_FAULTS, "faults", SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER);
ScoreRules_basics_end();
}
+
+// Keep Away stuff
+#define SP_KEEPAWAY_PICKUPS 4
+#define SP_KEEPAWAY_CARRIERKILLS 5
+#define SP_KEEPAWAY_BCTIME 6
+void ScoreRules_keepaway()
+{
+ ScoreRules_basics(0, SFL_SORT_PRIO_PRIMARY, 0, TRUE); // SFL_SORT_PRIO_PRIMARY
+ ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_PICKUPS, "pickups", 0);
+ ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_CARRIERKILLS, "bckills", 0);
+ ScoreInfo_SetLabel_PlayerScore(SP_KEEPAWAY_BCTIME, "bctime", SFL_SORT_PRIO_SECONDARY);
+ ScoreRules_basics_end();
+}
+
+// FreezeTag stuff
+#define SP_FREEZETAG_REVIVALS 4
+void ScoreRules_freezetag()
+{
+ CheckAllowedTeams(world);
+ ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY
+ ScoreInfo_SetLabel_PlayerScore(SP_FREEZETAG_REVIVALS, "revivals", 0);
+ ScoreRules_basics_end();
+}
void CreatureFrame (void)
{
local entity oldself;
- local float dm, maxspeed;
+ local float dm;
oldself = self;
self = findfloat(world, iscreature, TRUE);
while (self)
}
if (self.dmgtime < time)
{
- self.dmgtime = time + 0.1;
+ self.dmgtime = time + 0.2;
if (self.watertype == CONTENT_LAVA)
{
if (self.watersound_finished < time)
self.dmg = 2;
}
// check for falling damage
- if(!self.hook.state && !g_ca && !(g_cts && !cvar("g_cts_selfdamage")))
+ float velocity_len = vlen(self.velocity);
+ if(!self.hook.state && !g_ca && !(g_cts && !autocvar_g_cts_selfdamage))
{
- dm = vlen(self.oldvelocity) - vlen(self.velocity); // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
+ dm = vlen(self.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
if (self.deadflag)
- dm = (dm - cvar("g_balance_falldamage_deadminspeed")) * cvar("g_balance_falldamage_factor");
+ dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
else
- dm = min((dm - cvar("g_balance_falldamage_minspeed")) * cvar("g_balance_falldamage_factor"), cvar("g_balance_falldamage_maxdamage"));
+ dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
if (dm > 0)
Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0');
}
- maxspeed = cvar("g_maxspeed");
- if(maxspeed > 0 && vlen(self.velocity) > maxspeed)
+ if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');
// play stupid sounds
if (g_footsteps)
if (!gameover)
if (self.flags & FL_ONGROUND)
- if (vlen(self.velocity) > sv_maxspeed * 0.6)
+ if (velocity_len > autocvar_sv_maxspeed * 0.6)
if (!self.deadflag)
if (time < self.lastground + 0.2)
{
WarpZone_StartFrame();
- sv_gravity = cvar("sv_gravity");
- sv_maxairspeed = cvar("sv_maxairspeed");
- sv_maxspeed = cvar ("sv_maxspeed");
- sv_friction = cvar ("sv_friction");
- sv_accelerate = cvar ("sv_accelerate");
- sv_airaccelerate = cvar("sv_airaccelerate");
- sv_airaccel_sideways_friction = cvar("sv_airaccel_sideways_friction");
- sv_airaccel_qw = cvar("sv_airaccel_qw");
- sv_stopspeed = cvar ("sv_stopspeed");
- sv_airstopaccelerate = cvar("sv_airstopaccelerate");
- sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate");
- sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");
- sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw");
- sv_aircontrol = cvar("sv_aircontrol");
- sv_aircontrol_penalty = cvar("sv_aircontrol_penalty");
- sv_aircontrol_power = cvar("sv_aircontrol_power");
- sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");
- sv_warsowbunny_accel = cvar("sv_warsowbunny_accel");
- sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed");
- sv_warsowbunny_turnaccel = cvar("sv_warsowbunny_turnaccel");
- sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio");
- sv_airspeedlimit_nonqw = cvar("sv_airspeedlimit_nonqw");
- teamplay = cvar ("teamplay");
- sys_frametime = cvar("sys_ticrate") * cvar("slowmo");
- sv_doublejump = cvar("sv_doublejump");
+ sys_frametime = autocvar_sys_ticrate * autocvar_slowmo;
+ if(sys_frametime <= 0)
+ sys_frametime = 1.0 / 60.0; // somewhat safe fallback
if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2)
- orig_slowmo = cvar("slowmo"); // slowmo will be restored after the timeout
+ orig_slowmo = autocvar_slowmo; // slowmo will be restored after the timeout
- if(teams_matter && !teamplay)
- teamplay = 3;
- if(!teams_matter && teamplay)
- teamplay = 0;
-
- skill = cvar("skill");
+ skill = autocvar_skill;
Spawnqueue_Check();
if(game_delay_last == TRUE)
if(game_delay == FALSE)
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(":startdelay_ended");
game_delay_last = game_delay;
// if in warmup stage and limit for warmup is hit start match
if (inWarmupStage)
if ((g_warmup_limit > 0 && time >= g_warmup_limit)
- || (g_warmup_limit == 0 && cvar("timelimit") != 0 && time >= cvar("timelimit") * 60))
+ || (g_warmup_limit == 0 && autocvar_timelimit != 0 && time >= autocvar_timelimit * 60))
{
ReadyRestart();
return;
RuneMatchGivePoints();
bot_serverframe();
- if(cvar("spawn_debugview"))
+ if(autocvar_spawn_debugview)
{
RandomSelection_Init();
for(self = world; (self = find(self, classname, "player")); )
.float anglejitter;
.string gametypefilter;
.string cvarfilter;
+float DoesQ3ARemoveThisEntity();
void SV_OnEntityPreSpawnFunction()
{
if(self.gametypefilter != "")
- if not(isGametypeInFilter(game, teams_matter, self.gametypefilter))
+ if not(isGametypeInFilter(game, teams_matter, have_team_spawns, self.gametypefilter))
{
remove(self);
return;
}
}
+ if(DoesQ3ARemoveThisEntity())
+ {
+ remove(self);
+ return;
+ }
+
// support special -1 and -2 angle from radiant
if (self.angles == '0 -1 0')
self.angles = '-90 0 0';
{
if(g_ghost_items)
{
- self.colormod = stov(cvar_string("g_ghost_items_color"));
+ self.colormod = stov(autocvar_g_ghost_items_color);
self.glowmod = self.colormod;
self.alpha = g_ghost_items;
return TRUE;
// make the item translucent green and not touchable
e.model = e.mdl;
e.solid = SOLID_NOT;
- e.colormod = stov(cvar_string("g_ghost_items_color"));
+ e.colormod = stov(autocvar_g_ghost_items_color);
e.glowmod = e.colormod;
e.alpha = g_ghost_items;
e.customizeentityforclient = func_null;
// hide the item completely
e.model = string_null;
e.solid = SOLID_NOT;
- e.colormod = stov(cvar_string("g_ghost_items_color"));
+ e.colormod = stov(autocvar_g_ghost_items_color);
e.glowmod = e.colormod;
e.alpha = 0;
e.customizeentityforclient = func_null;
if (e.strength_finished || e.invincible_finished)
e.effects |= EF_ADDITIVE | EF_FULLBRIGHT;
- if (cvar("g_nodepthtestitems"))
+ if (autocvar_g_nodepthtestitems)
e.effects |= EF_NODEPTHTEST;
- if (cvar("g_fullbrightitems"))
+ if (autocvar_g_fullbrightitems)
e.effects |= EF_FULLBRIGHT;
// relink entity (because solid may have changed)
if (player.ammo_fuel < g_pickup_fuel_max)
{
pickedup = TRUE;
- player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
- player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + cvar("g_balance_pause_fuel_rot"));
+ player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
+ player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
}
if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
{
if (item.weapons & WEPBIT_MINSTANEX)
W_GiveWeapon (player, WEP_MINSTANEX, item.netname);
if (item.ammo_cells)
- player.ammo_cells = min (player.ammo_cells + cvar("g_minstagib_ammo_drop"), 999);
+ player.ammo_cells = bound(player.ammo_cells, 999, player.ammo_cells + autocvar_g_minstagib_ammo_drop);
player.health = 100;
}
pickedup = TRUE;
// sound not available
// AnnounceTo(player, "_lives");
- player.armorvalue = min(player.armorvalue + cvar("g_minstagib_extralives"), 999);
+ player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives);
sprint(player, "^3You picked up some extra lives\n");
}
pickedup = TRUE;
// sound not available
// AnnounceTo(player, "invisible");
- player.strength_finished = max(player.strength_finished, time) + cvar("g_balance_powerup_strength_time");
+ player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
}
// speed powerup
pickedup = TRUE;
// sound not available
// AnnounceTo(player, "speed");
- player.invincible_finished = max(player.invincible_finished, time) + cvar("g_balance_powerup_strength_time");
- }
-
- if (item.ammo_fuel)
- if (player.ammo_fuel < g_pickup_fuel_max)
- {
- pickedup = TRUE;
- player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
- player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + cvar("g_balance_pause_fuel_rot"));
+ player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_strength_time;
}
}
}
if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway)
{
pickedup = TRUE;
- player.ammo_shells = min (player.ammo_shells + item.ammo_shells, g_pickup_shells_max);
+ player.ammo_shells = bound(player.ammo_shells, g_pickup_shells_max, player.ammo_shells + item.ammo_shells);
}
if (item.ammo_nails)
if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway)
{
pickedup = TRUE;
- player.ammo_nails = min (player.ammo_nails + item.ammo_nails, g_pickup_nails_max);
+ player.ammo_nails = bound(player.ammo_nails, g_pickup_nails_max, player.ammo_nails + item.ammo_nails);
}
if (item.ammo_rockets)
if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway)
{
pickedup = TRUE;
- player.ammo_rockets = min (player.ammo_rockets + item.ammo_rockets, g_pickup_rockets_max);
+ player.ammo_rockets = bound(player.ammo_rockets, g_pickup_rockets_max, player.ammo_rockets + item.ammo_rockets);
}
if (item.ammo_cells)
if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway)
{
pickedup = TRUE;
- player.ammo_cells = min (player.ammo_cells + item.ammo_cells, g_pickup_cells_max);
+ player.ammo_cells = bound(player.ammo_cells, g_pickup_cells_max, player.ammo_cells + item.ammo_cells);
}
if (item.ammo_fuel)
if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway)
{
pickedup = TRUE;
- player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
- player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + cvar("g_balance_pause_fuel_rot"));
+ player.ammo_fuel = bound(player.ammo_fuel, g_pickup_fuel_max, player.ammo_fuel + item.ammo_fuel);
+ player.pauserotfuel_finished = max(player.pauserotfuel_finished, time + autocvar_g_balance_pause_fuel_rot);
}
}
if (item.strength_finished)
{
pickedup = TRUE;
- player.strength_finished = max(player.strength_finished, time) + cvar("g_balance_powerup_strength_time");
+ player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
}
if (item.invincible_finished)
{
pickedup = TRUE;
- player.invincible_finished = max(player.invincible_finished, time) + cvar("g_balance_powerup_invincible_time");
+ player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
}
if (item.health)
if ((player.health < item.max_health) || item.pickup_anyway)
{
pickedup = TRUE;
- player.health = min(player.health + item.health, item.max_health);
- player.pauserothealth_finished = max(player.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
+ player.health = bound(player.health, item.max_health, player.health + item.health);
+ player.pauserothealth_finished = max(player.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
}
if (item.armorvalue)
if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway)
{
pickedup = TRUE;
- player.armorvalue = min(player.armorvalue + item.armorvalue, item.max_armorvalue);
- player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + cvar("g_balance_pause_armor_rot"));
+ player.armorvalue = bound(player.armorvalue, item.max_armorvalue, player.armorvalue + item.armorvalue);
+ player.pauserotarmor_finished = max(player.pauserotarmor_finished, time + autocvar_g_balance_pause_armor_rot);
}
}
}
// If custom weapon priorities for bots is enabled rate most wanted weapons higher
if( bot_custom_weapon && c )
{
- for(i = WEP_FIRST; i < WEP_LAST ; ++i)
+ for(i = WEP_FIRST; i <= WEP_LAST ; ++i)
{
// Find weapon
if( (get_weaponinfo(i)).weapons & item.weapons != item.weapons )
c = 0;
// Detect needed ammo
- for(i = WEP_FIRST; i < WEP_LAST ; ++i)
+ for(i = WEP_FIRST; i <= WEP_LAST ; ++i)
{
wi = get_weaponinfo(i);
waypoint_spawnforitem(self);
}
- if(teams_matter)
- {
- if(self.notteam)
- {
- print("removed non-teamplay ", self.classname, "\n");
- startitem_failed = TRUE;
- remove (self);
- return;
- }
- }
- else
- {
- if(self.notfree)
- {
- print("removed non-FFA ", self.classname, "\n");
- startitem_failed = TRUE;
- remove (self);
- return;
- }
- }
-
- if(self.notq3a)
- {
- // We aren't TA or something like that, so we keep the Q3A entities
- print("removed non-Q3A ", self.classname, "\n");
- startitem_failed = TRUE;
- remove (self);
- return;
- }
-
/*
* can't do it that way, as it would break maps
* TODO make a target_give like entity another way, that perhaps has
}
*/
- if(cvar("spawn_debug") >= 2)
+ if(autocvar_spawn_debug >= 2)
{
entity otheritem;
for(otheritem = findradius(self.origin, 3); otheritem; otheritem = otheritem.chain)
return;
}
}
- else if (!cvar("g_pickup_items") && itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
+ else if (!autocvar_g_pickup_items && itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
{
startitem_failed = TRUE;
remove (self);
}
void spawnfunc_item_health_mega (void) {
- if(!cvar("g_powerup_superhealth"))
+ if(!autocvar_g_powerup_superhealth)
return;
- if((g_arena || g_ca) && !cvar("g_arena_powerups"))
+ if((g_arena || g_ca) && !autocvar_g_arena_powerups)
return;
if(g_minstagib) {
void spawnfunc_item_health100() { spawnfunc_item_health_mega(); }
void spawnfunc_item_strength (void) {
- if(!cvar("g_powerup_strength"))
+ if(!autocvar_g_powerup_strength)
return;
- if((g_arena || g_ca) && !cvar("g_arena_powerups"))
+ if((g_arena || g_ca) && !autocvar_g_arena_powerups)
return;
if(g_minstagib) {
}
void spawnfunc_item_invincible (void) {
- if(!cvar("g_powerup_shield"))
+ if(!autocvar_g_powerup_shield)
return;
- if((g_arena || g_ca) && !cvar("g_arena_powerups"))
+ if((g_arena || g_ca) && !autocvar_g_arena_powerups)
return;
if(g_minstagib) {
self.use = target_items_use;
if(!self.strength_finished)
- self.strength_finished = cvar("g_balance_powerup_strength_time");
+ self.strength_finished = autocvar_g_balance_powerup_strength_time;
if(!self.invincible_finished)
- self.invincible_finished = cvar("g_balance_powerup_invincible_time");
+ self.invincible_finished = autocvar_g_balance_powerup_invincible_time;
precache_sound("misc/itempickup.wav");
precache_sound("misc/megahealth.wav");
POSTGIVE_VALUE(e, ammo_cells, 0, "misc/itempickup.wav", string_null);
POSTGIVE_VALUE(e, ammo_shells, 0, "misc/itempickup.wav", string_null);
POSTGIVE_VALUE(e, ammo_rockets, 0, "misc/itempickup.wav", string_null);
- POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, cvar("g_balance_pause_fuel_rot"), pauseregen_finished, cvar("g_balance_pause_fuel_regen"), "misc/itempickup.wav", string_null);
- POSTGIVE_VALUE_ROT(e, armorvalue, 1, pauserotarmor_finished, cvar("g_balance_pause_armor_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), "misc/armor25.wav", string_null);
- POSTGIVE_VALUE_ROT(e, health, 1, pauserothealth_finished, cvar("g_balance_pause_health_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), "misc/megahealth.wav", string_null);
+ POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, "misc/itempickup.wav", string_null);
+ POSTGIVE_VALUE_ROT(e, armorvalue, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, "misc/armor25.wav", string_null);
+ POSTGIVE_VALUE_ROT(e, health, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, "misc/megahealth.wav", string_null);
if (g_minstagib)
{
torg = tgt.origin + (tgt.mins + tgt.maxs) * 0.5;
- grav = cvar("sv_gravity");
+ grav = autocvar_sv_gravity;
zdist = torg_z - org_z;
sdist = vlen(torg - org - zdist * '0 0 1');
void trigger_push_touch()
{
- if (self.active == ACTIVE_NOT)
- return;
-
+ if (self.active == ACTIVE_NOT)
+ return;
+
// FIXME: add a .float for whether an entity should be tossed by jumppads
if (!other.iscreature)
if (other.classname != "corpse")
if (other.classname != "gib")
if (other.classname != "casing")
if (other.classname != "droppedweapon")
+ if (other.classname != "keepawayball")
if (!other.projectiledeathtype || other.classname == "bullet")
return;
}
local float ct;
ct = clienttype(other);
- if( ct == CLIENTTYPE_REAL)
+ if( ct == CLIENTTYPE_REAL || ct == CLIENTTYPE_BOT)
{
local float i;
local float found;
other.jumppadcount = other.jumppadcount + 1;
}
- if(self.message)
- centerprint(other, self.message);
+ if(ct == CLIENTTYPE_REAL)
+ {
+ if(self.message)
+ centerprint(other, self.message);
+ }
+ else
+ other.lastteleporttime = time;
}
- else if(ct == CLIENTTYPE_BOT)
- other.lastteleporttime = time;
else
other.jumppadcount = TRUE;
*/
void spawnfunc_trigger_push()
{
- if (self.angles != '0 0 0')
- SetMovedir ();
+ SetMovedir ();
EXACTTRIGGER_INIT;
-
- self.active = ACTIVE_ACTIVE;
+
+ self.active = ACTIVE_ACTIVE;
self.use = trigger_push_use;
self.touch = trigger_push_touch;
void() train_next;
void train_wait()
{
- self.think = train_next;
- self.nextthink = self.ltime + self.wait;
-
if(self.noise != "")
stopsoundto(MSG_BROADCAST, self, CHAN_TRIGGER); // send this as unreliable only, as the train will resume operation shortly anyway
+
+ if(self.wait < 0)
+ {
+ train_next();
+ }
+ else
+ {
+ self.think = train_next;
+ self.nextthink = self.ltime + self.wait;
+ }
+
+ entity oldself;
+ oldself = self;
+ self = self.enemy;
+ SUB_UseTargets();
+ self = oldself;
+ self.enemy = world;
};
void train_next()
{
local entity targ;
targ = find(world, targetname, self.target);
+ self.enemy = targ;
self.target = targ.target;
if (!self.target)
objerror("train_next: no next target");
self.wait = targ.wait;
if (!self.wait)
self.wait = 0.1;
- if(self.wait < 0)
- {
- if (targ.speed)
- SUB_CalcMove(targ.origin - self.mins, targ.speed, train_next);
- else
- SUB_CalcMove(targ.origin - self.mins, self.speed, train_next);
- }
+
+ if (targ.speed)
+ SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait);
else
- {
- if (targ.speed)
- SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait);
- else
- SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
- }
+ SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
if(self.noise != "")
sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
self.blocked = generic_plat_blocked;
+ self.avelocity_z = 0.0000001;
if not(InitMovingBrushTrigger())
return;
if(!self.freq)
{
// find pendulum length (same formula as Q3A)
- self.freq = 1 / (M_PI * 2) * sqrt(cvar("sv_gravity") / (3 * max(8, fabs(self.mins_z))));
+ self.freq = 1 / (M_PI * 2) * sqrt(autocvar_sv_gravity / (3 * max(8, fabs(self.mins_z))));
}
// copy initial angle
self.angles = '0 0 0';
self.max_health = self.health;
+ self.avelocity = self.movedir;
if not(InitMovingBrushTrigger())
return;
+ self.velocity = '0 0 0';
//self.effects |= EF_LOWPRECISION;
self.classname = "door_rotating";
void spawnfunc_ammo_cells() { spawnfunc_item_rockets(); }
// Rail -> Rifle
-void spawnfunc_weapon_railgun() { spawnfunc_weapon_campingrifle(); }
+void spawnfunc_weapon_railgun() { spawnfunc_weapon_sniperrifle(); }
void spawnfunc_ammo_slugs() { spawnfunc_item_bullets(); }
// BFG -> Crylink
for(targ = world; (targ = find(targ, targetname, trigger.target)); )
if (targ.classname == "target_init" || targ.classname == "target_give" || targ.classname == "target_items")
{
- targ.wait = -2;
+ trigger.wait = 0;
+ trigger.delay = 0;
+ targ.wait = 0;
targ.delay = 0;
- setsize(targ, trigger.mins, trigger.maxs);
- setorigin(targ, trigger.origin);
+ //setsize(targ, trigger.mins, trigger.maxs);
+ //setorigin(targ, trigger.origin);
//remove(trigger);
}
}
void spawnfunc_target_init()
{
self.spawnflags = 0; // remove all weapons except the ones listed below
- self.netname = "laser uzi"; // keep these weapons through the remove trigger
+ self.netname = "shotgun"; // keep these weapons through the remove trigger
spawnfunc_target_items();
InitializeEntity(self, target_init_verify, INITPRIO_FINDTARGET);
}
entity targ;
for (targ = world; (targ = find(targ, targetname, self.target)); ) {
if (targ.classname == "weapon_rocketlauncher") {
- self.ammo_rockets += targ.count * cvar("g_balance_rocketlauncher_ammo");
+ self.ammo_rockets += targ.count * autocvar_g_balance_rocketlauncher_ammo;
self.netname = "rocketlauncher";
}
else if (targ.classname == "weapon_plasmagun") {
- self.ammo_rockets += targ.count * cvar("g_balance_hagar_primary_ammo");
+ self.ammo_rockets += targ.count * autocvar_g_balance_hagar_primary_ammo;
if(self.netname == "")
self.netname = "hagar";
else
self.netname = strcat(self.netname, " hagar");
}
else if (targ.classname == "weapon_bfg") {
- self.ammo_cells += targ.count * cvar("g_balance_crylink_primary_ammo");
+ self.ammo_cells += targ.count * autocvar_g_balance_crylink_primary_ammo;
if(self.netname == "")
self.netname = "crylink";
else
self.netname = strcat(self.netname, " crylink");
}
else if (targ.classname == "weapon_grenadelauncher") {
- self.ammo_rockets += targ.count * cvar("g_balance_grenadelauncher_primary_ammo");
+ self.ammo_rockets += targ.count * autocvar_g_balance_grenadelauncher_primary_ammo;
if(self.netname == "")
self.netname = "grenadelauncher";
else
self.armorvalue = 100;
else if (targ.classname == "item_health_mega")
self.health = 200;
- remove(targ);
+ //remove(targ); // removing ents in init functions causes havoc, workaround:
+ targ.think = SUB_Remove;
+ targ.nextthink = time;
}
self.spawnflags = 2;
spawnfunc_target_items();
void spawnfunc_team_CTF_bluespawn() { spawnfunc_info_player_team2(); }
void spawnfunc_item_flight() { spawnfunc_item_jetpack(); }
+
+.float notteam;
+.float notsingle;
+.float notfree;
+.float notq3a;
+.float notta;
+.string gametype;
+float DoesQ3ARemoveThisEntity()
+{
+ // Q3 style filters (DO NOT USE, THIS IS COMPAT ONLY)
+
+ if(self.notq3a)
+ if(!teams_matter || g_tdm || g_ctf)
+ return 1;
+
+ if(self.notta)
+ if not(!teams_matter || g_tdm || g_ctf)
+ return 1;
+
+ if(self.notsingle)
+ if(maxclients == 1)
+ return 1;
+
+ if(self.notteam)
+ if(teams_matter)
+ return 1;
+
+ if(self.notfree)
+ if(!teams_matter)
+ return 1;
+
+ if(self.gametype)
+ {
+ string gametypename;
+ // static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester", "teamtournament"};
+ gametypename = "ffa";
+ if(teams_matter)
+ gametypename = "team";
+ if(g_arena)
+ gametypename = "tournament";
+ if(g_ctf)
+ gametypename = "ctf";
+ if(maxclients == 1)
+ gametypename = "single";
+ // we do not have the other types (oneflag, obelisk, harvester, teamtournament)
+ if(strstrofs(self.gametype, gametypename, 0) < 0)
+ return 1;
+ }
+
+ return 0;
+}
{
TDEATHLOOP(org)
{
- if not(teamplay && cvar("g_telefrags_teamplay") && head.team == player.team)
+ if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
if(head.classname == "player")
if(head.health >= 1)
return 1;
{
if (player.classname == "player" && player.health >= 1)
{
- if not(teamplay && cvar("g_telefrags_teamplay") && head.team == player.team)
+ if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
{
if(head.classname == "player")
if(head.health >= 1)
if(player.classname == "player")
{
if(tflags & TELEPORT_FLAG_TDEATH)
- if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && (cvar("g_telefrags") || (tflags & TELEPORT_FLAG_FORCE_TDEATH)))
+ if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && (autocvar_g_telefrags || (tflags & TELEPORT_FLAG_FORCE_TDEATH)))
tdeath(player, teleporter, telefragger, telefragmin, telefragmax);
// player no longer is on ground
if(teleporter.owner)
{
player.pusher = teleporter.owner;
- player.pushltime = time + cvar("g_maxpushtime");
+ player.pushltime = time + autocvar_g_maxpushtime;
}
else
{
for(e = world; (e = find(e, targetname, self.target)); )
{
p = 1;
- if(cvar("g_telefrags_avoid"))
+ if(autocvar_g_telefrags_avoid)
{
o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
if(check_tdeath(other, o, '0 0 0', '0 0 0'))
if(e.speed)
if(vlen(other.velocity) > e.speed)
other.velocity = normalize(other.velocity) * max(0, e.speed);
- if(cvar("g_teleport_maxspeed"))
- if(vlen(other.velocity) > cvar("g_teleport_maxspeed"))
- other.velocity = normalize(other.velocity) * max(0, cvar("g_teleport_maxspeed"));
+ if(autocvar_g_teleport_maxspeed)
+ if(vlen(other.velocity) > autocvar_g_teleport_maxspeed)
+ other.velocity = normalize(other.velocity) * max(0, autocvar_g_teleport_maxspeed);
o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
TeleportPlayer(self, other, o, e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER);
return 0; // no rebalancing whatsoever please
if(!teams_matter)
return 0;
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
return 0;
- if(cvar("bot_vs_human") && (c3==-1 && c4==-1))
+ if(autocvar_bot_vs_human && (c3==-1 && c4==-1))
return 0;
- if(!cvar("g_balance_teams_force"))
+ if(!autocvar_g_balance_teams_force)
return -1;
return 1;
}
void LogTeamchange(float player_id, float team_number, float type)
{
- if(!cvar("sv_eventlog"))
+ if(!autocvar_sv_eventlog)
return;
if(player_id < 1)
cvar_set("g_race", ftos(g_race));
cvar_set("g_nexball", ftos(g_nexball));
cvar_set("g_cts", ftos(g_cts));
+ cvar_set("g_freezetag", ftos(g_freezetag));
+ cvar_set("g_keepaway", ftos(g_keepaway));
}
void ReadGameCvars()
float i;
found = 0;
- prev = cvar("gamecfg");
+ prev = autocvar_gamecfg;
for(i = 0; i < 2; ++i)
{
+//#NO AUTOCVARS START
found += (g_dm = (!found && (prev != GAME_DEATHMATCH) && cvar("g_dm")));
found += (g_tdm = (!found && (prev != GAME_TEAM_DEATHMATCH) && cvar("g_tdm")));
found += (g_domination = (!found && (prev != GAME_DOMINATION) && cvar("g_domination")));
found += (g_race = (!found && (prev != GAME_RACE) && cvar("g_race")));
found += (g_nexball = (!found && (prev != GAME_NEXBALL) && cvar("g_nexball")));
found += (g_cts = (!found && (prev != GAME_CTS) && cvar("g_cts")));
+ found += (g_freezetag = (!found && (prev != GAME_FREEZETAG) && cvar("g_freezetag")));
+ found += (g_keepaway = (!found && (prev != GAME_KEEPAWAY) && cvar("g_keepaway")));
+//#NO AUTOCVARS END
if(found)
break;
if(!found)
g_dm = 1;
- if(g_dm && cvar("deathmatch_force_teamplay"))
+ if(g_dm && autocvar_deathmatch_force_teamplay)
{
g_dm = 0;
g_tdm = 1;
}
teams_matter = 0;
+ serverflags &~= SERVERFLAG_TEAMPLAY;
}
void default_delayedinit()
void ActivateTeamplay()
{
- float teamplay_default;
- teamplay_default = cvar("teamplay_default");
-
- if(teamplay_default)
- teamplay = teamplay_default;
- else
- teamplay = 3;
- cvar_set("teamplay", ftos(teamplay));
-
+ serverflags |= SERVERFLAG_TEAMPLAY;
teams_matter = 1;
}
VoteReset();
- teams_matter = 0;
- cvar_set("teamplay", "0");
-
// make sure only ONE type is selected
ReadGameCvars();
WriteGameCvars();
ReadGameCvars();
// set both here, gamemode can override it later
- timelimit_override = cvar("timelimit_override");
- fraglimit_override = cvar("fraglimit_override");
- leadlimit_override = cvar("leadlimit_override");
+ timelimit_override = autocvar_timelimit_override;
+ fraglimit_override = autocvar_fraglimit_override;
+ leadlimit_override = autocvar_leadlimit_override;
if(g_dm)
{
gamemode_name = "Team Deathmatch";
ActivateTeamplay();
tdm_init();
- if(cvar("g_tdm_team_spawns"))
+ if(autocvar_g_tdm_team_spawns)
have_team_spawns = -1; // request team spawns
}
game = GAME_DOMINATION;
gamemode_name = "Domination";
ActivateTeamplay();
- fraglimit_override = cvar("g_domination_point_limit");
- leadlimit_override = cvar("g_domination_point_leadlimit");
+ fraglimit_override = autocvar_g_domination_point_limit;
+ leadlimit_override = autocvar_g_domination_point_leadlimit;
dom_init();
have_team_spawns = -1; // request team spawns
}
game = GAME_CTF;
gamemode_name = "Capture the Flag";
ActivateTeamplay();
- if(cvar("g_campaign"))
- g_ctf_win_mode = 2;
- else
- g_ctf_win_mode = cvar("g_ctf_win_mode");
- g_ctf_ignore_frags = cvar("g_ctf_ignore_frags");
+ g_ctf_ignore_frags = autocvar_g_ctf_ignore_frags;
if(g_ctf_win_mode == 2)
{
- fraglimit_override = cvar("g_ctf_capture_limit");
- leadlimit_override = cvar("g_ctf_capture_leadlimit");
+ fraglimit_override = autocvar_g_ctf_capture_limit;
+ leadlimit_override = autocvar_g_ctf_capture_leadlimit;
}
else
{
- fraglimit_override = cvar("capturelimit_override");
- leadlimit_override = cvar("captureleadlimit_override");
+ fraglimit_override = autocvar_capturelimit_override;
+ leadlimit_override = autocvar_captureleadlimit_override;
}
ctf_init();
have_team_spawns = -1; // request team spawns
{
game = GAME_RUNEMATCH;
gamemode_name = "Rune Match";
- if(cvar("deathmatch_force_teamplay"))
+ if(autocvar_deathmatch_force_teamplay)
ActivateTeamplay();
- fraglimit_override = cvar("g_runematch_point_limit");
- leadlimit_override = cvar("g_runematch_point_leadlimit");
+ fraglimit_override = autocvar_g_runematch_point_limit;
+ leadlimit_override = autocvar_g_runematch_point_leadlimit;
runematch_init();
}
{
game = GAME_LMS;
gamemode_name = "Last Man Standing";
- fraglimit_override = cvar("g_lms_lives_override");
+ fraglimit_override = autocvar_g_lms_lives_override;
leadlimit_override = 0; // not supported by LMS
if(fraglimit_override == 0)
fraglimit_override = -1;
{
game = GAME_ARENA;
gamemode_name = "Arena";
- fraglimit_override = cvar("g_arena_point_limit");
- leadlimit_override = cvar("g_arena_point_leadlimit");
- maxspawned = cvar("g_arena_maxspawned");
+ fraglimit_override = autocvar_g_arena_point_limit;
+ leadlimit_override = autocvar_g_arena_point_leadlimit;
+ maxspawned = autocvar_g_arena_maxspawned;
if(maxspawned < 2)
maxspawned = 2;
- arena_roundbased = cvar("g_arena_roundbased");
+ arena_roundbased = autocvar_g_arena_roundbased;
}
if(g_ca)
game = GAME_CA;
gamemode_name = "Clan Arena";
ActivateTeamplay();
- fraglimit_override = cvar("g_ca_point_limit");
- leadlimit_override = cvar("g_ca_point_leadlimit");
+ fraglimit_override = autocvar_g_ca_point_limit;
+ leadlimit_override = autocvar_g_ca_point_leadlimit;
precache_sound("ctf/red_capture.wav");
precache_sound("ctf/blue_capture.wav");
}
game = GAME_KEYHUNT;
gamemode_name = "Key Hunt";
ActivateTeamplay();
- fraglimit_override = cvar("g_keyhunt_point_limit");
- leadlimit_override = cvar("g_keyhunt_point_leadlimit");
+ fraglimit_override = autocvar_g_keyhunt_point_limit;
+ leadlimit_override = autocvar_g_keyhunt_point_leadlimit;
MUTATOR_ADD(gamemode_keyhunt);
}
+ if(g_freezetag)
+ {
+ game = GAME_FREEZETAG;
+ gamemode_name = "Freeze Tag";
+ ActivateTeamplay();
+ fraglimit_override = autocvar_g_freezetag_point_limit;
+ leadlimit_override = autocvar_g_freezetag_point_leadlimit;
+ MUTATOR_ADD(gamemode_freezetag);
+ }
+
if(g_assault)
{
game = GAME_ASSAULT;
game = GAME_RACE;
gamemode_name = "Race";
- if(cvar("g_race_teams"))
+ if(autocvar_g_race_teams)
{
ActivateTeamplay();
- race_teams = bound(2, cvar("g_race_teams"), 4);
+ race_teams = bound(2, autocvar_g_race_teams, 4);
have_team_spawns = -1; // request team spawns
}
else
race_teams = 0;
- qualifying_override = cvar("g_race_qualifying_timelimit_override");
- fraglimit_override = cvar("g_race_laps_limit");
+ qualifying_override = autocvar_g_race_qualifying_timelimit_override;
+ fraglimit_override = autocvar_g_race_laps_limit;
leadlimit_override = 0; // currently not supported by race
}
{
game = GAME_NEXBALL;
gamemode_name = "Nexball";
- fraglimit_override = cvar("g_nexball_goallimit");
- leadlimit_override = cvar("g_nexball_goalleadlimit");
+ fraglimit_override = autocvar_g_nexball_goallimit;
+ leadlimit_override = autocvar_g_nexball_goalleadlimit;
ActivateTeamplay();
nb_init();
have_team_spawns = -1; // request team spawns
}
+ if(g_keepaway)
+ {
+ game = GAME_KEEPAWAY;
+ gamemode_name = "Keepaway";
+ MUTATOR_ADD(gamemode_keepaway);
+ }
+
if(teams_matter)
entcs_init();
cache_lastmutatormsg = strzone("");
// enforce the server's universal frag/time limits
- if(!cvar("g_campaign"))
+ if(!autocvar_g_campaign)
{
if(fraglimit_override >= 0)
cvar_set("fraglimit", ftos(fraglimit_override));
if(g_race)
{
// we need to find out the correct value for g_race_qualifying
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
{
g_race_qualifying = 1;
}
- else if(!cvar("g_campaign") && cvar("g_race_qualifying_timelimit") > 0)
+ else if(!autocvar_g_campaign && autocvar_g_race_qualifying_timelimit > 0)
{
g_race_qualifying = 2;
- race_fraglimit = cvar("fraglimit");
- race_leadlimit = cvar("leadlimit");
- race_timelimit = cvar("timelimit");
+ race_fraglimit = autocvar_fraglimit;
+ race_leadlimit = autocvar_leadlimit;
+ race_timelimit = autocvar_timelimit;
cvar_set("fraglimit", "0");
cvar_set("leadlimit", "0");
- cvar_set("timelimit", cvar_string("g_race_qualifying_timelimit"));
+ cvar_set("timelimit", ftos(autocvar_g_race_qualifying_timelimit));
}
else
g_race_qualifying = 0;
string GetClientVersionMessage() {
local string versionmsg;
if (self.version_mismatch) {
- if(self.version < cvar("gameversion")) {
+ if(self.version < autocvar_gameversion) {
versionmsg = "^3Your client version is outdated.\n\n\n### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###\n\n\nPlease update!!!^8";
} else {
versionmsg = "^3This server is using an outdated Xonotic version.\n\n\n ### THIS SERVER IS INCOMPATIBLE AND THUS YOU CANNOT JOIN ###.^8";
if(self.cvar_scr_centertime == 0) return;
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
{
if(self.classname == "player" && !self.BUTTON_INFO)
return;
}
else
{
- if((time - self.jointime) > cvar("welcome_message_time") && !self.BUTTON_INFO)
+ if((time - self.jointime) > autocvar_welcome_message_time && !self.BUTTON_INFO)
return;
}
self.welcomemessage_time = time + max(0.5, self.cvar_scr_centertime * 0.6);
}
- if(cvar("g_campaign"))
+ if(autocvar_g_campaign)
{
centerprint(pl, campaign_message);
return;
else
modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena");
}
- if(cvar("g_start_weapon_laser") == 0)
+ if(autocvar_g_start_weapon_laser == 0)
modifications = strcat(modifications, ", No start weapons");
- if(cvar("sv_gravity") < 800)
+ if(autocvar_sv_gravity < 800)
modifications = strcat(modifications, ", Low gravity");
- if(g_cloaked)
+ if(g_cloaked && !g_cts)
modifications = strcat(modifications, ", Cloaked");
if(g_grappling_hook)
modifications = strcat(modifications, ", Hook");
if(g_midair)
modifications = strcat(modifications, ", Midair");
if(g_pinata)
- modifications = strcat(modifications, ", Pinata");
- if(g_weapon_stay)
+ modifications = strcat(modifications, ", Piñata");
+ if(g_weapon_stay && !g_cts)
modifications = strcat(modifications, ", Weapons stay");
if(g_bloodloss > 0)
modifications = strcat(modifications, ", Bloodloss");
local string versionmessage;
versionmessage = GetClientVersionMessage();
- s = strcat(s, NEWLINES, "This is Xonotic ", cvar_string("g_xonoticversion"), "\n", versionmessage);
+ s = strcat(s, NEWLINES, "This is Xonotic ", autocvar_g_xonoticversion, "\n", versionmessage);
s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
if(modifications != "")
if (g_grappling_hook)
s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
- if(cache_lastmutatormsg != cvar_string("g_mutatormsg"))
+ if(cache_lastmutatormsg != autocvar_g_mutatormsg)
{
if(cache_lastmutatormsg)
strunzone(cache_lastmutatormsg);
if(cache_mutatormsg)
strunzone(cache_mutatormsg);
- cache_lastmutatormsg = strzone(cvar_string("g_mutatormsg"));
+ cache_lastmutatormsg = strzone(autocvar_g_mutatormsg);
cache_mutatormsg = strzone(cache_lastmutatormsg);
}
s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg);
}
- motd = cvar_string("sv_motd");
+ motd = autocvar_sv_motd;
if (motd != "") {
s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd));
}
c1 = c2 = c3 = c4 = -1;
cb1 = cb2 = cb3 = cb4 = 0;
- if(cvar("g_campaign") && for_whom && clienttype(for_whom) == CLIENTTYPE_REAL)
- {
- c1 = 0; // only allow RED team for player joining
- }
- else if(g_onslaught)
+ if(g_onslaught)
{
// onslaught is special
head = findchain(classname, "onslaught_generator");
// TODO: Balance quantity of bots across > 2 teams when bot_vs_human is set (and remove next line)
if(c3==-1 && c4==-1)
- if(cvar("bot_vs_human") && for_whom)
+ if(autocvar_bot_vs_human && for_whom)
{
- if(cvar("bot_vs_human") > 0)
+ if(autocvar_bot_vs_human > 0)
{
// bots are all blue
if(clienttype(for_whom) == CLIENTTYPE_BOT)
c1 = -1;
}
}
+
+ // if player has a forced team, ONLY allow that one
+ if(self.team_forced == COLOR_TEAM1 && c1 >= 0)
+ c2 = c3 = c4 = -1;
+ else if(self.team_forced == COLOR_TEAM2 && c2 >= 0)
+ c1 = c3 = c4 = -1;
+ else if(self.team_forced == COLOR_TEAM3 && c3 >= 0)
+ c1 = c2 = c4 = -1;
+ else if(self.team_forced == COLOR_TEAM4 && c4 >= 0)
+ c1 = c2 = c3 = -1;
}
float PlayerValue(entity p)
// FIXME: also find and memorize the lowest-scoring bot on each team (in case players must be shuffled around)
// also remember the lowest-scoring player
- FOR_EACH_PLAYER(head)
+ FOR_EACH_CLIENT(head)
{
+ float t;
+ if(head.classname == "player")
+ t = head.team;
+ else if(head.team_forced > 0)
+ t = head.team_forced; // reserve the spot
+ else
+ continue;
if(head != ignore)// && head.netname != "")
{
value = PlayerValue(head);
bvalue = value;
else
bvalue = 0;
- if(head.team == COLOR_TEAM1)
+ if(t == COLOR_TEAM1)
{
if(c1 >= 0)
{
cb1 = cb1 + bvalue;
}
}
- if(head.team == COLOR_TEAM2)
+ if(t == COLOR_TEAM2)
{
if(c2 >= 0)
{
cb2 = cb2 + bvalue;
}
}
- if(head.team == COLOR_TEAM3)
+ if(t == COLOR_TEAM3)
{
if(c3 >= 0)
{
cb3 = cb3 + bvalue;
}
}
- if(head.team == COLOR_TEAM4)
+ if(t == COLOR_TEAM4)
{
if(c4 >= 0)
{
}
}
}
+
+ // if the player who has a forced team has not joined yet, reserve the spot
+ if(autocvar_g_campaign)
+ {
+ switch(autocvar_g_campaign_forceteam)
+ {
+ case 1: if(c1 == cb1) ++c1; break;
+ case 2: if(c2 == cb2) ++c2; break;
+ case 3: if(c3 == cb3) ++c3; break;
+ case 4: if(c4 == cb4) ++c4; break;
+ }
+ }
}
// returns # of smallest team (1, 2, 3, 4)
if(c4 >= 0)
totalteams = totalteams + 1;
- if(cvar("bot_vs_human") && totalteams == 1)
+ if((autocvar_bot_vs_human || pl.team_forced > 0) && totalteams == 1)
totalteams += 1;
if(totalteams <= 1)
{
- if(cvar("g_campaign") && pl && clienttype(pl) == CLIENTTYPE_REAL)
+ if(autocvar_g_campaign && pl && clienttype(pl) == CLIENTTYPE_REAL)
return 1; // special case for campaign and player joining
else if(g_domination)
error("Too few teams available for domination\n");
error("Too few teams available for ctf\n");
else if(g_keyhunt)
error("Too few teams available for key hunt\n");
+ else if(g_freezetag)
+ error("Too few teams available for freeze tag\n");
else
error("Too few teams available for team deathmatch\n");
}
// find out what teams are available
CheckAllowedTeams(pl);
- // if we want the player in a certain team for campaign, force him there
- if(cvar("g_campaign"))
- if(clienttype(pl) == CLIENTTYPE_REAL) // only players, not bots
- {
- switch(cvar("g_campaign_forceteam"))
- {
- case 1:
- SetPlayerColors(pl, COLOR_TEAM1 - 1);
- LogTeamchange(pl.playerid, pl.team, 2);
- return COLOR_TEAM1;
- case 2:
- SetPlayerColors(pl, COLOR_TEAM2 - 1);
- LogTeamchange(pl.playerid, pl.team, 2);
- return COLOR_TEAM2;
- case 3:
- SetPlayerColors(pl, COLOR_TEAM3 - 1);
- LogTeamchange(pl.playerid, pl.team, 2);
- return COLOR_TEAM3;
- case 4:
- SetPlayerColors(pl, COLOR_TEAM4 - 1);
- LogTeamchange(pl.playerid, pl.team, 2);
- return COLOR_TEAM4;
- default:
- break;
- }
- }
-
// if we don't care what team he ends up on, put him on whatever team he entered as.
// if he's not on a valid team, then let other code put him on the smallest team
if(!forcebestteam)
return;
}
- if((cvar("g_campaign")) || (cvar("g_changeteam_banned") && self.wasplayer)) {
+ if((autocvar_g_campaign) || (autocvar_g_changeteam_banned && self.wasplayer)) {
sprint(self, "Team changes not allowed\n");
return; // changing teams is not allowed
}
- if(cvar("g_balance_teams_prevent_imbalance"))
+ if(autocvar_g_balance_teams_prevent_imbalance)
{
// only allow changing to a smaller or equal size team
{
float numteams;
- numteams = cvar("g_tdm_teams_override");
+ numteams = autocvar_g_tdm_teams_override;
if(numteams < 2)
- numteams = cvar("g_tdm_teams");
+ numteams = autocvar_g_tdm_teams;
numteams = bound(2, numteams, 4);
tdm_spawnteam("Red", COLOR_TEAM1-1);
vector turret_stdproc_aim_generic()
{
- vector pre_pos,prep;
- float distance,impact_time,i,mintime;
+ vector pre_pos, prep;
+ float distance, impact_time, i, mintime;
turret_tag_fire_update();
if(self.aim_flags & TFL_AIM_SIMPLE)
return real_origin(self.enemy);
- mintime = max(self.attack_finished_single - time,0) + sys_frametime ;
+ mintime = max(self.attack_finished_single - time,0) + sys_frametime;
// Baseline
pre_pos = real_origin(self.enemy);
vz = self.enemy.velocity_z;
for(i = 0; i < impact_time; i += sys_frametime)
{
- vz = vz - (sv_gravity * sys_frametime);
+ vz = vz - (autocvar_sv_gravity * sys_frametime);
prep_z = prep_z + vz * sys_frametime;
}
}
if not (self.tur_active)
return;
- if (teamplay != 0)
+ if (teams_matter)
if (self.team == attacker.team)
{
// This does not happen anymore. Re-enable if you fix that.
if(clienttype(attacker) == CLIENTTYPE_REAL)
sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
- if(cvar("g_friendlyfire"))
- damage = damage * cvar("g_friendlyfire");
+ if(autocvar_g_friendlyfire)
+ damage = damage * autocvar_g_friendlyfire;
else
return;
}
// thorw head slightly off aim when hit?
if (self.damage_flags & TFL_DMG_HEADSHAKE)
{
- //baseent.tur_aimoff_x += (random() * damage);
- //baseent.tur_aimoff_y += ((random()*0.75) * damage);
self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
}
if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
self.velocity = self.velocity + vforce;
- // FIXME: Better damage feedback
- // Start burning when we have 10% or less health left
- //if (self.health < (self.tur_health * 0.1))
- // self.effects = EF_FLAME;
-
+ // FIXME: Better damage feedback?
+
if (self.health <= 0)
{
self.event_damage = SUB_Null;
self.nextthink = time + self.ticrate;
// ONS uses somewhat backwards linking.
- if (teamplay)
+ if (teams_matter)
{
if not (g_onslaught)
if (self.target)
if (self.ammo < self.ammo_max)
self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
+ if (self.health < (self.tur_health * 0.5))
+ if(random() < 0.25)
+ te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
+
// Inactive turrets needs to run the think loop,
// So they can handle animation and wake up if need be.
if not (self.tur_active)
// g_turrets_targetscan_maxdelay forces a target re-scan at least this often
float do_target_scan;
- if((self.target_select_time + cvar("g_turrets_targetscan_maxdelay")) < time)
+ if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
do_target_scan = 1;
// Old target (if any) invalid?
}
// But never more often then g_turrets_targetscan_mindelay!
- if (self.target_select_time + cvar("g_turrets_targetscan_mindelay") > time)
+ if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
do_target_scan = 0;
if(do_target_scan)
return;
}
else
- self.lip = time + cvar("g_turrets_aimidle_delay"); // Keep track of the last time we had a target.
+ self.lip = time + autocvar_g_turrets_aimidle_delay; // Keep track of the last time we had a target.
// Predict?
if not(self.aim_flags & TFL_AIM_NO)
void turret_fire()
{
- if (cvar("g_turrets_nofire") != 0)
+ if (autocvar_g_turrets_nofire != 0)
return;
self.turret_firefunc();
self.nextthink = time + 1;
entity e;
- if (cvar("g_turrets_reloadcvars") == 1)
+ if (autocvar_g_turrets_reloadcvars == 1)
{
e = nextent(world);
while (e)
entity e, ee;
// Are turrets allowed?
- if (cvar("g_turrets") == 0)
+ if (autocvar_g_turrets == 0)
return 0;
{
e = spawn();
+ /*
setorigin(e,'0 0 0');
setmodel(e,"models/turrets/plasma.md3");
vector v;
//crash();
}
setmodel(e,"");
+ */
e.classname = "turret_manager";
e.think = turrets_manager_think;
load_unit_settings(self,self.cvar_basename, 0);
// Handle turret teams.
- if (cvar("g_assault") != 0)
+ if (autocvar_g_assault != 0)
{
if not (self.team)
self.team = 14; // Assume turrets are on the defending side if not explicitly set otehrwize
}
- else if not (teamplay)
+ else if not (teams_matter)
self.team = MAX_SHOT_DISTANCE; // Group all turrets into the same team, so they dont kill eachother.
else if(g_onslaught && self.targetname)
{
// Offsets & origins
if (!self.tur_shotorg) self.tur_shotorg = '50 0 50';
+// Gane hooks
+ if(MUTATOR_CALLHOOK(TurretSpawn))
+ return 0;
+
// End of default & sanety checks, start building the turret.
// Spawn extra bits
activator = ee;
self.use();
}
-
+
turret_stdproc_respawn();
return 1;
}
void turret_ewheel_loadcvars()
{
- ewheel_speed_fast = cvar("g_turrets_unit_ewheel_speed_fast");
- ewheel_speed_slow = cvar("g_turrets_unit_ewheel_speed_slow");
- ewheel_speed_slower = cvar("g_turrets_unit_ewheel_speed_slower");
- ewheel_speed_stop = cvar("g_turrets_unit_ewheel_speed_stop");
+ ewheel_speed_fast = autocvar_g_turrets_unit_ewheel_speed_fast;
+ ewheel_speed_slow = autocvar_g_turrets_unit_ewheel_speed_slow;
+ ewheel_speed_slower = autocvar_g_turrets_unit_ewheel_speed_slower;
+ ewheel_speed_stop = autocvar_g_turrets_unit_ewheel_speed_stop;
}
void turret_ewheel_projectile_explode()
{
entity e;
+ // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
+ if(self.movetype != MOVETYPE_WALK)
+ return;
+
self.velocity = '0 0 0';
self.enemy = world;
self.tur_head.frame = 1;
// Convert from dgr / sec to dgr / tic
- self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");
+ self.tur_head.aim_speed = autocvar_g_turrets_unit_ewheel_turnrate;
self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
if (!turret_tag_fire_update())
void turret_fusionreactor_dinit();
void turret_fusionreactor_fire();
-float turret_fusionreactor_firecheck()
-{
- if (self.enemy == world) return 0;
- if not (self.enemy.ammo_flags & TFL_AMMO_RECIVE) return 0;
- if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY) return 0;
- if (self.ammo < self.shot_dmg) return 0;
- if (self.enemy.ammo >= self.enemy.ammo_max) return 0;
- if (self.tur_dist_aimpos > self.target_range) return 0;
- if (self.tur_dist_aimpos < self.target_range_min) return 0;
-
- return 1;
-}
-
void turret_fusionreactor_fire()
{
vector fl_org;
self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
te_smallflash(fl_org);
- //te_lightning1(world,self.origin,self.enemy.origin);
}
void turret_fusionreactor_postthink()
{
- float f;
- f = self.ammo / self.ammo_max;
- self.tur_head.avelocity = '0 250 0' * f;
+ self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
}
+/*
void turret_fusionreactor_respawnhook()
{
self.tur_head.avelocity = '0 50 0';
}
+*/
+
+/**
+** Preforms pre-fire checks for fusionreactor
+**/
+float turret_fusionreactor_firecheck()
+{
+ if (self.attack_finished_single > time)
+ return 0;
+
+ if (self.enemy.deadflag != DEAD_NO)
+ return 0;
+
+ if (self.enemy == world)
+ return 0;
+
+ if (self.ammo < self.shot_dmg)
+ return 0;
+
+ if (self.enemy.ammo >= self.enemy.ammo_max)
+ return 0;
+
+ if (vlen(self.enemy.origin - self.origin) > self.target_range)
+ return 0;
+
+ if(self.team != self.enemy.team)
+ return 0;
+
+ if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY)
+ return 0;
+
+ return 1;
+}
void turret_fusionreactor_dinit()
{
self.shoot_flags = TFL_SHOOT_HITALLVALID;
self.aim_flags = TFL_AIM_NO;
self.track_flags = TFL_TRACK_NO;
- self.turret_respawnhook = turret_fusionreactor_respawnhook;
+ // self.turret_respawnhook = turret_fusionreactor_respawnhook;
if (turret_stdproc_init("fusreac_std",0,"models/turrets/base.md3","models/turrets/reactor.md3") == 0)
{
void turret_hellion_postthink()
{
- if (cvar("g_turrets_reloadcvars"))
+ if (autocvar_g_turrets_reloadcvars)
{
- if (!self.shot_speed_max) self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
- if (!self.shot_speed_gain) self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
+ if (!self.shot_speed_max) self.shot_speed_max = autocvar_g_turrets_unit_hellion_std_shot_speed_max;
+ if (!self.shot_speed_gain) self.shot_speed_gain = autocvar_g_turrets_unit_hellion_std_shot_speed_gain;
}
if (self.tur_head.frame != 0)
if (self.netname == "") self.netname = "Hellion Missile Turret";
if not (self.shot_speed_max)
- self.shot_speed_max = cvar("g_turrets_unit_hellion_std_shot_speed_max");
+ self.shot_speed_max = autocvar_g_turrets_unit_hellion_std_shot_speed_max;
if not (self.shot_speed_gain)
- self.shot_speed_gain = cvar("g_turrets_unit_hellion_std_shot_speed_gain");
+ self.shot_speed_gain = autocvar_g_turrets_unit_hellion_std_shot_speed_gain;
self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_FASTPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
self.aim_flags = TFL_AIM_SIMPLE;
missile.enemy = self.enemy;
missile.team = self.team;
missile.cnt = time + 30;
- missile.ticrate = max(cvar("sys_ticrate"),0.05);
+ missile.ticrate = max(autocvar_sys_ticrate,0.05);
CSQCProjectile(missile, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, fly sound
// Calculate new heading
olddir = normalize(self.velocity);
- newdir = normalize(olddir + wishdir * cvar("g_turrets_unit_hk_std_shot_speed_turnrate"));
+ newdir = normalize(olddir + wishdir * autocvar_g_turrets_unit_hk_std_shot_speed_turnrate);
// Set heading & speed
self.velocity = newdir * myspeed;
void turret_hk_postthink()
{
- if (cvar("g_turrets_reloadcvars"))
+ if (autocvar_g_turrets_reloadcvars)
{
- hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
- hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
- hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
- hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
- hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
+ hk_maxspeed = autocvar_g_turrets_unit_hk_std_shot_speed_max;
+ hk_minspeed = autocvar_g_turrets_unit_hk_std_shot_speed;
+ hk_accel = autocvar_g_turrets_unit_hk_std_shot_speed_accel;
+ hk_accel2 = autocvar_g_turrets_unit_hk_std_shot_speed_accel2;
+ hk_decel = autocvar_g_turrets_unit_hk_std_shot_speed_decel;
}
if (self.tur_head.frame != 0)
{
if (self.netname == "") self.netname = "Hunter-killer turret";
- hk_maxspeed = cvar("g_turrets_unit_hk_std_shot_speed_max");
- hk_minspeed = cvar("g_turrets_unit_hk_std_shot_speed");
- hk_accel = cvar("g_turrets_unit_hk_std_shot_speed_accel");
- hk_accel2 = cvar("g_turrets_unit_hk_std_shot_speed_accel2");
- hk_decel = cvar("g_turrets_unit_hk_std_shot_speed_decel");
+ hk_maxspeed = autocvar_g_turrets_unit_hk_std_shot_speed_max;
+ hk_minspeed = autocvar_g_turrets_unit_hk_std_shot_speed;
+ hk_accel = autocvar_g_turrets_unit_hk_std_shot_speed_accel;
+ hk_accel2 = autocvar_g_turrets_unit_hk_std_shot_speed_accel2;
+ hk_decel = autocvar_g_turrets_unit_hk_std_shot_speed_decel;
self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_RECIVETARGETS;
void turret_machinegun_attack()
{
sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
- fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
//w_deathtypestring = "had an alergic reaction due to 10 kilos of led";
self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL;
self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
- if not (cvar("g_antilag_bullets"))
+ if not (autocvar_g_antilag_bullets)
self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
if (turret_stdproc_init("machinegun_std",0,"models/turrets/base.md3","models/turrets/machinegun.md3") == 0)
entity beam;
beam = spawn();
- beam.ticrate = 0.1; //cvar("sys_ticrate");
+ beam.ticrate = 0.1; //autocvar_sys_ticrate;
setmodel(beam,"models/turrets/phaser_beam.md3");
beam.effects = EF_LOWPRECISION;
beam.solid = SOLID_NOT;
self.fireflag = 1;
beam.attack_finished_single = self.attack_finished_single;
- self.attack_finished_single = time; // + cvar("sys_ticrate");
+ self.attack_finished_single = time; // + autocvar_sys_ticrate;
setattachment(beam,self.tur_head,"tag_fire");
*/
void spawnfunc_turret_targettrigger()
{
- if (!cvar("g_turrets"))
+ if (!autocvar_g_turrets)
{
remove(self);
return;
void walker_loadcvars()
{
- walker_meele_dmg = cvar("g_turrets_unit_walker_std_meele_dmg");
- walker_meele_force = cvar("g_turrets_unit_walker_std_meele_force");
-
- walker_speed_stop = cvar("g_turrets_unit_walker_speed_stop");
- walker_speed_walk = cvar("g_turrets_unit_walker_speed_walk");
- walker_speed_run = cvar("g_turrets_unit_walker_speed_run");
- walker_speed_jump = cvar("g_turrets_unit_walker_speed_jump");
- walker_speed_roam = cvar("g_turrets_unit_walker_speed_roam");
- walker_speed_swim = cvar("g_turrets_unit_walker_speed_swim");
-
- walker_std_rocket_dmg = cvar("g_turrets_unit_walker_std_rocket_dmg");
- walker_std_rocket_radius = cvar("g_turrets_unit_walker_std_rocket_radius");
- walker_std_rocket_force = cvar("g_turrets_unit_walker_std_rocket_force");
- walker_std_rocket_speed = cvar("g_turrets_unit_walker_std_rocket_speed");
- walker_std_rocket_turnrate = cvar("g_turrets_unit_walker_std_rocket_turnrate");
+ walker_meele_dmg = autocvar_g_turrets_unit_walker_std_meele_dmg;
+ walker_meele_force = autocvar_g_turrets_unit_walker_std_meele_force;
+
+ walker_speed_stop = autocvar_g_turrets_unit_walker_speed_stop;
+ walker_speed_walk = autocvar_g_turrets_unit_walker_speed_walk;
+ walker_speed_run = autocvar_g_turrets_unit_walker_speed_run;
+ walker_speed_jump = autocvar_g_turrets_unit_walker_speed_jump;
+ walker_speed_roam = autocvar_g_turrets_unit_walker_speed_roam;
+ walker_speed_swim = autocvar_g_turrets_unit_walker_speed_swim;
+
+ walker_std_rocket_dmg = autocvar_g_turrets_unit_walker_std_rocket_dmg;
+ walker_std_rocket_radius = autocvar_g_turrets_unit_walker_std_rocket_radius;
+ walker_std_rocket_force = autocvar_g_turrets_unit_walker_std_rocket_force;
+ walker_std_rocket_speed = autocvar_g_turrets_unit_walker_std_rocket_speed;
+ walker_std_rocket_turnrate = autocvar_g_turrets_unit_walker_std_rocket_turnrate;
}
wish_angle = angleofs(self,self.enemy);
- if (self.tur_dist_enemy > cvar("g_turrets_unit_walker_std_meele_range"))
+ if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_meele_range)
return 0;
else
if (fabs(wish_angle_y) > 15)
if (self.tur_head.attack_finished_single > time)
return 0;
- if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_rockets_range_min"))
+ if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range_min)
return 0;
- if (self.tur_dist_enemy > cvar("g_turrets_unit_walker_std_rockets_range"))
+ if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range)
return 0;
entity rv;
rv.cnt = 4;
rv.owner = self;
- self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
+ self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
return 1;
}
void walker_attack()
{
sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
- fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
- if (self.uzi_bulletcounter == 2)
+ if (self.misc_bulletcounter == 2)
{
UziFlash();
setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
- self.uzi_bulletcounter = 0;
+ self.misc_bulletcounter = 0;
}
- self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
self.tur_head.frame = self.tur_head.frame + 1;
}
vector vtmp;
entity e;
- setorigin(self,self.wkr_spawn.origin);
+ // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
+ if(self.movetype != MOVETYPE_WALK)
+ return;
+
+ setorigin(self, self.wkr_spawn.origin);
self.angles = self.wkr_spawn.angles;
vtmp = self.wkr_spawn.origin;
self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE ;
self.aim_flags = TFL_AIM_LEAD;
- if (cvar("g_antilag_bullets"))
+ if (autocvar_g_antilag_bullets)
self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
else
self.aim_flags |= TFL_AIM_SHOTTIMECOMPENSATE;
void racer_loadsettings()
{
- racer_power_min = cvar("g_vehicle_racer_power_min") * 0.25;
- racer_power_air = cvar("g_vehicle_racer_power_air") * 0.25;
- racer_power_solid = cvar("g_vehicle_racer_power_solid") * 0.25;
+ racer_power_min = autocvar_g_vehicle_racer_power_min * 0.25;
+ racer_power_air = autocvar_g_vehicle_racer_power_air * 0.25;
+ racer_power_solid = autocvar_g_vehicle_racer_power_solid * 0.25;
- racer_springlength = cvar("g_vehicle_racer_springlength");
- racer_anglestabilizer = cvar("g_vehicle_racer_anglestabilizer");
- racer_pitchspeed = cvar("g_vehicle_racer_pitchspeed");
- racer_turnspeed = cvar("g_vehicle_racer_turnspeed");
- racer_turnroll = cvar("g_vehicle_racer_turnroll");
- racer_speed_forward = cvar("g_vehicle_racer_speed_forward");
- racer_speed_strafe = cvar("g_vehicle_racer_speed_strafe");
+ racer_springlength = autocvar_g_vehicle_racer_springlength;
+ racer_anglestabilizer = autocvar_g_vehicle_racer_anglestabilizer;
+ racer_pitchspeed = autocvar_g_vehicle_racer_pitchspeed;
+ racer_turnspeed = autocvar_g_vehicle_racer_turnspeed;
+ racer_turnroll = autocvar_g_vehicle_racer_turnroll;
+ racer_speed_forward = autocvar_g_vehicle_racer_speed_forward;
+ racer_speed_strafe = autocvar_g_vehicle_racer_speed_strafe;
- racer_afterburn_cost = cvar("g_vehicle_racer_afterburn_cost");
+ racer_afterburn_cost = autocvar_g_vehicle_racer_afterburn_cost;
- racer_healthmax = cvar("g_vehicle_racer_health");
- racer_shieldmax = cvar("g_vehicle_racer_shield");
- racer_energymax = cvar("g_vehicle_racer_energy");
+ racer_healthmax = autocvar_g_vehicle_racer_health;
+ racer_shieldmax = autocvar_g_vehicle_racer_shield;
+ racer_energymax = autocvar_g_vehicle_racer_energy;
}
self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
self.velocity = self.velocity + (push_vector * frametime);
- self.velocity_z -= sv_gravity * frametime;
+ self.velocity_z -= autocvar_sv_gravity * frametime;
push_vector_x = (fl_push - bl_push);
push_vector_x += (fr_push - br_push);
org2 = findbetterlocation (self.origin, 8);
pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
- RadiusDamage (self, self.realowner, cvar("g_vehicle_racer_laser_damage"), 0, cvar("g_vehicle_racer_laser_radius"), world, 150, DEATH_WAKIGUN, world);
+ RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
remove (self);
sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
org2 = findbetterlocation (self.origin, 16);
pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
- RadiusDamage (self, self.realowner ,cvar("g_vehicle_racer_rocket_damage"), 0, cvar("g_vehicle_racer_rocket_radius"), world, 150, DEATH_WAKIROCKET, world);
+ RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
remove (self);
}
bolt.think = racer_bolt_explode;
bolt.nextthink = time + 9;
bolt.bot_dodge = TRUE;
- bolt.bot_dodgerating = cvar("g_vehicle_racer_laser_damage");
+ bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
vector v;
v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
v_forward_z = v_z * 0.5;
- bolt.velocity = v_forward * cvar("g_vehicle_racer_laser_speed");
+ bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
}
rocket = spawn();
setsize (rocket, '-1 -1 -1', '1 1 1');
- rocket.lip = cvar("g_vehicle_racer_rocket_accel") * sys_frametime;
- rocket.wait = cvar("g_vehicle_racer_rocket_turnrate");
+ rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
+ rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate;
rocket.solid = SOLID_BBOX;
rocket.movetype = MOVETYPE_FLYMISSILE;
rocket.flags = FL_PROJECTILE;
rocket.realowner = self.owner;
rocket.touch = racer_rocket_touch;
rocket.bot_dodge = TRUE;
- rocket.bot_dodgerating = cvar("g_vehicle_racer_rocket_damage");
+ rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage;
setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
/*
{
rocket.delay = vlen(rocket.enemy.origin - rocket.origin);
rocket.cnt = time + 9;
- rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
+ rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
rocket.think = racer_rocket_think;
rocket.nextthink = time;
CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
{
*/
rocket.cnt = time + 9;
- rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
+ rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
rocket.think = racer_rocket_groundhugger;
rocket.nextthink = time;
CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
float ftmp, ftmp2;
vector df;
- if(cvar("g_vehicle_racer_reload"))
+ if(autocvar_g_vehicle_racer_reload)
{
racer_loadsettings();
cvar_set("g_vehicle_racer_reload","0");
if (player.BUTTON_JUMP)
if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
{
- racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
+ racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
racer.vehicle_energy -= racer_afterburn_cost * frametime;
- df += (v_forward * cvar("g_vehicle_racer_speed_afterburn"));
+ df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
}
racer.velocity += df * frametime;
- df = (vlen(racer.velocity) * cvar("g_vehicle_racer_downforce") * v_up) * frametime;
+ df = (vlen(racer.velocity) * autocvar_g_vehicle_racer_downforce * v_up) * frametime;
racer.velocity = racer.velocity - df;
player.movement = racer.velocity;
if(player.BUTTON_ATCK)
if(time > racer.attack_finished_single)
- if(racer.vehicle_energy >= cvar("g_vehicle_racer_laser_cost"))
+ if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
{
- racer.vehicle_energy -= cvar("g_vehicle_racer_laser_cost");
- racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
+ racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
+ racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
if(racer.cnt)
{
racer_fire_cannon("tag_fire2");
racer.cnt = 1;
}
- racer.attack_finished_single = time + cvar("g_vehicle_racer_laser_refire");
+ racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
}
if(player.BUTTON_ATCK2)
{
racer_fire_rocket("tag_rocket_r");
racer_fire_rocket("tag_rocket_l");
- racer.delay = time + cvar("g_vehicle_racer_rocket_refire");
+ racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
racer.lip = time;
}
self.owner.effects |= EF_NODRAW;
self.owner.view_ofs = '0 0 0';
- self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_racer_health"));
- self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_racer_shield"));
+ self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
+ self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
setorigin(other,self.origin + '0 0 32');
other.velocity = self.velocity;
ret = spawn();
ret.enemy = self;
ret.think = racer_return;
- ret.nextthink = time + cvar("g_vehicle_racer_respawntime");
+ ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
}
}
RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
self.alpha = -1;
- self.nextthink = time + cvar("g_vehicle_racer_respawntime");
+ self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
self.think = racer_spawn;
self.movetype = MOVETYPE_NONE;
self.effects = EF_NODRAW;
if (clienttype(other) != CLIENTTYPE_REAL)
return;
- if(teamplay)
+ if(teams_matter)
if(self.team)
if(self.team != other.team)
return;
ret = spawn();
ret.enemy = self;
ret.think = raptor_return;
- ret.nextthink = time + cvar("g_vehicle_racer_respawntime");
+ ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
}
}
vector df;
- if(cvar("g_vehicle_raptor_reload"))
+ if(autocvar_g_vehicle_raptor_reload)
{
raptor_loadsettings();
cvar_set("g_vehicle_raptor_reload","0");
self.owner = self.realowner;
RadiusDamage (self, self.owner,
- cvar("g_vehicle_spiderbot_rocket_damage"),
- cvar("g_vehicle_spiderbot_rocket_edgedamage"),
- cvar("g_vehicle_spiderbot_rocket_radius"), world,
- cvar("g_vehicle_spiderbot_rocket_force"), DEATH_SBROCKET, world);
+ autocvar_g_vehicle_spiderbot_rocket_damage,
+ autocvar_g_vehicle_spiderbot_rocket_edgedamage,
+ autocvar_g_vehicle_spiderbot_rocket_radius, world,
+ autocvar_g_vehicle_spiderbot_rocket_force, DEATH_SBROCKET, world);
remove (self);
}
olddir = normalize(self.velocity);
- newdir = normalize(self.pos1 - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
- self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
+ newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
+ self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
UpdateCSQCProjectile(self);
crosshair_trace(self.owner);
olddir = normalize(self.velocity);
- newdir = normalize(trace_endpos - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
- self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
+ newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
+ self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
UpdateCSQCProjectile(self);
rocket.classname = "spiderbot_rocket";
rocket.bot_dodge = TRUE;
- rocket.bot_dodgerating = cvar("g_vehicle_spiderbot_rocket_damage");
- rocket.cnt = time + cvar("g_vehicle_spiderbot_rocket_lifetime");
- rocket.health = cvar("g_vehicle_spiderbot_rocket_health");
+ rocket.bot_dodgerating = autocvar_g_vehicle_spiderbot_rocket_damage;
+ rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
+ rocket.health = autocvar_g_vehicle_spiderbot_rocket_health;
rocket.takedamage = DAMAGE_AIM;
rocket.event_damage = spiderbot_rocket_damage;
rocket.owner = self.owner;
rocket.nextthink = time;
rocket.movetype = MOVETYPE_FLYMISSILE;
- rocket.velocity = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");
+ rocket.velocity = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed;
rocket.angles = vectoangles(rocket.velocity);
rocket.think = spiderbot_rocket_guided;
rocket.touch = spiderbot_rocket_touch;
self.tur_head.frame += 1;
if (self.tur_head.frame == 9)
- self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");
+ self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_reload;
else
- self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");
+ self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_refire;
self.gun2.cnt = time + self.attack_finished_single;
}
sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
- fireBullet (v, v_forward, cvar("g_vehicle_spiderbot_minigun_spread"), cvar("g_vehicle_spiderbot_minigun_damage"),
- cvar("g_vehicle_spiderbot_minigun_spread"), DEATH_SBMINIGUN, 0);
+ fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+ autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
UziFlash();
if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
{
- ftmp = 1 / cvar("g_vehicle_spiderbot_minigun_cooldown") * sys_frametime;
+ ftmp = 1 / autocvar_g_vehicle_spiderbot_minigun_cooldown * sys_frametime;
self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
if(self.owner.vehicle_reload1 <= 0)
self.vehicle_reload1 = 0;
{
// Fire bullets, alternating trails left<->right
self = self.owner;
- if(self.uzi_bulletcounter == 1)
+ if(self.misc_bulletcounter == 1)
{
spiderbot_minigun_fire(self.vehicle.gun1, 0);
spiderbot_minigun_fire(self.vehicle.gun2, 1);
- self.uzi_bulletcounter = 0;
+ self.misc_bulletcounter = 0;
}
else
{
spiderbot_minigun_fire(self.vehicle.gun1, 1);
spiderbot_minigun_fire(self.vehicle.gun2, 0);
- self.uzi_bulletcounter += 1;
+ self.misc_bulletcounter += 1;
}
self = self.vehicle;
- ftmp = cvar("g_vehicle_spiderbot_minigun_refire") / cvar("g_vehicle_spiderbot_minigun_heat");
+ ftmp = autocvar_g_vehicle_spiderbot_minigun_refire / autocvar_g_vehicle_spiderbot_minigun_heat;
self.owner.vehicle_reload1 += ftmp;
if(self.owner.vehicle_reload1 >= 1)
{
self.vehicle_reload1 = 1;
self.owner.vehicle_reload1 = 1;
- self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_cooldown") + time;
+ self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_cooldown + time;
}
else
- self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;
+ self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_refire + time;
}
self = self.owner;
if(ad_y < -180) ad_y += 360;
// Rotate head
- ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") * sys_frametime;
+ ftmp = autocvar_g_vehicle_spiderbot_head_turnspeed * sys_frametime;
ad_y = bound(-ftmp, ad_y, ftmp);
- spider.tur_head.angles_y = bound(cvar("g_vehicle_spiderbot_head_turnlimit") * -1, spider.tur_head.angles_y + ad_y, cvar("g_vehicle_spiderbot_head_turnlimit"));
+ spider.tur_head.angles_y = bound(autocvar_g_vehicle_spiderbot_head_turnlimit * -1, spider.tur_head.angles_y + ad_y, autocvar_g_vehicle_spiderbot_head_turnlimit);
// Pitch head
- ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") * sys_frametime;
+ ftmp = autocvar_g_vehicle_spiderbot_head_pitchspeed * sys_frametime;
ad_x = bound(-ftmp, ad_x, ftmp);
- spider.tur_head.angles_x = bound(cvar("g_vehicle_spiderbot_head_pitchlimit_down"), spider.tur_head.angles_x + ad_x, cvar("g_vehicle_spiderbot_head_pitchlimit_up"));
+ spider.tur_head.angles_x = bound(autocvar_g_vehicle_spiderbot_head_pitchlimit_down, spider.tur_head.angles_x + ad_x, autocvar_g_vehicle_spiderbot_head_pitchlimit_up);
// Turn Body
- ftmp = cvar("g_vehicle_spiderbot_turnspeed") * sys_frametime;
+ ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime;
ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
self = spider;
{
if(vlen(player.movement) == 0)
{
- movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
+ movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
spider.frame = 5;
}
else
spider.frame = 1;
}
player.movement_y = 0;
- movelib_move_simple(normalize(v_forward * player.movement_x),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));
+ movelib_move_simple(normalize(v_forward * player.movement_x),autocvar_g_vehicle_spiderbot_speed_walk,autocvar_g_vehicle_spiderbot_movement_inertia);
}
else if(player.movement_y != 0)
{
player.movement_y = 1;
spider.frame = 3;
}
- movelib_move_simple(normalize(v_right * player.movement_y),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
+ movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia);
}
}
void spiderbot_think()
{
if(self.flags & FL_ONGROUND)
- movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
+ movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
self.nextthink = time;
}
self.colormod = self.tur_head.colormod = '0 0 0';
- if(teamplay)
+ if(teams_matter)
if(self.team)
if(self.team != other.team)
return;
self.owner.vehicle = self;
self.owner.event_damage = SUB_Null;
self.owner.hud = HUD_SPIDERBOT;
- self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
- self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
+ self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health);
+ self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield);
self.owner.view_ofs = '0 0 0';
self.owner.vehicle_ammo1 = self.vehicle_ammo1;
self.owner.vehicle_ammo2 = self.vehicle_ammo2;
self.colormap = 1024;
self.tur_head.colormap = 1024;
- if not (teamplay)
+ if not (teams_matter)
self.team = 0;
else
{
//todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
- Damage(other,self,self.owner,cvar("g_vehicle_spiderbot_crush_dmg"),DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * cvar("g_vehicle_spiderbot_crush_force") );
+ Damage(other,self,self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force );
return;
}
RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
- self.nextthink = time + cvar("g_vehicle_spiderbot_respawntime");
+ self.nextthink = time + autocvar_g_vehicle_spiderbot_respawntime;
self.think = spiderbot_spawn;
self.movetype = MOVETYPE_NONE;
tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
setorigin(self.spiderbot_spawnpnt,trace_endpos);
- if(self.team && !teamplay)
+ if(self.team && !teams_matter)
self.team = 0;
else
self.spiderbot_spawnpnt.team = self.team;
GetKickVoteVictim_newcommand = strcat(argv(0), " # ", ftos(num_for_edict(e)));
if(argv(0) == "kickban")
{
- GetKickVoteVictim_newcommand = strcat(GetKickVoteVictim_newcommand, " ", cvar_string("g_ban_default_bantime"), " ", cvar_string("g_ban_default_masksize"), " ", reason);
+ GetKickVoteVictim_newcommand = strcat(GetKickVoteVictim_newcommand, " ", ftos(autocvar_g_ban_default_bantime), " ", ftos(autocvar_g_ban_default_masksize), " ", reason);
}
else if(argv(0) == "kick")
{
print_to(e, "^1No vote called.");
}
} else if(argv(1) == "call") {
- if(!e || cvar("sv_vote_call")) {
- if(cvar("sv_vote_nospectators") && e && e.classname != "player") {
+ if(!e || autocvar_sv_vote_call) {
+ if(autocvar_sv_vote_nospectators && e && e.classname != "player") {
print_to(e, "^1Error: Only players can call a vote."); // TODO invent a cvar name for allowing votes by spectators during warmup anyway
}
else if(timeoutStatus) { //don't allow a vote call during a timeout
votecalledvote_display = strzone(RemapVote_display);
votecalled = TRUE;
votecalledmaster = FALSE;
- votefinished = time + cvar("sv_vote_timeout");
+ votefinished = time + autocvar_sv_vote_timeout;
votecaller = e; // remember who called the vote
if(e) {
e.vote_vote = 1; // of course you vote yes
- e.vote_next = time + cvar("sv_vote_wait");
+ e.vote_next = time + autocvar_sv_vote_wait;
}
bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote for ", votecalledvote_display, "\n");
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
VoteCount(); // needed if you are the only one
Nagger_VoteChanged();
print_to(e, "^1You are not allowed to stop that Vote.");
}
} else if(argv(1) == "master") {
- if(cvar("sv_vote_master")) {
+ if(autocvar_sv_vote_master) {
if(votecalled) {
print_to(e, "^1There is already a vote called.");
} else {
votecalledmaster = TRUE;
votecalledvote = strzone("XXX");
votecalledvote_display = strzone("^3master");
- votefinished = time + cvar("sv_vote_timeout");
+ votefinished = time + autocvar_sv_vote_timeout;
votecaller = e; // remember who called the vote
if(e) {
e.vote_vote = 1; // of course you vote yes
- e.vote_next = time + cvar("sv_vote_wait");
+ e.vote_next = time + autocvar_sv_vote_wait;
}
bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote to become ^3master^2.\n");
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
VoteCount(); // needed if you are the only one
Nagger_VoteChanged();
print_to(e, "Syntax error in command. See 'vhelp' for more info.");
} else if(RemapVote(dovote, "vdo", e)) { // strcat seems to be necessary
bprint("\{1}^2* ^3", VoteNetname(e), "^2 used their ^3master^2 status to do \"^2", RemapVote_display, "^2\".\n");
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vdo:", ftos(e.playerid), ":", RemapVote_display));
localcmd(strcat(RemapVote_vote, "\n"));
} else {
}
} else if(argv(1) == "login") {
local string masterpwd;
- masterpwd = cvar_string("sv_vote_master_password");
+ masterpwd = autocvar_sv_vote_master_password;
if(masterpwd != "") {
local float granted;
granted = (masterpwd == argv(2));
if(granted) {
print("Accepted master login from ", VoteNetname(e), "\n");
bprint("\{1}^2* ^3", VoteNetname(e), "^2 logged in as ^3master^2\n");
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vlogin:", ftos(e.playerid)));
}
else
} else if (!e) {
print_to(e, "^1You can't vote from the server console.");
} else if(e.vote_vote == 0
- || cvar("sv_vote_change")) {
+ || autocvar_sv_vote_change) {
msg_entity = e;
VoteDialog_UpdateHighlight(1);
print_to(e, "^1You accepted the vote.");
e.vote_vote = 1;
centerprint_expire(e, CENTERPRIO_VOTE);
- if(!cvar("sv_vote_singlecount")) {
+ if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
} else {
} else if (!e) {
print_to(e, "^1You can't vote from the server console.");
} else if(e.vote_vote == 0
- || cvar("sv_vote_change")) {
+ || autocvar_sv_vote_change) {
msg_entity = e;
VoteDialog_UpdateHighlight(2);
print_to(e, "^1You rejected the vote.");
e.vote_vote = -1;
centerprint_expire(e, CENTERPRIO_VOTE);
- if(!cvar("sv_vote_singlecount")) {
+ if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
} else {
} else if (!e) {
print_to(e, "^1You can't vote from the server console.");
} else if(e.vote_vote == 0
- || cvar("sv_vote_change")) {
+ || autocvar_sv_vote_change) {
msg_entity = e;
VoteDialog_UpdateHighlight(3);
print_to(e, "^1You abstained from your vote.");
e.vote_vote = -2;
centerprint_expire(e, CENTERPRIO_VOTE);
- if(!cvar("sv_vote_singlecount")) {
+ if(!autocvar_sv_vote_singlecount) {
VoteCount();
}
} else {
void VoteHelp(entity e) {
local string vmasterdis;
- if(!cvar("sv_vote_master")) {
+ if(!autocvar_sv_vote_master) {
vmasterdis = " ^1(disabled)";
}
local string vlogindis;
- if("" == cvar_string("sv_vote_master_password")) {
+ if("" == autocvar_sv_vote_master_password) {
vlogindis = " ^1(disabled)";
}
local string vcalldis;
- if(!cvar("sv_vote_call")) {
+ if(!autocvar_sv_vote_call) {
vcalldis = " ^1(disabled)";
}
print_to(e, "^7\"^2yes^7\", \"^2no^7\", \"^2abstain^7\" and \"^2dontcare^7\" to make your vote.");
print_to(e, "^7If enough of the players vote yes the vote is accepted.");
print_to(e, "^7If enough of the players vote no the vote is rejected.");
- print_to(e, strcat("^7If neither the vote will timeout after ", cvar_string("sv_vote_timeout"), "^7 seconds."));
+ print_to(e, strcat("^7If neither the vote will timeout after ", ftos(autocvar_sv_vote_timeout), "^7 seconds."));
print_to(e, "^7You can call a vote for or execute these commands:");
- print_to(e, strcat("^3", cvar_string("sv_vote_commands"), "^7 and maybe further ^3arguments^7"));
+ print_to(e, strcat("^3", autocvar_sv_vote_commands, "^7 and maybe further ^3arguments^7"));
}
string VoteNetname(entity e)
if(e) {
return e.netname;
} else {
- if(cvar_string("sv_adminnick") != "") {
- return cvar_string("sv_adminnick");
+ if(autocvar_sv_adminnick != "") {
+ return autocvar_sv_adminnick;
} else {
- return cvar_string("hostname");
+ return autocvar_hostname;
}
}
}
print_to(e, "This map is not available on this server.");
return string_null;
}
- if(!cvar("sv_vote_override_mostrecent"))
+ if(!autocvar_sv_vote_override_mostrecent)
if(Map_IsRecent(m))
{
print_to(e, "This server does not allow for recent maps to be played again. Please be patient for some rounds.");
}
float VoteAllowed(string votecommand, string cmd) {
- if(VoteCommandInList(votecommand, cvar_string("sv_vote_commands")))
+ if(VoteCommandInList(votecommand, autocvar_sv_vote_commands))
return TRUE;
if(cmd == "vdo")
{
- if(VoteCommandInList(votecommand, cvar_string("sv_vote_master_commands")))
+ if(VoteCommandInList(votecommand, autocvar_sv_vote_master_commands))
return TRUE;
}
else
{
- if(VoteCommandInList(votecommand, cvar_string("sv_vote_only_commands")))
+ if(VoteCommandInList(votecommand, autocvar_sv_vote_only_commands))
return TRUE;
}
void VoteStop(entity stopper) {
bprint("\{1}^2* ^3", VoteNetname(stopper), "^2 stopped ^3", VoteNetname(votecaller), "^2's vote\n");
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid)));
if(stopper == votecaller) {
// no wait for next vote so you can correct your vote
if(votecaller) {
- votecaller.vote_next = time + cvar("sv_vote_stop");
+ votecaller.vote_next = time + autocvar_sv_vote_stop;
}
}
VoteReset();
s = strcat(s, ftos(notvoters), "^2 didn't have to vote\n");
}
bprint(s);
- if(cvar("sv_eventlog"))
+ if(autocvar_sv_eventlog)
{
s = strcat(":vote:v", result, ":", ftos(yescount));
s = strcat(s, ":", ftos(nocount));
}
//in tournament mode, if we have at least one player then don't make the vote dependent on spectators (so specs don't have to press F1)
- if(cvar("sv_vote_nospectators"))
+ if(autocvar_sv_vote_nospectators)
if(realplayercount > 0) {
yescount = realplayeryescount;
nocount = realplayernocount;
}
float votefactor, simplevotefactor;
- votefactor = bound(0.5, cvar("sv_vote_majority_factor"), 0.999);
- simplevotefactor = cvar("sv_vote_simple_majority_factor");
+ votefactor = bound(0.5, autocvar_sv_vote_majority_factor, 0.999);
+ simplevotefactor = autocvar_sv_vote_simple_majority_factor;
float needed;
needed = floor((playercount - abstaincount) * max(votefactor, simplevotefactor)) + 1;
VoteDialog_Update(MSG_ALL, yescount, nocount, needed);
#include "w_hook.qc"
#include "w_hlac.qc"
#include "w_tuba.qc"
-#include "w_campingrifle.qc"
+#include "w_sniperrifle.qc"
#include "w_fireball.qc"
#include "w_seeker.qc"
+++ /dev/null
-#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(CAMPINGRIFLE, w_campingrifle, IT_NAILS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "campingrifle", "campingrifle", "Sniper Rifle");
-#else
-#ifdef SVQC
-//Camping rifle Primary mode: manually operated bolt*, Secondary: full automatic**
-//* Manually operating the bolt means that all the power of the gas is used to propell the bullet. In this mode the bolt is prevented from moving backwards in response to the firing of the bullet.
-//** In fully automatic mode some of the gas is used to extract and reload the next cartrige, thus there is less power and range.
-
-.float campingrifle_accumulator;
-
-float W_CampingRifle_CheckMaxBullets(float checkammo)
-{
- float maxbulls;
- maxbulls = cvar("g_balance_campingrifle_magazinecapacity");
- if(!maxbulls)
- maxbulls = 8; // match HUD
- if(checkammo)
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- maxbulls = min(maxbulls, floor(self.ammo_nails / min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo"))));
- if(self.campingrifle_bulletcounter > maxbulls || !cvar("g_balance_campingrifle_magazinecapacity"))
- self.campingrifle_bulletcounter = maxbulls;
- return (self.campingrifle_bulletcounter == maxbulls);
-}
-
-void W_CampingRifle_ReloadedAndReady()
-{
- float t;
- self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
- W_CampingRifle_CheckMaxBullets(TRUE);
- t = ATTACK_FINISHED(self) - cvar("g_balance_campingrifle_reloadtime") - 1;
- ATTACK_FINISHED(self) = t;
- w_ready();
-}
-
-float W_CampingRifle_Reload()
-{
- float t;
-
- W_CampingRifle_CheckMaxBullets(TRUE);
-
- if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo"))) // when we get here, bulletcounter must be 0 or -1
- {
- print("cannot reload... not enough bullets\n");
- self.campingrifle_bulletcounter = -1; // reload later
- W_SwitchToOtherWeapon(self);
- return 0;
- }
-
- if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
- return 0;
-
- if (self.weaponentity)
- {
- if (self.weaponentity.wframe == WFRAME_RELOAD)
- return 0;
-
- // allow to switch away while reloading, but this will cause a new reload!
- self.weaponentity.state = WS_READY;
- }
-
- sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
-
- t = max(time, ATTACK_FINISHED(self)) + cvar("g_balance_campingrifle_reloadtime") + 1;
- ATTACK_FINISHED(self) = t;
-
- weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_CampingRifle_ReloadedAndReady);
-
- self.campingrifle_bulletcounter = -1;
-
- return 1;
-}
-
-void W_CampingRifle_CheckReloadAndReady()
-{
- w_ready();
- if(self.campingrifle_bulletcounter <= 0)
- if(W_CampingRifle_Reload())
- return;
-}
-
-void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
-{
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_nails -= pAmmo;
-
- if(deathtype & HITTYPE_SECONDARY)
- W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire2.wav", cvar("g_balance_campingrifle_secondary_damage"));
- else
- W_SetupShot (self, cvar("g_antilag_bullets") && pSpeed >= cvar("g_antilag_bullets"), 2, "weapons/campingrifle_fire.wav", cvar("g_balance_campingrifle_primary_damage"));
-
- pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
-
- if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
- {
- w_shotdir = v_forward;
- w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
- }
-
- if(deathtype & HITTYPE_SECONDARY)
- fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (cvar("g_balance_campingrifle_secondary_tracer") ? EF_RED : EF_BLUE), 1, pBulletConstant);
- else
- fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (cvar("g_balance_campingrifle_primary_tracer") ? EF_RED : EF_BLUE), 1, pBulletConstant);
- endFireBallisticBullet();
-
- if (cvar("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);
-
- self.campingrifle_bulletcounter = self.campingrifle_bulletcounter - 1;
- W_CampingRifle_CheckMaxBullets(TRUE);
-}
-
-void W_CampingRifle_Attack()
-{
- W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_primary_spread"), cvar("g_balance_campingrifle_primary_damage"), cvar("g_balance_campingrifle_primary_headshotaddeddamage"), cvar("g_balance_campingrifle_primary_force"), cvar("g_balance_campingrifle_primary_speed"), cvar("g_balance_campingrifle_primary_lifetime"), cvar("g_balance_campingrifle_primary_ammo"), WEP_CAMPINGRIFLE, cvar("g_balance_campingrifle_primary_bulletconstant"));
-}
-
-void W_CampingRifle_Attack2()
-{
- W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_secondary_spread"), cvar("g_balance_campingrifle_secondary_damage"), cvar("g_balance_campingrifle_secondary_headshotaddeddamage"), cvar("g_balance_campingrifle_secondary_force"), cvar("g_balance_campingrifle_secondary_speed"), cvar("g_balance_campingrifle_secondary_lifetime"), cvar("g_balance_campingrifle_secondary_ammo"), WEP_CAMPINGRIFLE | HITTYPE_SECONDARY, cvar("g_balance_campingrifle_secondary_bulletconstant"));
-}
-
-void spawnfunc_weapon_campingrifle (void)
-{
- weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
-}
-
-.void(void) campingrifle_bullethail_attackfunc;
-.float campingrifle_bullethail_frame;
-.float campingrifle_bullethail_animtime;
-.float campingrifle_bullethail_refire;
-void W_CampingRifle_BulletHail_Continue()
-{
- float r, sw, af;
- W_CampingRifle_CheckReloadAndReady();
- if(self.campingrifle_bulletcounter < 0)
- return; // reloading, so we are done
- sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
- af = ATTACK_FINISHED(self);
- self.switchweapon = self.weapon;
- ATTACK_FINISHED(self) = time;
- print(ftos(self.ammo_nails), "\n");
- r = weapon_prepareattack(self.campingrifle_bullethail_frame == WFRAME_FIRE2, self.campingrifle_bullethail_refire);
- if(self.switchweapon == self.weapon)
- self.switchweapon = sw;
- if(r)
- {
- self.campingrifle_bullethail_attackfunc();
- weapon_thinkf(self.campingrifle_bullethail_frame, self.campingrifle_bullethail_animtime, W_CampingRifle_BulletHail_Continue);
- print("thinkf set\n");
- }
- else
- {
- ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
- print("out of ammo... ", ftos(self.weaponentity.state), "\n");
- }
-}
-
-void W_CampingRifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
-{
- // if we get here, we have at least one bullet to fire
- AttackFunc();
- if(mode)
- {
- // continue hail
- self.campingrifle_bullethail_attackfunc = AttackFunc;
- self.campingrifle_bullethail_frame = fr;
- self.campingrifle_bullethail_animtime = animtime;
- self.campingrifle_bullethail_refire = refire;
- weapon_thinkf(fr, animtime, W_CampingRifle_BulletHail_Continue);
- }
- else
- {
- // just one shot
- weapon_thinkf(fr, animtime, W_CampingRifle_CheckReloadAndReady);
- }
-}
-
-.float bot_secondary_campingriflemooth;
-float w_campingrifle(float req)
-{
- float full;
- if (req == WR_AIM)
- {
- self.BUTTON_ATCK=FALSE;
- self.BUTTON_ATCK2=FALSE;
- if(vlen(self.origin-self.enemy.origin) > 1000)
- self.bot_secondary_campingriflemooth = 0;
- if(self.bot_secondary_campingriflemooth == 0)
- {
- if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
- {
- self.BUTTON_ATCK = TRUE;
- if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
- }
- }
- else
- {
- if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
- {
- self.BUTTON_ATCK2 = TRUE;
- if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
- }
- }
- }
- else if (req == WR_THINK)
- {
- if(self.campingrifle_bulletcounter < 0) // forced reload (e.g. because interrupted)
- {
- if(self.switchweapon == self.weapon)
- if(self.weaponentity.state == WS_READY)
- W_CampingRifle_Reload();
- }
- else
- {
- self.campingrifle_accumulator = bound(time - cvar("g_balance_campingrifle_bursttime"), self.campingrifle_accumulator, time);
- if (self.BUTTON_ATCK)
- if (weapon_prepareattack_check(0, cvar("g_balance_campingrifle_primary_refire")))
- if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_primary_burstcost"))
- {
- weapon_prepareattack_do(0, cvar("g_balance_campingrifle_primary_refire"));
- W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_primary_bullethail"), W_CampingRifle_Attack, WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
- self.campingrifle_accumulator += cvar("g_balance_campingrifle_primary_burstcost");
- }
- if (self.BUTTON_ATCK2)
- {
- if (cvar("g_balance_campingrifle_secondary"))
- {
- if (weapon_prepareattack_check(1, cvar("g_balance_campingrifle_secondary_refire")))
- if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_secondary_burstcost"))
- {
- weapon_prepareattack_do(1, cvar("g_balance_campingrifle_secondary_refire"));
- W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_secondary_bullethail"), W_CampingRifle_Attack2, WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
- self.campingrifle_accumulator += cvar("g_balance_campingrifle_secondary_burstcost");
- }
- }
- }
- }
- }
- else if (req == WR_PRECACHE)
- {
- precache_model ("models/weapons/g_campingrifle.md3");
- precache_model ("models/weapons/v_campingrifle.md3");
- precache_model ("models/weapons/h_campingrifle.iqm");
- precache_sound ("weapons/campingrifle_reload.wav");
- precache_sound ("weapons/campingrifle_fire.wav");
- precache_sound ("weapons/campingrifle_fire2.wav");
- }
- else if (req == WR_SETUP)
- {
- weapon_setup(WEP_CAMPINGRIFLE);
-
- full = W_CampingRifle_CheckMaxBullets(TRUE);
- if(cvar("g_balance_campingrifle_auto_reload_after_changing_weapons"))
- if(!full)
- self.campingrifle_bulletcounter = -1;
- }
- else if (req == WR_CHECKAMMO1)
- return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
- else if (req == WR_CHECKAMMO2)
- return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
- else if (req == WR_RELOAD)
- {
- W_CampingRifle_Reload();
- }
- else if (req == WR_RESETPLAYER)
- {
- self.campingrifle_accumulator = time - cvar("g_balance_campingrifle_bursttime");
- self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
- W_CampingRifle_CheckMaxBullets(FALSE);
- }
- return TRUE;
-};
-#endif
-#ifdef CSQC
-float w_campingrifle(float req)
-{
- if(req == 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.2)
- sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
- else if(w_random < 0.4)
- sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
- else if(w_random < 0.5)
- sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
- }
- }
- else if(req == WR_PRECACHE)
- {
- precache_sound("weapons/ric1.wav");
- precache_sound("weapons/ric2.wav");
- precache_sound("weapons/ric3.wav");
- }
- else if (req == WR_SUICIDEMESSAGE)
- {
- if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s shot themself automatically";
- else
- w_deathtypestring = "%s sniped themself somehow";
- }
- else if (req == WR_KILLMESSAGE)
- {
- if(w_deathtype & HITTYPE_SECONDARY)
- {
- if(w_deathtype & HITTYPE_BOUNCE)
- w_deathtypestring = "%s failed to hide from %s's bullet hail";
- else
- w_deathtypestring = "%s died in %s's bullet hail";
- }
- else
- {
- if(w_deathtype & HITTYPE_BOUNCE)
- {
- // TODO special headshot message here too?
- w_deathtypestring = "%s failed to hide from %s's rifle";
- }
- else
- {
- if(w_deathtype & HITTYPE_HEADSHOT)
- w_deathtypestring = "%s got hit in the head by %s";
- else
- w_deathtypestring = "%s was sniped by %s";
- }
- }
- }
- return TRUE;
-}
-#endif
-#endif
}
.float railgundistance;
+.vector railgunforce;
void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype)
{
local vector hitloc, force, endpoint, dir;
local entity ent, endent;
local float endq3surfaceflags;
+ float totaldmg;
float length;
vector beampos;
entity pseudoprojectile;
float f, ffs;
- float hit;
-
railgun_start = start;
railgun_end = end;
// go a little bit into the wall because we need to hit this wall later
end = end + dir;
+ totaldmg = 0;
+
// trace multiple times until we hit a wall, each obstacle will be made
// non-solid so we can hit the next, while doing this we spawn effects and
// note down which entities were hit so we can damage them later
trace_ent.railgunhitloc = end;
trace_ent.railgunhitsolidbackup = trace_ent.solid;
trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start);
+ trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force);
// stop if this is a wall
if (trace_ent.solid == SOLID_BSP)
// get the details we need to call the damage function
hitloc = ent.railgunhitloc;
- //for stats so that team hit will count as a miss
- if(ent.flags & FL_CLIENT)
- if(ent.deadflag == DEAD_NO)
- hit = 1;
-
- if(teams_matter)
- if(ent.team == self.team)
- hit = 0;
-
f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
+ if(accuracy_isgooddamage(self.owner, ent))
+ totaldmg += bdamage * f;
+
// apply the damage
if (ent.takedamage)
- Damage (ent, self, self, bdamage * f, deathtype, hitloc, force * ffs);
+ Damage (ent, self, self, bdamage * f, deathtype, hitloc, ent.railgunforce * ffs);
// create a small explosion to throw gibs around (if applicable)
//setorigin (explosion, hitloc);
}
// calculate hits and fired shots for hitscan
- if not(inWarmupStage)
- {
- self.stats_fired[self.weapon - 1] += 1;
- self.stat_fired = self.weapon + 64 * floor(self.stats_fired[self.weapon - 1]);
-
- if(hit) {
- self.stats_hit[self.weapon - 1] += 1;
- self.stat_hit = self.weapon + 64 * floor(self.stats_hit[self.weapon - 1]);
- }
- }
+ accuracy_add(self, self.weapon, 0, min(bdamage, totaldmg));
trace_endpos = endpoint;
trace_ent = endent;
.float dmg_edge;
.float dmg_force;
.float dmg_radius;
+.float dmg_total;
void W_BallisticBullet_Hit (void)
{
- float f;
+ float f, q, g;
f = pow(bound(0, vlen(self.velocity) / vlen(self.oldvelocity), 1), 2); // energy multiplier
+ q = 1 + self.dmg_edge / self.dmg;
if(other.solid == SOLID_BSP)
Damage_DamageInfo(self.origin, self.dmg * f, 0, 0, max(1, self.dmg_force) * normalize(self.velocity) * f, self.projectiledeathtype, self);
headshot = 0;
yoda = 0;
- damage_headshotbonus = self.dmg_edge;
+ damage_headshotbonus = self.dmg_edge * f;
railgun_start = self.origin - 2 * frametime * self.velocity;
railgun_end = self.origin + 2 * frametime * self.velocity;
-
+ g = accuracy_isgooddamage(self.owner, other);
Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
damage_headshotbonus = 0;
- if(self.dmg_edge != 0)
+ if(headshot)
+ f *= q;
+ if(DEATH_WEAPONOF(self.projectiledeathtype) == WEP_SNIPERRIFLE)
{
if(headshot)
AnnounceTo(self.owner, "headshot");
}
// calculate hits for ballistic weapons
- if (other.flags & FL_CLIENT) // is the player a client
- if (other.deadflag == DEAD_NO) // is the victim a corpse
- if ((!(teamplay)) | (other.team != self.owner.team)) // not teamplay (ctf, kh, tdm etc) or the victim is in the same team
- if not(inWarmupStage) // not in warm up stage
+ if(g)
{
- self.owner.stats_hit[self.owner.weapon - 1] += 1;
- self.owner.stat_hit = self.owner.weapon + 64 * floor(self.owner.stats_hit[self.owner.weapon - 1]);
+ // do not exceed 100%
+ q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total;
+ self.dmg_total += f * self.dmg;
+ accuracy_add(self.owner, self.owner.weapon, 0, q);
}
}
// maxdist = 0.5 * v0 * v0 / constant
// dprint("max dist = ", ftos(maxdist), "\n");
- if(maxdist <= cvar("g_ballistics_mindistance"))
+ if(maxdist <= autocvar_g_ballistics_mindistance)
return 0;
traceline_inverted (self.origin, self.origin + normalize(vel) * maxdist, MOVE_NORMAL, self);
self.W_BallisticBullet_LeaveSolid_origin = trace_endpos;
- dst = max(cvar("g_ballistics_mindistance"), vlen(trace_endpos - self.origin));
+ dst = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - self.origin));
// E(s) = E0 - constant * s, constant = area of bullet circle * material constant / mass
Es_m = E0_m - constant * dst;
if(Es_m <= 0)
PROJECTILE_TOUCH;
W_BallisticBullet_Hit ();
+ // if we hit "weapclip", bail out
+ //
+ // rationale of this check:
+ //
+ // any shader that is solid, nodraw AND trans is meant to clip weapon
+ // shots and players, but has no other effect!
+ //
+ // if it is not trans, it is caulk and should not have this side effect
+ //
+ // matching shaders:
+ // common/weapclip (intended)
+ // common/noimpact (is supposed to eat projectiles, but is erased farther above)
+ if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW)
+ if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID)
+ if not(trace_dphitcontents & DPCONTENTS_OPAQUE)
+ {
+ remove(self);
+ return;
+ }
+
density = other.ballistics_density;
if(density == 0)
density = 1;
{
float lag, dt, savetime, density;
entity pl, oldself;
+ float antilagging;
+
+ antilagging = (autocvar_g_antilag_bullets && (pSpeed >= autocvar_g_antilag_bullets));
entity proj;
proj = spawn();
proj.movetype = MOVETYPE_FLY;
proj.think = SUB_Remove;
proj.nextthink = time + lifetime; // min(pLifetime, vlen(world.maxs - world.mins) / pSpeed);
- W_SetupProjectileVelocityEx(proj, dir, v_up, pSpeed, 0, 0, spread);
+ W_SetupProjectileVelocityEx(proj, dir, v_up, pSpeed, 0, 0, spread, antilagging);
proj.angles = vectoangles(proj.velocity);
- proj.dmg_radius = cvar("g_ballistics_materialconstant") / bulletconstant;
+ proj.dmg_radius = autocvar_g_ballistics_materialconstant / bulletconstant;
// so: bulletconstant = bullet mass / area of bullet circle
setorigin(proj, start);
proj.flags = FL_PROJECTILE;
other = proj; MUTATOR_CALLHOOK(EditProjectile);
- if(cvar("g_antilag_bullets"))
- if(pSpeed >= cvar("g_antilag_bullets"))
+ if(antilagging)
{
float eff;
if(tracereffects & EF_RED)
eff = particleeffectnum("tr_rifle");
+ else if(tracereffects & EF_BLUE)
+ eff = particleeffectnum("tr_rifle_weak");
else
eff = particleeffectnum("tr_bullet");
lag = 0;
if(clienttype(self) != CLIENTTYPE_REAL)
lag = 0;
- if(cvar("g_antilag") == 0 || self.cvar_cl_noantilag)
+ if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
lag = 0; // only do hitscan, but no antilag
if(lag)
savetime = frametime;
frametime = 0.05;
- // update the accuracy stats - increase shots fired by 1
- if not(inWarmupStage)
- {
- oldself.stats_fired[oldself.weapon - 1] += 1;
- oldself.stat_fired = oldself.weapon + 64 * floor(oldself.stats_fired[oldself.weapon - 1]);
- }
-
for(;;)
{
// DP tracetoss is stupid and always traces in 0.05s
W_BallisticBullet_Hit();
}
+ // if we hit "weapclip", bail out
+ //
+ // rationale of this check:
+ //
+ // any shader that is solid, nodraw AND trans is meant to clip weapon
+ // shots and players, but has no other effect!
+ //
+ // if it is not trans, it is caulk and should not have this side effect
+ //
+ // matching shaders:
+ // common/weapclip (intended)
+ // common/noimpact (is supposed to eat projectiles, but is erased farther above)
+ if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW)
+ if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID)
+ if not(trace_dphitcontents & DPCONTENTS_OPAQUE)
+ break;
+
density = other.ballistics_density;
if(density == 0)
density = 1;
return;
}
- // update the accuracy stats
- if not(inWarmupStage)
- {
- self.stats_fired[self.weapon - 1] += 1;
- self.stat_fired = self.weapon + 64 * floor(self.stats_fired[self.weapon - 1]);
- }
-
if(tracereffects & EF_RED)
CSQCProjectile(proj, TRUE, PROJECTILE_BULLET_GLOWING_TRACER, TRUE);
else if(tracereffects & EF_BLUE)
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(CRYLINK, w_crylink, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "crylink", "crylink", "Crylink");
+REGISTER_WEAPON(CRYLINK, w_crylink, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "crylink", "crylink", _("Crylink"));
#else
#ifdef SVQC
.float gravity;
.entity queuenext;
.entity queueprev;
+void W_Crylink_CheckLinks(entity e)
+{
+ float i;
+ entity p;
+
+ if(e == world)
+ error("W_Crylink_CheckLinks: entity is world");
+ if(e.classname != "spike")
+ error("W_Crylink_CheckLinks: entity is not a spike");
+
+ 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;
+ if(me != next)
+ W_Crylink_CheckLinks(next);
}
void W_Crylink_Dequeue(entity e)
if(e == e.realowner.crylink_lastgroup)
e.realowner.crylink_lastgroup = world;
- RadiusDamage (e, e.realowner, cvar("g_balance_crylink_primary_damage") * a, cvar("g_balance_crylink_primary_edgedamage") * a, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * a, e.projectiledeathtype, other);
+ if(e.projectiledeathtype & HITTYPE_SECONDARY)
+ RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_secondary_damage * a, autocvar_g_balance_crylink_secondary_edgedamage * a, autocvar_g_balance_crylink_secondary_radius, world, autocvar_g_balance_crylink_secondary_force * a, e.projectiledeathtype, other);
+ else
+ RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_primary_damage * a, autocvar_g_balance_crylink_primary_edgedamage * a, autocvar_g_balance_crylink_primary_radius, world, autocvar_g_balance_crylink_primary_force * a, e.projectiledeathtype, other);
if(e.queuenext != e2)
W_Crylink_LinkExplode(e.queuenext, e2);
// stored in w_crylink_linkjoin_time.
// could possibly network this origin and time, and display a special particle
// effect when projectiles meet there :P
+// jspeed: MINIMUM jing speed
+// jtime: MAXIMUM jing time (0: none)
float w_crylink_linkjoin_time;
-vector W_Crylink_LinkJoin(entity e, float joinspeed)
+vector W_Crylink_LinkJoin(entity e, float jspeed, float jtime)
{
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;
n = 1;
for(p = e; (p = p.queuenext) != e; )
{
- avg_origin += p.origin;
- avg_velocity += p.velocity;
+ avg_origin += WarpZone_RefSys_TransformOrigin(p, e, p.origin);
+ avg_velocity += WarpZone_RefSys_TransformVelocity(p, e, p.velocity);
++n;
}
avg_origin *= (1.0 / n);
// 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(e.origin - avg_origin), 2);
+ 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(joinspeed == 0)
+ if(jspeed == 0 && jtime == 0)
{
e.velocity = avg_velocity;
UpdateCSQCProjectile(e);
for(p = e; (p = p.queuenext) != e; )
{
- p.velocity = avg_velocity;
+ p.velocity = WarpZone_RefSys_TransformVelocity(e, p, avg_velocity);
UpdateCSQCProjectile(p);
}
}
else
{
- w_crylink_linkjoin_time = avg_dist / joinspeed;
+ 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;
targ_origin = avg_origin + w_crylink_linkjoin_time * avg_velocity;
- e.velocity = (targ_origin - e.origin) * (joinspeed / avg_dist);
+ e.velocity = (targ_origin - e.origin) * (1.0 / w_crylink_linkjoin_time);
UpdateCSQCProjectile(e);
for(p = e; (p = p.queuenext) != e; )
{
- p.velocity = (targ_origin - p.origin) * (joinspeed / avg_dist);
+ 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:
- // joinspeed -> +infinity:
+ // jspeed -> +infinity:
// w_crylink_linkjoin_time -> +0
// targ_origin -> avg_origin
// p->velocity -> HUEG towards center
- // joinspeed -> 0:
+ // jspeed -> 0:
// w_crylink_linkjoin_time -> +/- infinity
// targ_origin -> avg_velocity * +/- infinity
// p->velocity -> avg_velocity
- // joinspeed -> -infinity:
+ // jspeed -> -infinity:
// w_crylink_linkjoin_time -> -0
// targ_origin -> avg_origin
// p->velocity -> HUEG away from center
}
+ W_Crylink_CheckLinks(e);
+
return targ_origin;
}
}
if(n >= 2)
{
- // they seem to touch...
- // TODO make a specific particle effect for this
- pointparticles(particleeffectnum("crylink_linkjoin"), self.origin, '0 0 0', 1);
+ if(e.projectiledeathtype & HITTYPE_SECONDARY)
+ {
+ if(autocvar_g_balance_crylink_secondary_joinexplode)
+ {
+ n = n / autocvar_g_balance_crylink_secondary_shots;
+ RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_secondary_joinexplode_damage * n,
+ autocvar_g_balance_crylink_secondary_joinexplode_edgedamage * n,
+ autocvar_g_balance_crylink_secondary_joinexplode_radius * n, e.realowner,
+ autocvar_g_balance_crylink_secondary_joinexplode_force * n, e.projectiledeathtype, other);
+
+ pointparticles(particleeffectnum("crylink_joinexplode"), self.origin, '0 0 0', n);
+ }
+ }
+ else
+ {
+ if(autocvar_g_balance_crylink_primary_joinexplode)
+ {
+ n = n / autocvar_g_balance_crylink_primary_shots;
+ RadiusDamage (e, e.realowner, autocvar_g_balance_crylink_primary_joinexplode_damage * n,
+ autocvar_g_balance_crylink_primary_joinexplode_edgedamage * n,
+ autocvar_g_balance_crylink_primary_joinexplode_radius * n, e.realowner,
+ autocvar_g_balance_crylink_primary_joinexplode_force * n, e.projectiledeathtype, other);
+
+ pointparticles(particleeffectnum("crylink_joinexplode"), self.origin, '0 0 0', n);
+ }
+ }
}
}
remove(self);
}
+
// NO bounce protection, as bounces are limited!
void W_Crylink_Touch (void)
{
if(finalhit)
f = 1;
else
- f = cvar("g_balance_crylink_primary_bouncedamagefactor");
+ f = autocvar_g_balance_crylink_primary_bouncedamagefactor;
if(a)
f *= a;
- if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, self.projectiledeathtype, other))
+ if (RadiusDamage (self, self.realowner, autocvar_g_balance_crylink_primary_damage * f, autocvar_g_balance_crylink_primary_edgedamage * f, autocvar_g_balance_crylink_primary_radius, world, autocvar_g_balance_crylink_primary_force * f, self.projectiledeathtype, other) && autocvar_g_balance_crylink_primary_linkexplode)
{
+ if(self == self.realowner.crylink_lastgroup)
+ self.realowner.crylink_lastgroup = world;
W_Crylink_LinkExplode(self.queuenext, self);
remove (self);
return;
}
float a;
- a = 1 - (time - self.fade_time) * self.fade_rate;
+ 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 = cvar("g_balance_crylink_secondary_bouncedamagefactor");
+ f = autocvar_g_balance_crylink_secondary_bouncedamagefactor;
if(a)
f *= a;
- if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other))
+ if (RadiusDamage (self, self.realowner, autocvar_g_balance_crylink_secondary_damage * f, autocvar_g_balance_crylink_secondary_edgedamage * f, autocvar_g_balance_crylink_secondary_radius, world, autocvar_g_balance_crylink_secondary_force * f, self.projectiledeathtype, other) && autocvar_g_balance_crylink_secondary_linkexplode)
{
+ if(self == self.realowner.crylink_lastgroup)
+ self.realowner.crylink_lastgroup = world;
W_Crylink_LinkExplode(self.queuenext, self);
remove (self);
return;
local entity proj, prevproj, firstproj;
local vector s;
vector forward, right, up;
+ float maxdmg;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_crylink_primary_ammo;
+
+ maxdmg = autocvar_g_balance_crylink_primary_damage*autocvar_g_balance_crylink_primary_shots;
+ maxdmg *= 1 + autocvar_g_balance_crylink_primary_bouncedamagefactor * autocvar_g_balance_crylink_primary_bounces;
+ if(autocvar_g_balance_crylink_primary_joinexplode)
+ maxdmg += autocvar_g_balance_crylink_primary_joinexplode_damage;
- W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", (cvar("g_balance_crylink_primary_damage")*cvar("g_balance_crylink_primary_shots")));
+ W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CHAN_WEAPON, maxdmg);
forward = v_forward;
right = v_right;
up = v_up;
- shots = cvar("g_balance_crylink_primary_shots");
+ shots = autocvar_g_balance_crylink_primary_shots;
pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
proj = world;
while (counter < shots)
proj.realowner = proj.owner = self;
proj.classname = "spike";
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_crylink_primary_damage");
- if(counter == 0) { // first projectile, store in firstproj for now
+ proj.bot_dodgerating = autocvar_g_balance_crylink_primary_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
s_y = v_forward_x;
s_z = v_forward_y;
}
- s = s * cvar("g_balance_crylink_primary_spread") * g_weaponspreadfactor;
- W_SetupProjectileVelocityEx(proj, w_shotdir + right * s_y + up * s_z, v_up, cvar("g_balance_crylink_primary_speed"), 0, 0, 0);
+ s = s * autocvar_g_balance_crylink_primary_spread * g_weaponspreadfactor;
+ W_SetupProjectileVelocityEx(proj, w_shotdir + right * s_y + up * s_z, v_up, autocvar_g_balance_crylink_primary_speed, 0, 0, 0, FALSE);
proj.touch = W_Crylink_Touch;
proj.think = W_Crylink_Fadethink;
if(counter == 0)
{
- proj.fade_time = time + cvar("g_balance_crylink_primary_middle_lifetime");
- self.fade_rate = 1 / cvar("g_balance_crylink_primary_middle_fadetime");
- proj.nextthink = time + cvar("g_balance_crylink_primary_middle_lifetime") + cvar("g_balance_crylink_primary_middle_fadetime");
+ proj.fade_time = time + autocvar_g_balance_crylink_primary_middle_lifetime;
+ proj.fade_rate = 1 / autocvar_g_balance_crylink_primary_middle_fadetime;
+ proj.nextthink = time + autocvar_g_balance_crylink_primary_middle_lifetime + autocvar_g_balance_crylink_primary_middle_fadetime;
}
else
{
- proj.fade_time = time + cvar("g_balance_crylink_primary_other_lifetime");
- self.fade_rate = 1 / cvar("g_balance_crylink_primary_other_fadetime");
- proj.nextthink = time + cvar("g_balance_crylink_primary_other_lifetime") + cvar("g_balance_crylink_primary_other_fadetime");
+ proj.fade_time = time + autocvar_g_balance_crylink_primary_other_lifetime;
+ proj.fade_rate = 1 / autocvar_g_balance_crylink_primary_other_fadetime;
+ proj.nextthink = time + autocvar_g_balance_crylink_primary_other_lifetime + autocvar_g_balance_crylink_primary_other_fadetime;
}
- proj.cnt = cvar("g_balance_crylink_primary_bounces");
+ proj.teleport_time = time + autocvar_g_balance_crylink_primary_joindelay;
+ proj.cnt = autocvar_g_balance_crylink_primary_bounces;
//proj.scale = 1 + 1 * proj.cnt;
proj.angles = vectoangles (proj.velocity);
counter = counter + 1;
}
self.crylink_lastgroup = proj;
+ W_Crylink_CheckLinks(proj);
}
void W_Crylink_Attack2 (void)
{
local float counter, shots;
local entity proj, prevproj, firstproj;
+ float maxdmg;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_crylink_secondary_ammo;
+
+ maxdmg = autocvar_g_balance_crylink_secondary_damage*autocvar_g_balance_crylink_secondary_shots;
+ maxdmg *= 1 + autocvar_g_balance_crylink_secondary_bouncedamagefactor * autocvar_g_balance_crylink_secondary_bounces;
+ if(autocvar_g_balance_crylink_secondary_joinexplode)
+ maxdmg += autocvar_g_balance_crylink_secondary_joinexplode_damage;
- W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", (cvar("g_balance_crylink_secondary_damage")*cvar("g_balance_crylink_secondary_shots")));
+ W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CHAN_WEAPON, maxdmg);
- shots = cvar("g_balance_crylink_secondary_shots");
+ shots = autocvar_g_balance_crylink_secondary_shots;
pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
proj = world;
while (counter < shots)
proj.realowner = proj.owner = self;
proj.classname = "spike";
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_crylink_secondary_damage");
- if(counter == 0) { // first projectile, store in firstproj for now
+ proj.bot_dodgerating = autocvar_g_balance_crylink_secondary_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
setorigin (proj, w_shotorg);
setsize(proj, '0 0 0', '0 0 0');
- W_SetupProjectileVelocityEx(proj, (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * cvar("g_balance_crylink_secondary_spread") * g_weaponspreadfactor), v_up, cvar("g_balance_crylink_secondary_speed"), 0, 0, 0);
+ W_SetupProjectileVelocityEx(proj, (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * autocvar_g_balance_crylink_secondary_spread * g_weaponspreadfactor), v_up, autocvar_g_balance_crylink_secondary_speed, 0, 0, 0, FALSE);
proj.touch = W_Crylink_Touch2;
proj.think = W_Crylink_Fadethink;
if(counter == (shots - 1) / 2)
{
- proj.fade_time = time + cvar("g_balance_crylink_secondary_middle_lifetime");
- self.fade_rate = 1 / cvar("g_balance_crylink_secondary_middle_fadetime");
- proj.nextthink = time + cvar("g_balance_crylink_secondary_middle_lifetime") + cvar("g_balance_crylink_secondary_middle_fadetime");
+ proj.fade_time = time + autocvar_g_balance_crylink_secondary_middle_lifetime;
+ proj.fade_rate = 1 / autocvar_g_balance_crylink_secondary_middle_fadetime;
+ proj.nextthink = time + autocvar_g_balance_crylink_secondary_middle_lifetime + autocvar_g_balance_crylink_secondary_middle_fadetime;
}
else
{
- proj.fade_time = time + cvar("g_balance_crylink_secondary_line_lifetime");
- self.fade_rate = 1 / cvar("g_balance_crylink_secondary_line_fadetime");
- proj.nextthink = time + cvar("g_balance_crylink_secondary_line_lifetime") + cvar("g_balance_crylink_secondary_line_fadetime");
+ proj.fade_time = time + autocvar_g_balance_crylink_secondary_line_lifetime;
+ proj.fade_rate = 1 / autocvar_g_balance_crylink_secondary_line_fadetime;
+ proj.nextthink = time + autocvar_g_balance_crylink_secondary_line_lifetime + autocvar_g_balance_crylink_secondary_line_fadetime;
}
- proj.cnt = cvar("g_balance_crylink_secondary_bounces");
+ proj.teleport_time = time + autocvar_g_balance_crylink_secondary_joindelay;
+ proj.cnt = autocvar_g_balance_crylink_secondary_bounces;
//proj.scale = 1 + 1 * proj.cnt;
proj.angles = vectoangles (proj.velocity);
{
if (req == WR_AIM)
{
- if (random() > 0.15)
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_middle_lifetime"), FALSE);
+ if (random() < 0.10)
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_crylink_primary_speed, 0, autocvar_g_balance_crylink_primary_middle_lifetime, FALSE);
else
- self.BUTTON_ATCK2 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_middle_lifetime"), FALSE);
+ self.BUTTON_ATCK2 = bot_aim(autocvar_g_balance_crylink_secondary_speed, 0, autocvar_g_balance_crylink_secondary_middle_lifetime, FALSE);
}
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
{
if (!self.crylink_waitrelease)
- if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_crylink_primary_refire))
{
W_Crylink_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
- if(cvar("g_balance_crylink_primary_joinspeed") != 0)
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_crylink_primary_animtime, w_ready);
+ if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0)
self.crylink_waitrelease = 1;
}
}
- else if(self.BUTTON_ATCK2 && cvar("g_balance_crylink_secondary"))
+ else if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
{
if (!self.crylink_waitrelease)
- if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_crylink_secondary_refire))
{
W_Crylink_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
- if(cvar("g_balance_crylink_secondary_joinspeed") != 0)
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_crylink_secondary_animtime, w_ready);
+ if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0)
self.crylink_waitrelease = 2;
}
}
else
{
- if (self.crylink_waitrelease)
+ if (self.crylink_waitrelease && (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time))
{
// fired and released now!
if(self.crylink_lastgroup)
{
vector pos;
+ entity linkjoineffect;
+
if(self.crylink_waitrelease == 1)
{
- pos = W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_primary_joinspeed"));
+ pos = W_Crylink_LinkJoin(self.crylink_lastgroup, autocvar_g_balance_crylink_primary_joinspread * autocvar_g_balance_crylink_primary_speed, autocvar_g_balance_crylink_primary_jointime);
+
}
else
{
- pos = W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_secondary_joinspeed"));
+ pos = W_Crylink_LinkJoin(self.crylink_lastgroup, autocvar_g_balance_crylink_secondary_joinspread * autocvar_g_balance_crylink_secondary_speed, autocvar_g_balance_crylink_secondary_jointime);
}
- entity linkjoineffect;
linkjoineffect = spawn();
- linkjoineffect.classname = "linkjoineffect";
linkjoineffect.think = W_Crylink_LinkJoinEffect_Think;
+ linkjoineffect.classname = "linkjoineffect";
linkjoineffect.nextthink = time + w_crylink_linkjoin_time;
linkjoineffect.owner = self;
setorigin(linkjoineffect, pos);
// don't "run out of ammo" and switch weapons while waiting for release
if(self.crylink_lastgroup && self.crylink_waitrelease)
return TRUE;
- return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_crylink_primary_ammo;
}
else if (req == WR_CHECKAMMO2)
{
// don't "run out of ammo" and switch weapons while waiting for release
if(self.crylink_lastgroup && self.crylink_waitrelease)
return TRUE;
- return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_crylink_secondary_ammo;
}
return TRUE;
};
}
else if (req == WR_SUICIDEMESSAGE)
{
- w_deathtypestring = "%s succeeded at self-destructing themself with the Crylink";
+ w_deathtypestring = _("%s succeeded at self-destructing themself with the Crylink");
}
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_BOUNCE)
- w_deathtypestring = "%s could not hide from %s's Crylink"; // unchecked: SPLASH (SECONDARY can't be)
+ w_deathtypestring = _("%s could not hide from %s's Crylink"); // unchecked: SPLASH (SECONDARY can't be)
else if(w_deathtype & HITTYPE_SPLASH)
- w_deathtypestring = "%s was too close to %s's Crylink"; // unchecked: SECONDARY
+ w_deathtypestring = _("%s was too close to %s's Crylink"); // unchecked: SECONDARY
else
- w_deathtypestring = "%s took a close look at %s's Crylink"; // unchecked: SECONDARY
+ w_deathtypestring = _("%s took a close look at %s's Crylink"); // unchecked: SECONDARY
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(ELECTRO, w_electro, IT_CELLS, 5, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "electro", "electro", "Electro");
+REGISTER_WEAPON(ELECTRO, w_electro, IT_CELLS, 5, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "electro", "electro", _("Electro"));
#else
#ifdef SVQC
.float electro_count;
e.takedamage = DAMAGE_NO;
e.classname = "plasma_chain";
e.think = W_Plasma_Explode_Combo;
- e.nextthink = time + vlen(e.WarpZone_findradius_dist) / cvar("g_balance_electro_combo_speed"); // delay combo chains, looks cooler
+ e.nextthink = time + vlen(e.WarpZone_findradius_dist) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler
}
e = e.chain;
}
self.takedamage = DAMAGE_NO;
if (self.movetype == MOVETYPE_BOUNCE)
{
- RadiusDamage (self, self.owner, cvar("g_balance_electro_secondary_damage"), cvar("g_balance_electro_secondary_edgedamage"), cvar("g_balance_electro_secondary_radius"), world, cvar("g_balance_electro_secondary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
}
else
{
- W_Plasma_TriggerCombo(self.origin, cvar("g_balance_electro_primary_comboradius"), self.owner);
- RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), self.projectiledeathtype, other);
+ W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.owner);
+ RadiusDamage (self, self.owner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
}
remove (self);
void W_Plasma_Explode_Combo (void)
{
- W_Plasma_TriggerCombo(self.origin, cvar("g_balance_electro_combo_comboradius"), self.owner);
+ W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.owner);
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
+ RadiusDamage (self, self.owner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
remove (self);
}
void W_Plasma_Touch (void)
{
+ //self.velocity = self.velocity * 0.1;
+
PROJECTILE_TOUCH;
if (other.takedamage == DAMAGE_AIM) {
W_Plasma_Explode ();
} else {
+ //UpdateCSQCProjectile(self);
spamsound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
self.projectiledeathtype |= HITTYPE_BOUNCE;
}
self.owner = inflictor.owner;
self.classname = "plasma_chain";
self.think = W_Plasma_Explode_Combo;
- self.nextthink = time + min(cvar("g_balance_electro_combo_radius"), vlen(self.origin - inflictor.origin)) / cvar("g_balance_electro_combo_speed"); // delay combo chains, looks cooler
+ self.nextthink = time + min(autocvar_g_balance_electro_combo_radius, vlen(self.origin - inflictor.origin)) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bounding the length, because inflictor may be in a galaxy far far away (warpzones)
}
else
{
local entity proj;
- W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", cvar("g_balance_electro_primary_damage"));
+ W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CHAN_WEAPON, autocvar_g_balance_electro_primary_damage);
pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
proj.classname = "plasma_prim";
proj.owner = self;
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_electro_primary_damage");
+ proj.bot_dodgerating = autocvar_g_balance_electro_primary_damage;
proj.use = W_Plasma_Explode;
proj.think = adaptor_think2use_hittype_splash;
- proj.nextthink = time + cvar("g_balance_electro_primary_lifetime");
+ proj.nextthink = time + autocvar_g_balance_electro_primary_lifetime;
PROJECTILE_MAKETRIGGER(proj);
proj.projectiledeathtype = WEP_ELECTRO;
setorigin(proj, w_shotorg);
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_primary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_electro_primary_ammo;
proj.movetype = MOVETYPE_FLY;
W_SETUPPROJECTILEVELOCITY(proj, g_balance_electro_primary);
proj.angles = vectoangles(proj.velocity);
{
local entity proj;
- W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", cvar("g_balance_electro_secondary_damage"));
+ W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CHAN_WEAPON, autocvar_g_balance_electro_secondary_damage);
+
w_shotdir = v_forward; // no TrueAim for grenades please
pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
proj.use = W_Plasma_Explode;
proj.think = adaptor_think2use_hittype_splash;
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_electro_secondary_damage");
- proj.nextthink = time + cvar("g_balance_electro_secondary_lifetime");
+ proj.bot_dodgerating = autocvar_g_balance_electro_secondary_damage;
+ proj.nextthink = time + autocvar_g_balance_electro_secondary_lifetime;
PROJECTILE_MAKETRIGGER(proj);
proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY;
setorigin(proj, w_shotorg);
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_secondary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_electro_secondary_ammo;
//proj.glow_size = 50;
//proj.glow_color = 45;
proj.movetype = MOVETYPE_BOUNCE;
proj.touch = W_Plasma_Touch;
setsize(proj, '0 0 -4', '0 0 -4');
proj.takedamage = DAMAGE_YES;
- proj.damageforcescale = cvar("g_balance_electro_secondary_damageforcescale");
- proj.health = cvar("g_balance_electro_secondary_health");
+ proj.damageforcescale = autocvar_g_balance_electro_secondary_damageforcescale;
+ proj.health = autocvar_g_balance_electro_secondary_health;
proj.event_damage = W_Plasma_Damage;
proj.flags = FL_PROJECTILE;
+ proj.bouncefactor = autocvar_g_balance_electro_secondary_bouncefactor;
+ proj.bouncestop = autocvar_g_balance_electro_secondary_bouncestop;
+
#if 0
entity p2;
p2 = spawn();
CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound
other = proj; MUTATOR_CALLHOOK(EditProjectile);
-}
+ }
.vector hook_start, hook_end;
float lgbeam_send(entity to, float sf)
if(sf & 1)
{
WriteByte(MSG_ENTITY, num_for_edict(self.owner));
- WriteCoord(MSG_ENTITY, cvar("g_balance_electro_primary_range"));
+ WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range);
}
if(sf & 2)
{
remove(self);
return;
}
- if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
+ if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || self.owner.freezetag_frozen)
{
if(self == self.owner.lgbeam)
self.owner.lgbeam = world;
dt = frametime;
if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
{
- if(cvar("g_balance_electro_primary_ammo"))
+ if(autocvar_g_balance_electro_primary_ammo)
{
- dt = min(dt, self.owner.ammo_cells / cvar("g_balance_electro_primary_ammo"));
- self.owner.ammo_cells = max(0, self.owner.ammo_cells - cvar("g_balance_electro_primary_ammo") * frametime);
+ dt = min(dt, self.owner.ammo_cells / autocvar_g_balance_electro_primary_ammo);
+ self.owner.ammo_cells = max(0, self.owner.ammo_cells - autocvar_g_balance_electro_primary_ammo * frametime);
}
}
- W_SetupShot_Range(self.owner, TRUE, 0, "", cvar("g_balance_electro_primary_damage") * dt, cvar("g_balance_electro_primary_range"));
+ W_SetupShot_Range(self.owner, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range);
WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
// apply the damage
if(trace_ent)
{
vector force;
- force = w_shotdir * cvar("g_balance_electro_primary_force") + '0 0 1' * cvar("g_balance_electro_primary_force_up");
+ force = w_shotdir * autocvar_g_balance_electro_primary_force + '0 0 1' * autocvar_g_balance_electro_primary_force_up;
- f = ExponentialFalloff(cvar("g_balance_electro_primary_falloff_mindist"), cvar("g_balance_electro_primary_falloff_maxdist"), cvar("g_balance_electro_primary_falloff_halflifedist"), vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - w_shotorg));
+ f = ExponentialFalloff(autocvar_g_balance_electro_primary_falloff_mindist, autocvar_g_balance_electro_primary_falloff_maxdist, autocvar_g_balance_electro_primary_falloff_halflifedist, vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - w_shotorg));
- Damage (trace_ent, self.owner, self.owner, cvar("g_balance_electro_primary_damage") * dt * f, WEP_ELECTRO, trace_endpos, force * dt);
- Damage_RecordDamage(self.owner, WEP_ELECTRO, cvar("g_balance_electro_primary_damage") * dt * f);
+ if(accuracy_isgooddamage(self.owner, trace_ent))
+ accuracy_add(self.owner, WEP_ELECTRO, 0, autocvar_g_balance_electro_primary_damage * dt * f);
+ Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_electro_primary_damage * dt * f, WEP_ELECTRO, trace_endpos, force * dt);
}
- W_Plasma_TriggerCombo(trace_endpos, cvar("g_balance_electro_primary_comboradius"), self.owner);
+ W_Plasma_TriggerCombo(trace_endpos, autocvar_g_balance_electro_primary_comboradius, self.owner);
// draw effect
if(w_shotorg != self.hook_start)
{
// only play fire sound if 0.5 sec has passed since player let go the fire button
if(time - self.prevlgfire > 0.5)
- {
sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
- }
entity beam, oldself;
self.lgbeam = beam = spawn();
+ beam.classname = "lgbeam";
beam.solid = SOLID_NOT;
beam.think = lgbeam_think;
beam.owner = self;
beam.movetype = MOVETYPE_NONE;
beam.shot_spread = 0;
beam.bot_dodge = TRUE;
- beam.bot_dodgerating = cvar("g_balance_electro_primary_damage");
+ beam.bot_dodgerating = autocvar_g_balance_electro_primary_damage;
Net_LinkEntity(beam, FALSE, 0, lgbeam_send);
oldself = self;
{
W_Electro_Attack2();
self.electro_count -= 1;
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_electro_secondary_animtime"), w_electro_checkattack);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_electro_secondary_animtime, w_electro_checkattack);
return;
}
self.bot_secondary_electromooth = 0;
if(self.bot_secondary_electromooth == 0)
{
- if(bot_aim(cvar("g_balance_electro_primary_speed"), 0, cvar("g_balance_electro_primary_lifetime"), FALSE))
+ float shoot;
+
+ if(autocvar_g_balance_electro_primary_speed)
+ shoot = bot_aim(autocvar_g_balance_electro_primary_speed, 0, autocvar_g_balance_electro_primary_lifetime, FALSE);
+ else
+ shoot = bot_aim(1000000, 0, 0.001, FALSE);
+
+ if(shoot)
{
self.BUTTON_ATCK = TRUE;
if(random() < 0.01) self.bot_secondary_electromooth = 1;
}
else
{
- if(bot_aim(cvar("g_balance_electro_secondary_speed"), cvar("g_balance_grenadelauncher_secondary_speed_up"), cvar("g_balance_electro_secondary_lifetime"), TRUE))
+ if(bot_aim(autocvar_g_balance_electro_secondary_speed, autocvar_g_balance_grenadelauncher_secondary_speed_up, autocvar_g_balance_electro_secondary_lifetime, TRUE))
{
self.BUTTON_ATCK2 = TRUE;
if(random() < 0.03) self.bot_secondary_electromooth = 0;
{
if (self.BUTTON_ATCK)
{
- if (weapon_prepareattack(0, (cvar("g_balance_electro_lightning") ? 0 : cvar("g_balance_electro_primary_refire"))))
+ if(autocvar_g_balance_electro_lightning)
+ if(self.BUTTON_ATCK_prev)
+ {
+ // prolong the animtime while the gun is being fired
+ if(self.animstate_startframe == self.anim_shoot_x && self.animstate_numframes == self.anim_shoot_y)
+ weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_electro_primary_animtime, w_ready);
+ else
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready);
+ }
+ if (weapon_prepareattack(0, (autocvar_g_balance_electro_lightning ? 0 : autocvar_g_balance_electro_primary_refire)))
{
- if(cvar("g_balance_electro_lightning"))
+ if(autocvar_g_balance_electro_lightning)
{
if ((!self.lgbeam) || wasfreed(self.lgbeam))
{
W_Electro_Attack3();
}
- self.BUTTON_ATCK_prev = 1;
+ if(!self.BUTTON_ATCK_prev)
+ {
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready);
+ self.BUTTON_ATCK_prev = 1;
+ }
}
else
{
W_Electro_Attack();
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready);
}
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_electro_primary_animtime"), w_ready);
}
} else {
- if(cvar("g_balance_electro_lightning"))
+ if(autocvar_g_balance_electro_lightning)
{
if (self.BUTTON_ATCK_prev != 0)
{
- ATTACK_FINISHED(self) = time + cvar("g_balance_electro_primary_refire") * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_electro_primary_animtime, w_ready);
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_electro_primary_refire * W_WeaponRateFactor();
}
self.BUTTON_ATCK_prev = 0;
}
if (self.BUTTON_ATCK2)
if (time >= self.electro_secondarytime)
- if (weapon_prepareattack(1, cvar("g_balance_electro_secondary_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_electro_secondary_refire))
{
W_Electro_Attack2();
- self.electro_count = cvar("g_balance_electro_secondary_count");
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_electro_secondary_animtime"), w_electro_checkattack);
- self.electro_secondarytime = time + cvar("g_balance_electro_secondary_refire2");
+ self.electro_count = autocvar_g_balance_electro_secondary_count;
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_electro_secondary_animtime, w_electro_checkattack);
+ self.electro_secondarytime = time + autocvar_g_balance_electro_secondary_refire2 * W_WeaponRateFactor();
}
}
else if (req == WR_PRECACHE)
precache_sound ("weapons/electro_fire2.wav");
precache_sound ("weapons/electro_impact.wav");
precache_sound ("weapons/electro_impact_combo.wav");
- if(cvar("g_balance_electro_lightning"))
+ if(autocvar_g_balance_electro_lightning)
{
precache_sound ("weapons/lgbeam_fire.wav");
}
weapon_setup(WEP_ELECTRO);
else if (req == WR_CHECKAMMO1)
{
- if(cvar("g_balance_electro_lightning"))
- return !cvar("g_balance_electro_primary_ammo") || (self.ammo_cells > 0);
+ if(autocvar_g_balance_electro_lightning)
+ return !autocvar_g_balance_electro_primary_ammo || (self.ammo_cells > 0);
else
- return self.ammo_cells >= cvar("g_balance_electro_primary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_electro_primary_ammo;
}
else if (req == WR_CHECKAMMO2)
- return self.ammo_cells >= cvar("g_balance_electro_secondary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo;
else if (req == WR_RESETPLAYER)
{
self.electro_secondarytime = time;
else if (req == WR_SUICIDEMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s could not remember where they put plasma";
+ w_deathtypestring = _("%s could not remember where they put plasma");
else
- w_deathtypestring = "%s played with plasma";
+ w_deathtypestring = _("%s played with plasma");
}
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
{
if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE
- w_deathtypestring = "%s just noticed %s's blue ball";
+ w_deathtypestring = _("%s just noticed %s's blue ball");
else // unchecked: BOUNCE
- w_deathtypestring = "%s got in touch with %s's blue ball";
+ w_deathtypestring = _("%s got in touch with %s's blue ball");
}
else
{
if(w_deathtype & HITTYPE_BOUNCE) // combo
- w_deathtypestring = "%s felt the electrifying air of %s's combo";
+ w_deathtypestring = _("%s felt the electrifying air of %s's combo");
else if(w_deathtype & HITTYPE_SPLASH)
- w_deathtypestring = "%s got too close to %s's blue beam";
+ w_deathtypestring = _("%s got too close to %s's blue beam");
else
- w_deathtypestring = "%s was blasted by %s's blue beam";
+ w_deathtypestring = _("%s was blasted by %s's blue beam");
}
}
return TRUE;
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(FIREBALL, w_fireball, IT_FUEL, 9, WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "fireball", "fireball", "Fireball");
+REGISTER_WEAPON(FIREBALL, w_fireball, IT_FUEL, 9, WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "fireball", "fireball", _("Fireball"));
#else
#ifdef SVQC
.float bot_primary_fireballmooth; // whatever a mooth is
// 1. dist damage
d = (self.owner.health + self.owner.armorvalue);
- RadiusDamage (self, self.realowner, cvar("g_balance_fireball_primary_damage"), cvar("g_balance_fireball_primary_edgedamage"), cvar("g_balance_fireball_primary_radius"), world, cvar("g_balance_fireball_primary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_fireball_primary_damage, autocvar_g_balance_fireball_primary_edgedamage, autocvar_g_balance_fireball_primary_radius, world, autocvar_g_balance_fireball_primary_force, self.projectiledeathtype, other);
if(self.realowner.health + self.realowner.armorvalue >= d)
if(!self.cnt)
{
- modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, cvar("g_balance_fireball_primary_bfgradius"), 0.2, 0.05, 0.25);
+ modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, autocvar_g_balance_fireball_primary_bfgradius, 0.2, 0.05, 0.25);
// 2. bfg effect
// NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
- for(e = findradius(self.origin, cvar("g_balance_fireball_primary_bfgradius")); e; e = e.chain)
+ for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain)
if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
{
// can we see fireball?
if(/* trace_startsolid || */ trace_fraction != 1)
continue;
dist = vlen(self.origin - e.origin - e.view_ofs);
- points = (1 - sqrt(dist / cvar("g_balance_fireball_primary_bfgradius")));
+ points = (1 - sqrt(dist / autocvar_g_balance_fireball_primary_bfgradius));
if(points <= 0)
continue;
dir = normalize(e.origin + e.view_ofs - self.origin);
- Damage(e, self, self.realowner, cvar("g_balance_fireball_primary_bfgdamage") * points, self.projectiledeathtype | HITTYPE_BOUNCE | HITTYPE_SPLASH, e.origin + e.view_ofs, cvar("g_balance_fireball_primary_bfgforce") * dir);
- pointparticles(particleeffectnum("fireball_bfgdamage"), e.origin, -1 * dir, 1);
- Damage_RecordDamage(self.owner, self.projectiledeathtype, cvar("g_balance_fireball_primary_bfgdamage") * points);
+ if(accuracy_isgooddamage(self.realowner, e))
+ accuracy_add(self.realowner, WEP_FIREBALL, 0, autocvar_g_balance_fireball_primary_bfgdamage * points);
+
+ Damage(e, self, self.realowner, autocvar_g_balance_fireball_primary_bfgdamage * points, self.projectiledeathtype | HITTYPE_BOUNCE | HITTYPE_SPLASH, e.origin + e.view_ofs, autocvar_g_balance_fireball_primary_bfgforce * dir);
+ pointparticles(particleeffectnum("fireball_bfgdamage"), e.origin, -1 * dir, 1);
}
}
return;
}
- W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_primary_laserradius"), cvar("g_balance_fireball_primary_laserdamage"), cvar("g_balance_fireball_primary_laseredgedamage"), cvar("g_balance_fireball_primary_laserburntime"));
+ W_Fireball_LaserPlay(0.1, autocvar_g_balance_fireball_primary_laserradius, autocvar_g_balance_fireball_primary_laserdamage, autocvar_g_balance_fireball_primary_laseredgedamage, autocvar_g_balance_fireball_primary_laserburntime);
self.nextthink = time + 0.1;
}
{
local entity proj;
- W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", cvar("g_balance_fireball_primary_damage") + cvar("g_balance_fireball_primary_bfgdamage"));
+ W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", CHAN_WEAPON, autocvar_g_balance_fireball_primary_damage + autocvar_g_balance_fireball_primary_bfgdamage);
pointparticles(particleeffectnum("fireball_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
proj.classname = "plasma_prim";
proj.owner = proj.realowner = self;
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_fireball_primary_damage");
- proj.pushltime = time + cvar("g_balance_fireball_primary_lifetime");
+ proj.bot_dodgerating = autocvar_g_balance_fireball_primary_damage;
+ proj.pushltime = time + autocvar_g_balance_fireball_primary_lifetime;
proj.use = W_Fireball_Explode;
proj.think = W_Fireball_Think;
proj.nextthink = time;
- proj.health = cvar("g_balance_fireball_primary_health");
+ proj.health = autocvar_g_balance_fireball_primary_health;
proj.team = self.team;
proj.event_damage = W_Fireball_Damage;
proj.takedamage = DAMAGE_YES;
- proj.damageforcescale = cvar("g_balance_fireball_primary_damageforcescale");
+ proj.damageforcescale = autocvar_g_balance_fireball_primary_damageforcescale;
PROJECTILE_MAKETRIGGER(proj);
proj.projectiledeathtype = WEP_FIREBALL;
setorigin(proj, w_shotorg);
void W_Fireball_AttackEffect(float i, vector f_diff)
{
- W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 0, "", 0);
+ W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 0, "", 0, 0);
w_shotorg += f_diff_x * v_up + f_diff_y * v_right;
pointparticles(particleeffectnum("fireball_preattack_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
}
void W_Fireball_Attack1_Frame4()
{
W_Fireball_Attack1();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, w_ready);
}
void W_Fireball_Attack1_Frame3()
{
W_Fireball_AttackEffect(0, '+1.25 +3.75 0');
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame4);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame4);
}
void W_Fireball_Attack1_Frame2()
{
W_Fireball_AttackEffect(0, '-1.25 +3.75 0');
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame3);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame3);
}
void W_Fireball_Attack1_Frame1()
{
W_Fireball_AttackEffect(1, '+1.25 -3.75 0');
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame2);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame2);
}
void W_Fireball_Attack1_Frame0()
{
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_fuel = self.ammo_fuel - cvar("g_balance_fireball_primary_ammo");
+ self.ammo_fuel = self.ammo_fuel - autocvar_g_balance_fireball_primary_ammo;
W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
sound (self, CHAN_WEAPON, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame1);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame1);
}
void W_Firemine_Think()
// make it "hot" once it leaves its owner
if(self.owner)
{
- if(vlen(self.origin - self.owner.origin - self.owner.view_ofs) > cvar("g_balance_fireball_secondary_laserradius"))
+ if(vlen(self.origin - self.owner.origin - self.owner.view_ofs) > autocvar_g_balance_fireball_secondary_laserradius)
{
self.cnt += 1;
if(self.cnt == 3)
self.cnt = 0;
}
- W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_secondary_laserradius"), cvar("g_balance_fireball_secondary_laserdamage"), cvar("g_balance_fireball_secondary_laseredgedamage"), cvar("g_balance_fireball_secondary_laserburntime"));
+ W_Fireball_LaserPlay(0.1, autocvar_g_balance_fireball_secondary_laserradius, autocvar_g_balance_fireball_secondary_laserdamage, autocvar_g_balance_fireball_secondary_laseredgedamage, autocvar_g_balance_fireball_secondary_laserburntime);
self.nextthink = time + 0.1;
}
{
PROJECTILE_TOUCH;
if (other.takedamage == DAMAGE_AIM)
- if(Fire_AddDamage(other, self.realowner, cvar("g_balance_fireball_secondary_damage"), cvar("g_balance_fireball_secondary_damagetime"), self.projectiledeathtype | HITTYPE_HEADSHOT) >= 0)
+ if(Fire_AddDamage(other, self.realowner, autocvar_g_balance_fireball_secondary_damage, autocvar_g_balance_fireball_secondary_damagetime, self.projectiledeathtype | HITTYPE_HEADSHOT) >= 0)
{
remove(self);
return;
float c;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_fuel = self.ammo_fuel - cvar("g_balance_fireball_secondary_ammo");
+ self.ammo_fuel = self.ammo_fuel - autocvar_g_balance_fireball_secondary_ammo;
c = mod(self.bulletcounter, 4);
switch(c)
f_diff = '+1.25 +3.75 0';
break;
}
- W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", cvar("g_balance_fireball_secondary_damage"));
+ W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", CHAN_WEAPON, autocvar_g_balance_fireball_secondary_damage);
traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, self);
w_shotorg = trace_endpos;
proj.owner = proj.realowner = self;
proj.classname = "grenade";
proj.bot_dodge = TRUE;
- proj.bot_dodgerating = cvar("g_balance_fireball_secondary_damage");
+ proj.bot_dodgerating = autocvar_g_balance_fireball_secondary_damage;
proj.movetype = MOVETYPE_BOUNCE;
proj.projectiledeathtype = WEP_FIREBALL | HITTYPE_SECONDARY;
proj.touch = W_Firemine_Touch;
setorigin(proj, w_shotorg);
proj.think = W_Firemine_Think;
proj.nextthink = time;
- proj.damageforcescale = cvar("g_balance_fireball_secondary_damageforcescale");
- proj.pushltime = time + cvar("g_balance_fireball_secondary_lifetime");
+ proj.damageforcescale = autocvar_g_balance_fireball_secondary_damageforcescale;
+ proj.pushltime = time + autocvar_g_balance_fireball_secondary_lifetime;
W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_fireball_secondary);
proj.angles = vectoangles(proj.velocity);
self.BUTTON_ATCK2 = FALSE;
if (self.bot_primary_fireballmooth == 0)
{
- if(bot_aim(cvar("g_balance_fireball_primary_speed"), 0, cvar("g_balance_fireball_primary_lifetime"), FALSE))
+ if(bot_aim(autocvar_g_balance_fireball_primary_speed, 0, autocvar_g_balance_fireball_primary_lifetime, FALSE))
{
self.BUTTON_ATCK = TRUE;
if(random() < 0.02) self.bot_primary_fireballmooth = 0;
}
else
{
- if(bot_aim(cvar("g_balance_fireball_secondary_speed"), cvar("g_balance_fireball_secondary_speed_up"), cvar("g_balance_fireball_secondary_lifetime"), TRUE))
+ if(bot_aim(autocvar_g_balance_fireball_secondary_speed, autocvar_g_balance_fireball_secondary_speed_up, autocvar_g_balance_fireball_secondary_lifetime, TRUE))
{
self.BUTTON_ATCK2 = TRUE;
if(random() < 0.01) self.bot_primary_fireballmooth = 1;
{
if (self.BUTTON_ATCK)
if (time >= self.fireball_primarytime)
- if (weapon_prepareattack(0, cvar("g_balance_fireball_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_fireball_primary_refire))
{
W_Fireball_Attack1_Frame0();
- self.fireball_primarytime = time + cvar("g_balance_fireball_primary_refire2");
+ self.fireball_primarytime = time + autocvar_g_balance_fireball_primary_refire2;
}
if (self.BUTTON_ATCK2)
- if (weapon_prepareattack(1, cvar("g_balance_fireball_secondary_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_fireball_secondary_refire))
{
W_Fireball_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_fireball_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_fireball_secondary_animtime, w_ready);
}
}
else if (req == WR_PRECACHE)
else if (req == WR_SETUP)
weapon_setup(WEP_FIREBALL);
else if (req == WR_CHECKAMMO1)
- return self.ammo_fuel >= cvar("g_balance_fireball_primary_ammo");
+ return self.ammo_fuel >= autocvar_g_balance_fireball_primary_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_fuel >= cvar("g_balance_fireball_secondary_ammo");
+ return self.ammo_fuel >= autocvar_g_balance_fireball_secondary_ammo;
else if (req == WR_RESETPLAYER)
{
self.fireball_primarytime = time;
else if (req == WR_SUICIDEMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s forgot about some firemine";
+ w_deathtypestring = _("%s forgot about some firemine");
else
- w_deathtypestring = "%s should have used a smaller gun";
+ w_deathtypestring = _("%s should have used a smaller gun");
}
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
{
if(w_deathtype & HITTYPE_HEADSHOT)
- w_deathtypestring = "%s tried to catch %s's firemine";
+ w_deathtypestring = _("%s tried to catch %s's firemine");
else
- w_deathtypestring = "%s fatefully ignored %s's firemine";
+ w_deathtypestring = _("%s fatefully ignored %s's firemine");
}
else
{
if(w_deathtype & HITTYPE_BOUNCE)
{
if(w_deathtype & HITTYPE_SPLASH) // BFG effect
- w_deathtypestring = "%s could not hide from %s's fireball";
+ w_deathtypestring = _("%s could not hide from %s's fireball");
else // laser
- w_deathtypestring = "%s saw the pretty lights of %s's fireball";
+ w_deathtypestring = _("%s saw the pretty lights of %s's fireball");
}
else if(w_deathtype & HITTYPE_SPLASH)
- w_deathtypestring = "%s got too close to %s's fireball";
+ w_deathtypestring = _("%s got too close to %s's fireball");
else
- w_deathtypestring = "%s tasted %s's fireball";
+ w_deathtypestring = _("%s tasted %s's fireball");
}
}
return TRUE;
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "gl", "grenadelauncher", "Mortar");
+REGISTER_WEAPON(GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "gl", "grenadelauncher", _("Mortar"))
#else
#ifdef SVQC
.float gl_detonate_later;
if(self.movetype == MOVETYPE_NONE)
self.velocity = self.oldvelocity;
- RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
remove (self);
}
if(self.movetype == MOVETYPE_NONE)
self.velocity = self.oldvelocity;
- RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
remove (self);
}
W_Grenade_Explode ();
return;
}
- if(self.gl_detonate_later && self.gl_bouncecnt >= cvar("g_balance_grenadelauncher_primary_remote_minbouncecnt"))
+ if(self.gl_detonate_later && self.gl_bouncecnt >= autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt)
W_Grenade_Explode();
}
void W_Grenade_Touch1 (void)
{
PROJECTILE_TOUCH;
- if (other.takedamage == DAMAGE_AIM || cvar("g_balance_grenadelauncher_primary_type") == 0) // always explode when hitting a player, or if normal mortar projectile
+ if (other.takedamage == DAMAGE_AIM || autocvar_g_balance_grenadelauncher_primary_type == 0) // always explode when hitting a player, or if normal mortar projectile
{
self.use ();
}
- else if (cvar("g_balance_grenadelauncher_primary_type") == 1) // bounce
+ else if (autocvar_g_balance_grenadelauncher_primary_type == 1) // bounce
{
float r;
r = random() * 6;
self.projectiledeathtype |= HITTYPE_BOUNCE;
self.gl_bouncecnt += 1;
}
- else if(cvar("g_balance_grenadelauncher_primary_type") == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
+ else if(autocvar_g_balance_grenadelauncher_primary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
{
spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
// do not respond to any more touches
self.solid = SOLID_NOT;
- self.nextthink = min(self.nextthink, time + cvar("g_balance_grenadelauncher_primary_lifetime2"));
+ self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_primary_lifetime2);
}
}
void W_Grenade_Touch2 (void)
{
PROJECTILE_TOUCH;
- if (other.takedamage == DAMAGE_AIM || cvar("g_balance_grenadelauncher_secondary_type") == 0) // always explode when hitting a player, or if normal mortar projectile
+ if (other.takedamage == DAMAGE_AIM || autocvar_g_balance_grenadelauncher_secondary_type == 0) // always explode when hitting a player, or if normal mortar projectile
{
self.use ();
}
- else if (cvar("g_balance_grenadelauncher_secondary_type") == 1) // bounce
+ else if (autocvar_g_balance_grenadelauncher_secondary_type == 1) // bounce
{
float r;
r = random() * 6;
self.projectiledeathtype |= HITTYPE_BOUNCE;
self.gl_bouncecnt += 1;
}
- else if(cvar("g_balance_grenadelauncher_secondary_type") == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
+ else if(autocvar_g_balance_grenadelauncher_secondary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
{
spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
// do not respond to any more touches
self.solid = SOLID_NOT;
- self.nextthink = min(self.nextthink, time + cvar("g_balance_grenadelauncher_secondary_lifetime2"));
+ self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_secondary_lifetime2);
}
}
local entity gren;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo");
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", cvar("g_balance_grenadelauncher_primary_damage"));
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_grenadelauncher_primary_ammo;
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_primary_damage);
w_shotdir = v_forward; // no TrueAim for grenades please
pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
gren.owner = self;
gren.classname = "grenade";
gren.bot_dodge = TRUE;
- gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
+ gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_primary_damage;
gren.movetype = MOVETYPE_BOUNCE;
- gren.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor");
- gren.bouncestop = cvar("g_balance_grenadelauncher_bouncestop");
+ gren.bouncefactor = autocvar_g_balance_grenadelauncher_bouncefactor;
+ gren.bouncestop = autocvar_g_balance_grenadelauncher_bouncestop;
PROJECTILE_MAKETRIGGER(gren);
gren.projectiledeathtype = WEP_GRENADE_LAUNCHER;
setorigin(gren, w_shotorg);
setsize(gren, '-3 -3 -3', '3 3 3');
- gren.cnt = time + cvar("g_balance_grenadelauncher_primary_lifetime");
+ gren.cnt = time + autocvar_g_balance_grenadelauncher_primary_lifetime;
gren.nextthink = time;
gren.think = W_Grenade_Think1;
gren.use = W_Grenade_Explode;
gren.touch = W_Grenade_Touch1;
gren.takedamage = DAMAGE_YES;
- gren.health = cvar("g_balance_grenadelauncher_primary_health");
- gren.damageforcescale = cvar("g_balance_grenadelauncher_primary_damageforcescale");
+ gren.health = autocvar_g_balance_grenadelauncher_primary_health;
+ gren.damageforcescale = autocvar_g_balance_grenadelauncher_primary_damageforcescale;
gren.event_damage = W_Grenade_Damage;
W_SETUPPROJECTILEVELOCITY_UP(gren, g_balance_grenadelauncher_primary);
gren.angles = vectoangles (gren.velocity);
gren.flags = FL_PROJECTILE;
- if(cvar("g_balance_grenadelauncher_primary_type") == 0 || cvar("g_balance_grenadelauncher_primary_type") == 2)
+ if(autocvar_g_balance_grenadelauncher_primary_type == 0 || autocvar_g_balance_grenadelauncher_primary_type == 2)
CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
else
CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
local entity gren;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo");
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", cvar("g_balance_grenadelauncher_secondary_damage"));
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_grenadelauncher_secondary_ammo;
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_secondary_damage);
w_shotdir = v_forward; // no TrueAim for grenades please
pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
gren.owner = self;
gren.classname = "grenade";
gren.bot_dodge = TRUE;
- gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
+ gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_secondary_damage;
gren.movetype = MOVETYPE_BOUNCE;
- gren.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor");
- gren.bouncestop = cvar("g_balance_grenadelauncher_bouncestop");
+ gren.bouncefactor = autocvar_g_balance_grenadelauncher_bouncefactor;
+ gren.bouncestop = autocvar_g_balance_grenadelauncher_bouncestop;
PROJECTILE_MAKETRIGGER(gren);
gren.projectiledeathtype = WEP_GRENADE_LAUNCHER | HITTYPE_SECONDARY;
setorigin(gren, w_shotorg);
setsize(gren, '-3 -3 -3', '3 3 3');
- gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
+ gren.nextthink = time + autocvar_g_balance_grenadelauncher_secondary_lifetime;
gren.think = adaptor_think2use_hittype_splash;
gren.use = W_Grenade_Explode2;
gren.touch = W_Grenade_Touch2;
gren.takedamage = DAMAGE_YES;
- gren.health = cvar("g_balance_grenadelauncher_secondary_health");
- gren.damageforcescale = cvar("g_balance_grenadelauncher_secondary_damageforcescale");
+ gren.health = autocvar_g_balance_grenadelauncher_secondary_health;
+ gren.damageforcescale = autocvar_g_balance_grenadelauncher_secondary_damageforcescale;
gren.event_damage = W_Grenade_Damage;
W_SETUPPROJECTILEVELOCITY_UP(gren, g_balance_grenadelauncher_secondary);
gren.angles = vectoangles (gren.velocity);
gren.flags = FL_PROJECTILE;
- if(cvar("g_balance_grenadelauncher_secondary_type") == 0 || cvar("g_balance_grenadelauncher_secondary_type") == 2)
+ if(autocvar_g_balance_grenadelauncher_secondary_type == 0 || autocvar_g_balance_grenadelauncher_secondary_type == 2)
CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
else
CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
self.BUTTON_ATCK2 = FALSE;
if (self.bot_secondary_grenademooth == 0)
{
- if(bot_aim(cvar("g_balance_grenadelauncher_primary_speed"), cvar("g_balance_grenadelauncher_primary_speed_up"), cvar("g_balance_grenadelauncher_primary_lifetime"), TRUE))
+ if(bot_aim(autocvar_g_balance_grenadelauncher_primary_speed, autocvar_g_balance_grenadelauncher_primary_speed_up, autocvar_g_balance_grenadelauncher_primary_lifetime, TRUE))
{
self.BUTTON_ATCK = TRUE;
if(random() < 0.01) self.bot_secondary_grenademooth = 1;
}
else
{
- if(bot_aim(cvar("g_balance_grenadelauncher_secondary_speed"), cvar("g_balance_grenadelauncher_secondary_speed_up"), cvar("g_balance_grenadelauncher_secondary_lifetime"), TRUE))
+ if(bot_aim(autocvar_g_balance_grenadelauncher_secondary_speed, autocvar_g_balance_grenadelauncher_secondary_speed_up, autocvar_g_balance_grenadelauncher_secondary_lifetime, TRUE))
{
self.BUTTON_ATCK2 = TRUE;
if(random() < 0.02) self.bot_secondary_grenademooth = 0;
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_grenadelauncher_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_grenadelauncher_primary_refire))
{
W_Grenade_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grenadelauncher_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_grenadelauncher_primary_animtime, w_ready);
}
if (self.BUTTON_ATCK2)
{
if(nadefound)
sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
}
- else if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
+ else if (weapon_prepareattack(1, autocvar_g_balance_grenadelauncher_secondary_refire))
{
W_Grenade_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_grenadelauncher_secondary_animtime, w_ready);
}
}
}
else if (req == WR_SETUP)
weapon_setup(WEP_GRENADE_LAUNCHER);
else if (req == WR_CHECKAMMO1)
- return self.ammo_rockets >= cvar("g_balance_grenadelauncher_primary_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_primary_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_rockets >= cvar("g_balance_grenadelauncher_secondary_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_grenadelauncher_secondary_ammo;
return TRUE;
};
#endif
else if (req == WR_SUICIDEMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s tried out his own grenade";
+ w_deathtypestring = _("%s tried out his own grenade");
else
- w_deathtypestring = "%s detonated";
+ w_deathtypestring = _("%s detonated");
}
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SPLASH)
if(w_deathtype & HITTYPE_BOUNCE) // (must be secondary then)
- w_deathtypestring = "%s didn't see %s's grenade";
+ w_deathtypestring = _("%s didn't see %s's grenade");
else // unchecked: SECONDARY
- w_deathtypestring = "%s almost dodged %s's grenade";
+ w_deathtypestring = _("%s almost dodged %s's grenade");
else // unchecked: SECONDARY, BOUNCE
- w_deathtypestring = "%s ate %s's grenade";
+ w_deathtypestring = _("%s ate %s's grenade");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(HAGAR, w_hagar, IT_ROCKETS, 8, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "hagar", "hagar", "Hagar");
+REGISTER_WEAPON(HAGAR, w_hagar, IT_ROCKETS, 8, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "hagar", "hagar", _("Hagar"))
#else
#ifdef SVQC
// NO bounce protection, as bounces are limited!
void W_Hagar_Explode (void)
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_hagar_primary_damage, autocvar_g_balance_hagar_primary_edgedamage, autocvar_g_balance_hagar_primary_radius, world, autocvar_g_balance_hagar_primary_force, self.projectiledeathtype, other);
remove (self);
}
void W_Hagar_Explode2 (void)
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.realowner, autocvar_g_balance_hagar_secondary_damage, autocvar_g_balance_hagar_secondary_edgedamage, autocvar_g_balance_hagar_secondary_radius, world, autocvar_g_balance_hagar_secondary_force, self.projectiledeathtype, other);
remove (self);
}
local entity missile;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_primary_ammo");
- W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", cvar("g_balance_hagar_primary_damage"));
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_hagar_primary_ammo;
+ W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_primary_damage);
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile.owner = missile.realowner = self;
missile.classname = "missile";
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_hagar_primary_damage");
+ missile.bot_dodgerating = autocvar_g_balance_hagar_primary_damage;
missile.touch = W_Hagar_Touch;
missile.use = W_Hagar_Explode;
missile.think = adaptor_think2use_hittype_splash;
- missile.nextthink = time + cvar("g_balance_hagar_primary_lifetime");
+ missile.nextthink = time + autocvar_g_balance_hagar_primary_lifetime;
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_HAGAR;
setorigin (missile, w_shotorg);
local entity missile;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_secondary_ammo");
- W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", cvar("g_balance_hagar_secondary_damage"));
- //W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav"); // TODO: move model a little to the right
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_hagar_secondary_ammo;
+ W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_secondary_damage);
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile.owner = missile.realowner = self;
missile.classname = "missile";
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_hagar_secondary_damage");
+ missile.bot_dodgerating = autocvar_g_balance_hagar_secondary_damage;
missile.touch = W_Hagar_Touch2;
missile.cnt = 0;
missile.use = W_Hagar_Explode2;
missile.think = adaptor_think2use_hittype_splash;
- missile.nextthink = time + cvar("g_balance_hagar_secondary_lifetime_min") + random() * cvar("g_balance_hagar_secondary_lifetime_rand");
+ missile.nextthink = time + autocvar_g_balance_hagar_secondary_lifetime_min + random() * autocvar_g_balance_hagar_secondary_lifetime_rand;
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY;
setorigin (missile, w_shotorg);
{
if (req == WR_AIM)
if (random()>0.15)
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_hagar_primary_speed"), 0, cvar("g_balance_hagar_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_hagar_primary_speed, 0, autocvar_g_balance_hagar_primary_lifetime, FALSE);
else
{
// not using secondary_speed since these are only 15% and should cause some ricochets without re-aiming
- self.BUTTON_ATCK2 = bot_aim(cvar("g_balance_hagar_primary_speed"), 0, cvar("g_balance_hagar_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK2 = bot_aim(autocvar_g_balance_hagar_primary_speed, 0, autocvar_g_balance_hagar_primary_lifetime, FALSE);
}
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_hagar_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_hagar_primary_refire))
{
W_Hagar_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hagar_primary_refire"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hagar_primary_refire, w_ready);
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_hagar_secondary"))
- if (weapon_prepareattack(1, cvar("g_balance_hagar_secondary_refire")))
+ if (self.BUTTON_ATCK2 && autocvar_g_balance_hagar_secondary)
+ if (weapon_prepareattack(1, autocvar_g_balance_hagar_secondary_refire))
{
W_Hagar_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hagar_secondary_refire"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hagar_secondary_refire, w_ready);
}
}
else if (req == WR_PRECACHE)
else if (req == WR_SETUP)
weapon_setup(WEP_HAGAR);
else if (req == WR_CHECKAMMO1)
- return self.ammo_rockets >= cvar("g_balance_hagar_primary_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_hagar_primary_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_rockets >= cvar("g_balance_hagar_secondary_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_hagar_secondary_ammo;
return TRUE;
};
#endif
precache_sound("weapons/hagexp3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s played with tiny rockets";
+ w_deathtypestring = _("%s played with tiny rockets");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_BOUNCE) // must be secondary; unchecked: SPLASH
- w_deathtypestring = "%s hoped %s's missiles wouldn't bounce";
+ w_deathtypestring = _("%s hoped %s's missiles wouldn't bounce");
else // unchecked: SPLASH, SECONDARY
- w_deathtypestring = "%s was pummeled by %s";
+ w_deathtypestring = _("%s was pummeled by %s");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(HLAC, w_hlac, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "hlac", "hlac", "Heavy Laser Assault Cannon");
+REGISTER_WEAPON(HLAC, w_hlac, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "hlac", "hlac", _("Heavy Laser Assault Cannon"))
#else
#ifdef SVQC
-.float HLAC_bulletcounter;
-void W_HLAC_Touch (void)
-{
- PROJECTILE_TOUCH;
- self.event_damage = SUB_Null;
-
- RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
-
- remove (self);
-}
-
-void W_HLAC_Touch2 (void)
+void W_HLAC_Touch (void)
{
PROJECTILE_TOUCH;
self.event_damage = SUB_Null;
-
- RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
+
+ if(self.projectiledeathtype & HITTYPE_SECONDARY)
+ RadiusDamage (self, self.owner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
+ else
+ RadiusDamage (self, self.owner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
remove (self);
}
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_primary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_hlac_primary_ammo;
}
- spread = cvar("g_balance_hlac_primary_spread_min") + (cvar("g_balance_hlac_primary_spread_add") * self.HLAC_bulletcounter);
- spread = min(spread,cvar("g_balance_hlac_primary_spread_max"));
+ spread = autocvar_g_balance_hlac_primary_spread_min + (autocvar_g_balance_hlac_primary_spread_add * self.misc_bulletcounter);
+ spread = min(spread,autocvar_g_balance_hlac_primary_spread_max);
if(self.crouch)
- spread = spread * cvar("g_balance_hlac_primary_spread_crouchmod");
+ spread = spread * autocvar_g_balance_hlac_primary_spread_crouchmod;
- W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", cvar("g_balance_hlac_primary_damage"));
+ W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_primary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
if (!g_norecoil)
{
missile = spawn ();
missile.owner = self;
missile.classname = "hlacbolt";
- // missile.dmg = issecondary;
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_hlac_primary_damage");
+ missile.bot_dodgerating = autocvar_g_balance_hlac_primary_damage;
missile.movetype = MOVETYPE_FLY;
PROJECTILE_MAKETRIGGER(missile);
setorigin (missile, w_shotorg);
setsize(missile, '0 0 0', '0 0 0');
- W_SetupProjectileVelocity(missile, cvar("g_balance_hlac_primary_speed"), spread);
- missile.angles = vectoangles (missile.velocity);
+ W_SetupProjectileVelocity(missile, autocvar_g_balance_hlac_primary_speed, spread);
+ //missile.angles = vectoangles (missile.velocity); // csqc
missile.touch = W_HLAC_Touch;
missile.think = SUB_Remove;
- missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");
+ missile.nextthink = time + autocvar_g_balance_hlac_primary_lifetime;
missile.flags = FL_PROJECTILE;
missile.projectiledeathtype = WEP_HLAC;
local entity missile;
float spread;
- spread = cvar("g_balance_hlac_secondary_spread");
+ spread = autocvar_g_balance_hlac_secondary_spread;
if(self.crouch)
- spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");
+ spread = spread * autocvar_g_balance_hlac_secondary_spread_crouchmod;
- W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", cvar("g_balance_hlac_secondary_damage"));
+ W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_secondary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
missile.owner = self;
missile.classname = "hlacbolt";
- // missile.dmg = issecondary;
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");
+ missile.bot_dodgerating = autocvar_g_balance_hlac_secondary_damage;
missile.movetype = MOVETYPE_FLY;
PROJECTILE_MAKETRIGGER(missile);
setorigin (missile, w_shotorg);
setsize(missile, '0 0 0', '0 0 0');
- W_SetupProjectileVelocity(missile, cvar("g_balance_hlac_secondary_speed"), spread);
- missile.angles = vectoangles (missile.velocity);
+ W_SetupProjectileVelocity(missile, autocvar_g_balance_hlac_secondary_speed, spread);
+ //missile.angles = vectoangles (missile.velocity); // csqc
- missile.touch = W_HLAC_Touch2;
+ missile.touch = W_HLAC_Touch;
missile.think = SUB_Remove;
- missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");
+ missile.nextthink = time + autocvar_g_balance_hlac_secondary_lifetime;
missile.flags = FL_PROJECTILE;
missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_hlac_secondary_ammo;
}
- for(i=cvar("g_balance_hlac_secondary_shots");i>0;--i)
+ for(i=autocvar_g_balance_hlac_secondary_shots;i>0;--i)
W_HLAC_Attack2f();
if (!g_norecoil)
return;
}
- ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire") * W_WeaponRateFactor();
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_hlac_primary_refire * W_WeaponRateFactor();
W_HLAC_Attack();
- self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_refire, HLAC_fire1_02);
}
else
{
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_animtime, w_ready);
}
};
float w_hlac(float req)
{
if (req == WR_AIM)
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_hlac_primary_speed, 0, autocvar_g_balance_hlac_primary_lifetime, FALSE);
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_hlac_primary_refire))
{
- self.HLAC_bulletcounter = 0;
+ self.misc_bulletcounter = 0;
W_HLAC_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_refire, HLAC_fire1_02);
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_hlac_secondary"))
- if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))
+ if (self.BUTTON_ATCK2 && autocvar_g_balance_hlac_secondary)
+ if (weapon_prepareattack(1, autocvar_g_balance_hlac_secondary_refire))
{
W_HLAC_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hlac_secondary_animtime, w_ready);
}
}
else if (req == WR_SETUP)
weapon_setup(WEP_HLAC);
else if (req == WR_CHECKAMMO1)
- return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_hlac_primary_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_hlac_secondary_ammo;
return TRUE;
};
#endif
precache_sound("weapons/laserimpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s should have used a smaller gun";
+ w_deathtypestring = _("%s should have used a smaller gun");
else if (req == WR_KILLMESSAGE)
- w_deathtypestring = "%s was cut down by %s";
+ w_deathtypestring = _("%s was cut down by %s");
return TRUE;
}
#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(HOOK, w_hook, IT_CELLS|IT_FUEL, 0, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "hookgun", "hook", "Grappling Hook");
+REGISTER_WEAPON(HOOK, w_hook, IT_CELLS|IT_FUEL, 0, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "hookgun", "hook", _("Grappling Hook"))
#else
#ifdef SVQC
.float dmg;
self.think = W_Hook_ExplodeThink;
self.nextthink = time;
- self.dmg = cvar("g_balance_hook_secondary_damage");
- self.dmg_edge = cvar("g_balance_hook_secondary_edgedamage");
- self.dmg_radius = cvar("g_balance_hook_secondary_radius");
- self.dmg_force = cvar("g_balance_hook_secondary_force");
- self.dmg_power = cvar("g_balance_hook_secondary_power");
- self.dmg_duration = cvar("g_balance_hook_secondary_duration");
+ self.dmg = autocvar_g_balance_hook_secondary_damage;
+ self.dmg_edge = autocvar_g_balance_hook_secondary_edgedamage;
+ self.dmg_radius = autocvar_g_balance_hook_secondary_radius;
+ self.dmg_force = autocvar_g_balance_hook_secondary_force;
+ self.dmg_power = autocvar_g_balance_hook_secondary_power;
+ self.dmg_duration = autocvar_g_balance_hook_secondary_duration;
self.teleport_time = time;
self.dmg_last = 1;
self.movetype = MOVETYPE_NONE;
local entity gren;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_cells = self.ammo_cells - cvar("g_balance_hook_secondary_ammo");
- W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", cvar("g_balance_hook_secondary_damage"));
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_hook_secondary_ammo;
+ W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CHAN_WEAPON, autocvar_g_balance_hook_secondary_damage);
gren = spawn ();
gren.owner = self;
gren.classname = "hookbomb";
gren.bot_dodge = TRUE;
- gren.bot_dodgerating = cvar("g_balance_hook_secondary_damage");
+ gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage;
gren.movetype = MOVETYPE_TOSS;
PROJECTILE_MAKETRIGGER(gren);
gren.projectiledeathtype = WEP_HOOK | HITTYPE_SECONDARY;
setorigin(gren, w_shotorg);
setsize(gren, '0 0 0', '0 0 0');
- gren.nextthink = time + cvar("g_balance_hook_secondary_lifetime");
+ gren.nextthink = time + autocvar_g_balance_hook_secondary_lifetime;
gren.think = adaptor_think2use_hittype_splash;
gren.use = W_Hook_Explode2;
gren.touch = W_Hook_Touch2;
- gren.velocity = '0 0 1' * cvar("g_balance_hook_secondary_speed");
- if(cvar("g_projectiles_newton_style"))
+ gren.velocity = '0 0 1' * autocvar_g_balance_hook_secondary_speed;
+ if(autocvar_g_projectiles_newton_style)
gren.velocity = gren.velocity + self.velocity;
- gren.gravity = cvar("g_balance_hook_secondary_gravity");
+ gren.gravity = autocvar_g_balance_hook_secondary_gravity;
//W_SetupProjectileVelocity(gren); // just falling down!
gren.angles = '0 0 0';
if (weapon_prepareattack(0, -1))
{
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_fuel = self.ammo_fuel - cvar("g_balance_hook_primary_fuel");
+ self.ammo_fuel = self.ammo_fuel - autocvar_g_balance_hook_primary_fuel;
self.hook_state |= HOOK_FIRING;
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hook_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hook_primary_animtime, w_ready);
}
}
if (self.BUTTON_ATCK2)
{
- if (weapon_prepareattack(1, cvar("g_balance_hook_secondary_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_hook_secondary_refire))
{
W_Hook_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hook_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hook_secondary_animtime, w_ready);
}
}
if(self.hook)
{
// if hooked, no bombs, and increase the timer
- self.hook_refire = max(self.hook_refire, time + cvar("g_balance_hook_primary_refire"));
+ self.hook_refire = max(self.hook_refire, time + autocvar_g_balance_hook_primary_refire);
// hook also inhibits health regeneration, but only for 1 second
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_fuel_regen"));
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_fuel_regen);
}
if(self.hook && self.hook.state == 1)
{
- hooked_time_max = cvar("g_balance_hook_primary_hooked_time_max");
+ hooked_time_max = autocvar_g_balance_hook_primary_hooked_time_max;
if (hooked_time_max > 0)
{
if ( time > self.hook_time_hooked + hooked_time_max )
self.hook_state |= HOOK_REMOVING;
}
- hooked_fuel = cvar("g_balance_hook_primary_hooked_fuel");
+ hooked_fuel = autocvar_g_balance_hook_primary_hooked_fuel;
if (hooked_fuel > 0)
{
if ( time > self.hook_time_fueldecrease )
else
{
self.hook_time_hooked = time;
- self.hook_time_fueldecrease = time + cvar("g_balance_hook_primary_hooked_time_free");
+ self.hook_time_fueldecrease = time + autocvar_g_balance_hook_primary_hooked_time_free;
}
if (self.BUTTON_CROUCH)
if(self.hook)
return self.ammo_fuel > 0;
else
- return self.ammo_fuel >= cvar("g_balance_hook_primary_fuel");
+ return self.ammo_fuel >= autocvar_g_balance_hook_primary_fuel;
}
else if (req == WR_CHECKAMMO2)
{
- return self.ammo_cells >= cvar("g_balance_hook_secondary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_hook_secondary_ammo;
}
else if (req == WR_RESETPLAYER)
{
precache_sound("weapons/hookbomb_impact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
- w_deathtypestring = "%s has run into %s's gravity bomb";
+ w_deathtypestring = _("%s has run into %s's gravity bomb");
return TRUE;
}
#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(LASER, w_laser, 0, 1, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "laser", "laser", "Laser");
+REGISTER_WEAPON(LASER, w_laser, 0, 1, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "laser", "laser", _("Laser"))
#else
#ifdef SVQC
void(float imp) W_SwitchWeapon;
self.event_damage = SUB_Null;
if (self.dmg)
- RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
else
- RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
remove (self);
}
self.movetype = MOVETYPE_FLY;
self.think = SUB_Remove;
if (self.dmg)
- self.nextthink = time + cvar("g_balance_laser_secondary_lifetime");
+ self.nextthink = time + autocvar_g_balance_laser_secondary_lifetime;
else
- self.nextthink = time + cvar("g_balance_laser_primary_lifetime");
+ self.nextthink = time + autocvar_g_balance_laser_primary_lifetime;
CSQCProjectile(self, TRUE, PROJECTILE_LASER, TRUE);
}
else
nodamage = FALSE;
- a = cvar("g_balance_laser_primary_shotangle");
+ a = autocvar_g_balance_laser_primary_shotangle;
s_forward = v_forward * cos(a * DEG2RAD) + v_up * sin(a * DEG2RAD);
if(nodamage)
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", 0);
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, 0);
else if(issecondary == 1)
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", cvar("g_balance_laser_secondary_damage"));
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_secondary_damage);
else
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", cvar("g_balance_laser_primary_damage"));
+ W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_primary_damage);
pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = spawn ();
if(!nodamage)
{
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_laser_primary_damage");
+ missile.bot_dodgerating = autocvar_g_balance_laser_primary_damage;
}
PROJECTILE_MAKETRIGGER(missile);
missile.flags = FL_PROJECTILE;
missile.think = W_Laser_Think;
- missile.nextthink = time + cvar("g_balance_laser_primary_delay");
+ missile.nextthink = time + autocvar_g_balance_laser_primary_delay;
other = missile; MUTATOR_CALLHOOK(EditProjectile);
void gauntletbeam_think()
{
float damage, myforce, myradius;
- damage = cvar("g_balance_laser_secondary_damage");
- myforce = cvar("g_balance_laser_secondary_force");
- myradius = cvar("g_balance_laser_secondary_radius");
+ damage = autocvar_g_balance_laser_secondary_damage;
+ myforce = autocvar_g_balance_laser_secondary_force;
+ myradius = autocvar_g_balance_laser_secondary_radius;
self.owner.prevgauntletfire = time;
if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK2)
float dt;
dt = frametime;
- W_SetupShot_Range(self.owner, TRUE, 0, "", damage * dt, myradius);
+ W_SetupShot_Range(self.owner, TRUE, 0, "", 0, damage * dt, myradius);
WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
// apply the damage
{
vector force;
force = w_shotdir * myforce;
+ if(accuracy_isgooddamage(self.owner, trace_ent))
+ accuracy_add(self.owner, WEP_LASER, 0, damage * dt);
Damage (trace_ent, self.owner, self.owner, damage * dt, WEP_LASER | HITTYPE_SECONDARY, trace_endpos, force * dt);
- Damage_RecordDamage(self.owner, WEP_LASER | HITTYPE_SECONDARY, damage * dt);
}
// draw effect
beam.movetype = MOVETYPE_NONE;
beam.shot_spread = 0;
beam.bot_dodge = TRUE;
- beam.bot_dodgerating = cvar("g_balance_laser_primary_damage");
+ beam.bot_dodgerating = autocvar_g_balance_laser_primary_damage;
Net_LinkEntity(beam, FALSE, 0, gauntletbeam_send);
oldself = self;
local float r2;
if (req == WR_AIM)
{
- if(cvar("g_balance_laser_secondary"))
+ if(autocvar_g_balance_laser_secondary)
{
- r1 = cvar("g_balance_laser_primary_damage");
- r2 = cvar("g_balance_laser_secondary_damage");
+ r1 = autocvar_g_balance_laser_primary_damage;
+ r2 = autocvar_g_balance_laser_secondary_damage;
if (random() * (r2 + r1) > r1)
- self.BUTTON_ATCK2 = bot_aim(cvar("g_balance_laser_secondary_speed"), 0, cvar("g_balance_laser_secondary_lifetime"), FALSE);
+ self.BUTTON_ATCK2 = bot_aim(autocvar_g_balance_laser_secondary_speed, 0, autocvar_g_balance_laser_secondary_lifetime, FALSE);
else
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_laser_primary_speed"), 0, cvar("g_balance_laser_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_laser_primary_speed, 0, autocvar_g_balance_laser_primary_lifetime, FALSE);
}
else
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_laser_primary_speed"), 0, cvar("g_balance_laser_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_laser_primary_speed, 0, autocvar_g_balance_laser_primary_lifetime, FALSE);
}
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_laser_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_laser_primary_refire))
{
- W_Laser_Attack(1);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_laser_primary_animtime"), w_ready);
+ W_Laser_Attack(0);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_laser_primary_animtime, w_ready);
}
if (self.BUTTON_ATCK2)
{
- if(cvar("g_balance_laser_secondary"))
+ if(autocvar_g_balance_laser_secondary)
{
if (weapon_prepareattack(0, 0))
{
W_Laser_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_laser_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_laser_secondary_animtime, w_ready);
}
}
else
precache_sound("weapons/laserimpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s lasered themself to hell";
+ w_deathtypestring = _("%s lasered themself to hell");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s was cut in half by %s's gauntlet"; // unchecked: SPLASH
+ w_deathtypestring = _("%s was cut in half by %s's gauntlet"); // unchecked: SPLASH
else
- w_deathtypestring = "%s was lasered to death by %s"; // unchecked: SPLASH
+ w_deathtypestring = _("%s was lasered to death by %s"); // unchecked: SPLASH
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(MINE_LAYER, w_minelayer, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "minelayer", "minelayer", "Mine Layer");
+REGISTER_WEAPON(MINE_LAYER, w_minelayer, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "minelayer", "minelayer", _("Mine Layer"))
#else
#ifdef SVQC
void W_Mine_Think (void);
newmine.damageforcescale = self.damageforcescale;
newmine.health = self.health;
newmine.event_damage = self.event_damage;
+ newmine.spawnshieldtime = self.spawnshieldtime;
newmine.movetype = MOVETYPE_NONE; // lock the mine in place
newmine.projectiledeathtype = self.projectiledeathtype;
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, cvar("g_balance_minelayer_damage"), cvar("g_balance_minelayer_edgedamage"), cvar("g_balance_minelayer_radius"), world, cvar("g_balance_minelayer_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
if (self.owner.weapon == WEP_MINE_LAYER)
{
- if(self.owner.ammo_rockets < cvar("g_balance_minelayer_ammo"))
+ if(self.owner.ammo_rockets < autocvar_g_balance_minelayer_ammo)
{
self.owner.cnt = WEP_MINE_LAYER;
ATTACK_FINISHED(self.owner) = time;
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, cvar("g_balance_minelayer_remote_damage"), cvar("g_balance_minelayer_remote_edgedamage"), cvar("g_balance_minelayer_remote_radius"), world, cvar("g_balance_minelayer_remote_force"), self.projectiledeathtype | HITTYPE_BOUNCE, world);
+ RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
if (self.owner.weapon == WEP_MINE_LAYER)
{
- if(self.owner.ammo_rockets < cvar("g_balance_minelayer_ammo"))
+ if(self.owner.ammo_rockets < autocvar_g_balance_minelayer_ammo)
{
self.owner.cnt = WEP_MINE_LAYER;
ATTACK_FINISHED(self.owner) = time;
if(self.owner.deadflag == DEAD_NO)
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_minelayer_remote_radius")) // safety device
+ : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
)
{
W_Mine_DoRemoteExplode();
void W_Mine_ProximityExplode ()
{
// make sure no friend is in the mine's radius. If there is any, explosion is delayed until he's at a safe distance
- if(cvar("g_balance_minelayer_protection"))
+ if(autocvar_g_balance_minelayer_protection && self.minelayer_mines == 0)
{
entity head;
- head = findradius(self.origin, cvar("g_balance_minelayer_radius"));
+ head = findradius(self.origin, autocvar_g_balance_minelayer_radius);
while(head)
{
if(head == self.owner || !IsDifferentTeam(head, self.owner))
entity head;
self.nextthink = time;
- if (time > self.cnt)
+
+ // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
+ // TODO: replace this mine_trigger.wav sound with a real countdown
+ if ((time > self.cnt) && (!self.mine_time))
{
- other = world;
- self.projectiledeathtype |= HITTYPE_BOUNCE;
- W_Mine_Explode();
- return;
+ if(autocvar_g_balance_minelayer_lifetime_countdown > 0)
+ spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+ self.mine_time = time + autocvar_g_balance_minelayer_lifetime_countdown;
+ self.minelayer_mines = 1; // make the mine super aggressive
}
// a player's mines shall explode if he disconnects or dies
- // TODO: Do this on team change too
+ // TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
if(self.owner.classname != "player" || self.owner.deadflag != DEAD_NO)
{
other = world;
}
// set the mine for detonation when a foe gets close enough
- head = findradius(self.origin, cvar("g_balance_minelayer_proximityradius"));
+ head = findradius(self.origin, autocvar_g_balance_minelayer_proximityradius);
while(head)
{
if(head.classname == "player" && head.deadflag == DEAD_NO)
if(!self.mine_time)
{
spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
- self.mine_time = time + cvar("g_balance_minelayer_time");
+ self.mine_time = time + autocvar_g_balance_minelayer_time;
}
head = head.chain;
}
// explode if it's time to
if(self.mine_time && time >= self.mine_time)
+ {
W_Mine_ProximityExplode();
+ return;
+ }
// remote detonation
if (self.owner.weapon == WEP_MINE_LAYER)
entity flash;
// scan how many mines we placed, and return if we reached our limit
- if(cvar("g_balance_minelayer_limit"))
+ if(autocvar_g_balance_minelayer_limit)
{
self.minelayer_mines = 0;
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
self.minelayer_mines += 1;
- if(self.minelayer_mines >= cvar("g_balance_minelayer_limit"))
+ if(self.minelayer_mines >= autocvar_g_balance_minelayer_limit)
{
// the refire delay keeps this message from being spammed
- sprint(self, strcat("You cannot place more than ^2", cvar_string("g_balance_minelayer_limit"), " ^7mines at a time\n") );
+ sprint(self, strcat("You cannot place more than ^2", ftos(autocvar_g_balance_minelayer_limit), " ^7mines at a time\n") );
play2(self, "weapons/unavailable.wav");
return;
}
}
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_minelayer_ammo");
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_minelayer_ammo;
- W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", cvar("g_balance_minelayer_damage"));
+ W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CHAN_WEAPON, autocvar_g_balance_minelayer_damage);
pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
mine = WarpZone_RefSys_SpawnSameRefSys(self);
mine.owner = self;
- if(cvar("g_balance_minelayer_detonatedelay") >= 0)
- mine.spawnshieldtime = time + cvar("g_balance_minelayer_detonatedelay");
+ if(autocvar_g_balance_minelayer_detonatedelay >= 0)
+ mine.spawnshieldtime = time + autocvar_g_balance_minelayer_detonatedelay;
else
mine.spawnshieldtime = -1;
mine.classname = "mine";
mine.bot_dodge = TRUE;
- mine.bot_dodgerating = cvar("g_balance_minelayer_damage") * 2; // * 2 because it can detonate inflight which makes it even more dangerous
+ mine.bot_dodgerating = autocvar_g_balance_minelayer_damage * 2; // * 2 because it can detonate inflight which makes it even more dangerous
mine.takedamage = DAMAGE_YES;
- mine.damageforcescale = cvar("g_balance_minelayer_damageforcescale");
- mine.health = cvar("g_balance_minelayer_health");
+ mine.damageforcescale = autocvar_g_balance_minelayer_damageforcescale;
+ mine.health = autocvar_g_balance_minelayer_health;
mine.event_damage = W_Mine_Damage;
mine.movetype = MOVETYPE_TOSS;
setsize (mine, '-4 -4 -4', '4 4 4'); // give it some size so it can be shot
setorigin (mine, w_shotorg - v_forward * 4); // move it back so it hits the wall at the right point
- W_SetupProjectileVelocity(mine, cvar("g_balance_minelayer_speed"), 0);
+ W_SetupProjectileVelocity(mine, autocvar_g_balance_minelayer_speed, 0);
mine.angles = vectoangles (mine.velocity);
mine.touch = W_Mine_Touch;
mine.think = W_Mine_Think;
mine.nextthink = time;
- mine.cnt = time + cvar("g_balance_minelayer_lifetime");
+ mine.cnt = time + (autocvar_g_balance_minelayer_lifetime - autocvar_g_balance_minelayer_lifetime_countdown);
mine.flags = FL_PROJECTILE;
CSQCProjectile(mine, TRUE, PROJECTILE_MINE, TRUE);
if (req == WR_AIM)
{
// aim and decide to fire if appropriate
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_minelayer_speed"), 0, cvar("g_balance_minelayer_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_minelayer_speed, 0, autocvar_g_balance_minelayer_lifetime, FALSE);
if(skill >= 2) // skill 0 and 1 bots won't detonate mines!
{
// decide whether to detonate mines
entity targetlist, targ;
float edgedamage, coredamage, edgeradius, recipricoledgeradius, d;
float selfdamage, teamdamage, enemydamage;
- edgedamage = cvar("g_balance_minelayer_edgedamage");
- coredamage = cvar("g_balance_minelayer_damage");
- edgeradius = cvar("g_balance_minelayer_radius");
+ edgedamage = autocvar_g_balance_minelayer_edgedamage;
+ coredamage = autocvar_g_balance_minelayer_damage;
+ edgeradius = autocvar_g_balance_minelayer_radius;
recipricoledgeradius = 1 / edgeradius;
selfdamage = 0;
teamdamage = 0;
}
float desirabledamage;
desirabledamage = enemydamage;
- if (teamplay != 1 && time > self.invincible_finished && time > self.spawnshieldtime)
- desirabledamage = desirabledamage - selfdamage * cvar("g_balance_selfdamagepercent");
- if (self.team && teamplay != 1)
+ if (time > self.invincible_finished && time > self.spawnshieldtime)
+ desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
+ if (teams_matter && self.team)
desirabledamage = desirabledamage - teamdamage;
mine = find(world, classname, "mine");
{
if (self.BUTTON_ATCK)
{
- if(weapon_prepareattack(0, cvar("g_balance_minelayer_refire")))
+ if(weapon_prepareattack(0, autocvar_g_balance_minelayer_refire))
{
W_Mine_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_minelayer_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_minelayer_animtime, w_ready);
}
}
{
// don't switch while placing a mine
if ((ATTACK_FINISHED(self) <= time || self.weapon != WEP_MINE_LAYER)
- && self.ammo_rockets < cvar("g_balance_minelayer_ammo"))
+ && self.ammo_rockets < autocvar_g_balance_minelayer_ammo)
return FALSE;
}
else if (req == WR_CHECKAMMO2)
precache_sound("weapons/mine_exp.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s exploded";
+ w_deathtypestring = _("%s exploded");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
- w_deathtypestring = "%s got too close to %s's mine";
+ w_deathtypestring = _("%s got too close to %s's mine");
else if(w_deathtype & HITTYPE_SPLASH)
- w_deathtypestring = "%s almost dodged %s's mine";
+ w_deathtypestring = _("%s almost dodged %s's mine");
else
- w_deathtypestring = "%s stepped on %s's mine";
+ w_deathtypestring = _("%s stepped on %s's mine");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(MINSTANEX, w_minstanex, IT_CELLS, 7, WEP_FLAG_HIDDEN | WEP_FLAG_CANCLIMB | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "minstanex", "minstanex", "MinstaNex");
+REGISTER_WEAPON(MINSTANEX, w_minstanex, IT_CELLS, 7, WEP_FLAG_HIDDEN | WEP_FLAG_CANCLIMB | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "minstanex", "minstanex", _("MinstaNex"))
#else
#ifdef SVQC
.float minstanex_lasthit;
float flying;
flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
- W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", 0);
+ W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CHAN_WEAPON, 10000);
yoda = 0;
damage_goodhits = 0;
if(headshot)
{
AnnounceTo(self, "headshot");
- print("h\n");
}
if(damage_goodhits && self.minstanex_lasthit)
{
// teamcolor / hit beam effect
vector v;
v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
- if(teamplay)
+ if(teams_matter)
{
switch(self.team)
{
if (g_minstagib)
self.ammo_cells = self.ammo_cells - 1;
else
- self.ammo_cells = self.ammo_cells - cvar("g_balance_minstanex_ammo");
+ self.ammo_cells = self.ammo_cells - autocvar_g_balance_minstanex_ammo;
}
}
if(self.ammo_cells>0)
self.BUTTON_ATCK = bot_aim(1000000, 0, 1, FALSE);
else
- self.BUTTON_ATCK2 = bot_aim(cvar("g_balance_laser_primary_speed"), 0, cvar("g_balance_laser_primary_lifetime"), FALSE);
+ self.BUTTON_ATCK2 = bot_aim(autocvar_g_balance_laser_primary_speed, 0, autocvar_g_balance_laser_primary_lifetime, FALSE);
}
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
{
- if (weapon_prepareattack(0, cvar("g_balance_minstanex_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_minstanex_refire))
{
W_MinstaNex_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_minstanex_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_minstanex_animtime, w_ready);
}
}
else if (self.BUTTON_ATCK2)
{
if (self.jump_interval <= time)
{
- self.jump_interval = time + 0.9 * W_WeaponRateFactor();
+ self.jump_interval = time + autocvar_g_balance_laser_primary_refire * W_WeaponRateFactor();
// ugly minstagib hack to reuse the fire mode of the laser
float w;
if (g_minstagib)
return self.ammo_cells >= 1;
else
- return self.ammo_cells >= cvar("g_balance_minstanex_ammo");
+ return self.ammo_cells >= autocvar_g_balance_minstanex_ammo;
}
else if (req == WR_CHECKAMMO2)
return TRUE;
precache_sound("weapons/neximpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
- w_deathtypestring = "%s has been vaporized by %s";
+ w_deathtypestring = _("%s has been vaporized by %s");
return TRUE;
}
#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(NEX, w_nex, IT_CELLS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "nex", "nex", "Nex");
+REGISTER_WEAPON(NEX, w_nex, IT_CELLS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_HIGH, "nex", "nex", _("Nex"))
#else
#ifdef SVQC
void SendCSQCNexBeamParticle(float charge) {
float mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, myammo, charge;
if(issecondary)
{
- mydmg = cvar("g_balance_nex_secondary_damage");
- myforce = cvar("g_balance_nex_secondary_force");
- mymindist = cvar("g_balance_nex_secondary_damagefalloff_mindist");
- mymaxdist = cvar("g_balance_nex_secondary_damagefalloff_maxdist");
- myhalflife = cvar("g_balance_nex_secondary_damagefalloff_halflife");
- myforcehalflife = cvar("g_balance_nex_secondary_damagefalloff_forcehalflife");
- myammo = cvar("g_balance_nex_secondary_ammo");
+ mydmg = autocvar_g_balance_nex_secondary_damage;
+ myforce = autocvar_g_balance_nex_secondary_force;
+ mymindist = autocvar_g_balance_nex_secondary_damagefalloff_mindist;
+ mymaxdist = autocvar_g_balance_nex_secondary_damagefalloff_maxdist;
+ myhalflife = autocvar_g_balance_nex_secondary_damagefalloff_halflife;
+ myforcehalflife = autocvar_g_balance_nex_secondary_damagefalloff_forcehalflife;
+ myammo = autocvar_g_balance_nex_secondary_ammo;
}
else
{
- mydmg = cvar("g_balance_nex_primary_damage");
- myforce = cvar("g_balance_nex_primary_force");
- mymindist = cvar("g_balance_nex_primary_damagefalloff_mindist");
- mymaxdist = cvar("g_balance_nex_primary_damagefalloff_maxdist");
- myhalflife = cvar("g_balance_nex_primary_damagefalloff_halflife");
- myforcehalflife = cvar("g_balance_nex_primary_damagefalloff_forcehalflife");
- myammo = cvar("g_balance_nex_primary_ammo");
+ mydmg = autocvar_g_balance_nex_primary_damage;
+ myforce = autocvar_g_balance_nex_primary_force;
+ mymindist = autocvar_g_balance_nex_primary_damagefalloff_mindist;
+ mymaxdist = autocvar_g_balance_nex_primary_damagefalloff_maxdist;
+ myhalflife = autocvar_g_balance_nex_primary_damagefalloff_halflife;
+ myforcehalflife = autocvar_g_balance_nex_primary_damagefalloff_forcehalflife;
+ myammo = autocvar_g_balance_nex_primary_ammo;
}
float flying;
flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
- if(cvar("g_balance_nex_charge"))
+ if(autocvar_g_balance_nex_charge)
{
- charge = cvar("g_balance_nex_charge_mindmg") / mydmg + (1 - cvar("g_balance_nex_charge_mindmg") / mydmg) * self.nex_charge;
- self.nex_charge *= cvar("g_balance_nex_charge_shot_multiplier"); // do this AFTER setting mydmg/myforce
- // O RLY? -- divVerent
+ charge = autocvar_g_balance_nex_charge_mindmg / mydmg + (1 - autocvar_g_balance_nex_charge_mindmg / mydmg) * self.nex_charge;
+ self.nex_charge *= autocvar_g_balance_nex_charge_shot_multiplier; // do this AFTER setting mydmg/myforce
+ // O RLY? -- divVerent
+ // YA RLY -- FruitieX
}
else
charge = 1;
mydmg *= charge;
myforce *= charge;
- W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", mydmg);
+ W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CHAN_WEAPON, mydmg);
+ if(charge > autocvar_g_balance_nex_charge_animlimit && autocvar_g_balance_nex_charge_animlimit) // if the Nex is overcharged, we play an extra sound
+ {
+ sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_animlimit) / (1 - 0.5 * autocvar_g_balance_nex_charge_animlimit), ATTN_NORM);
+ }
yoda = 0;
FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, WEP_NEX);
//beam and muzzle flash done on client
SendCSQCNexBeamParticle(charge);
-
+
// flash and burn the wall
if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
Damage_DamageInfo(trace_endpos, mydmg, 0, 0, myforce * w_shotdir, WEP_NEX, self);
void spawnfunc_weapon_nex (void); // defined in t_items.qc
+.float nex_chargepool_pauseregen_finished;
float w_nex(float req)
{
float dt;
}
else if (req == WR_THINK)
{
- if(cvar("g_balance_nex_charge") && self.nex_charge < cvar("g_balance_nex_charge_limit"))
- self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_rate") * frametime / W_TICSPERFRAME);
+ if(autocvar_g_balance_nex_charge && self.nex_charge < autocvar_g_balance_nex_charge_limit)
+ self.nex_charge = min(1, self.nex_charge + autocvar_g_balance_nex_charge_rate * frametime / W_TICSPERFRAME);
+
+ if(autocvar_g_balance_nex_secondary_chargepool)
+ if(self.nex_chargepool_ammo < 1)
+ {
+ if(self.nex_chargepool_pauseregen_finished < time)
+ self.nex_chargepool_ammo = min(1, self.nex_chargepool_ammo + autocvar_g_balance_nex_secondary_chargepool_regen * frametime / W_TICSPERFRAME);
+ self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_nex_secondary_chargepool_pause_health_regen);
+ }
if (self.BUTTON_ATCK)
{
- if (weapon_prepareattack(0, cvar("g_balance_nex_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_nex_primary_refire))
{
W_Nex_Attack(0);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nex_primary_animtime, w_ready);
}
}
- if (self.BUTTON_ATCK2)
+ if ((autocvar_g_balance_nex_secondary_charge && !autocvar_g_balance_nex_secondary) ? self.BUTTON_ZOOM : self.BUTTON_ATCK2)
{
- if(cvar("g_balance_nex_secondary_charge"))
+ if(autocvar_g_balance_nex_secondary_charge)
{
+ self.nex_charge_rottime = time + autocvar_g_balance_nex_charge_rot_pause;
dt = frametime / W_TICSPERFRAME;
+
if(self.nex_charge < 1)
{
- dt = min(dt, (1 - self.nex_charge) / cvar("g_balance_nex_secondary_charge_rate"));
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ if(autocvar_g_balance_nex_secondary_chargepool)
{
- if(cvar("g_balance_nex_secondary_ammo"))
+ if(autocvar_g_balance_nex_secondary_ammo)
{
- dt = min(dt, (self.ammo_cells - cvar("g_balance_nex_primary_ammo")) / cvar("g_balance_nex_secondary_ammo"));
+ // always deplete if secondary is held
+ self.nex_chargepool_ammo = max(0, self.nex_chargepool_ammo - autocvar_g_balance_nex_secondary_ammo * dt);
+
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
+ self.nex_chargepool_pauseregen_finished = time + autocvar_g_balance_nex_secondary_chargepool_pause_regen;
+ dt = min(dt, self.nex_chargepool_ammo);
dt = max(0, dt);
- if(dt > 0)
+
+ self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
+ }
+ }
+
+ else if(autocvar_g_balance_nex_secondary_ammo)
+ {
+ if(self.BUTTON_ATCK2) // only eat ammo when the button is pressed
+ {
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- self.ammo_cells = max(cvar("g_balance_nex_secondary_ammo"), self.ammo_cells - cvar("g_balance_nex_secondary_ammo") * dt);
+ dt = min(dt, (self.ammo_cells - autocvar_g_balance_nex_primary_ammo) / autocvar_g_balance_nex_secondary_ammo);
+ dt = max(0, dt);
+ if(dt > 0)
+ {
+ self.ammo_cells = max(autocvar_g_balance_nex_secondary_ammo, self.ammo_cells - autocvar_g_balance_nex_secondary_ammo * dt);
+ }
}
+ self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
}
}
- self.nex_charge += dt * cvar("g_balance_nex_secondary_charge_rate");
+
+ else
+ {
+ dt = min(dt, (1 - self.nex_charge) / autocvar_g_balance_nex_secondary_charge_rate);
+ self.nex_charge += dt * autocvar_g_balance_nex_secondary_charge_rate;
+ }
}
}
- else if(cvar("g_balance_nex_secondary"))
+ else if(autocvar_g_balance_nex_secondary)
{
- if (weapon_prepareattack(0, cvar("g_balance_nex_secondary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_nex_secondary_refire))
{
W_Nex_Attack(1);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nex_secondary_animtime, w_ready);
}
}
}
+
+ if(autocvar_g_balance_nex_charge)
+ {
+ self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+ self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+ self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
+
+ if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit)
+ {
+ self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+ self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+ self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit);
+ }
+ }
}
else if (req == WR_PRECACHE)
{
precache_model ("models/weapons/v_nex.md3");
precache_model ("models/weapons/h_nex.iqm");
precache_sound ("weapons/nexfire.wav");
+ precache_sound ("weapons/nexcharge.wav");
precache_sound ("weapons/nexwhoosh1.wav");
precache_sound ("weapons/nexwhoosh2.wav");
precache_sound ("weapons/nexwhoosh3.wav");
else if (req == WR_SETUP)
weapon_setup(WEP_NEX);
else if (req == WR_CHECKAMMO1)
- return self.ammo_cells >= cvar("g_balance_nex_primary_ammo");
+ return self.ammo_cells >= autocvar_g_balance_nex_primary_ammo;
else if (req == WR_CHECKAMMO2)
- {
- if(cvar("g_balance_nex_secondary_charge"))
- return self.ammo_cells >= cvar("g_balance_nex_primary_ammo");
- return self.ammo_cells >= cvar("g_balance_nex_secondary_ammo");
- }
+ return self.ammo_cells >= autocvar_g_balance_nex_primary_ammo; // don't allow charging if we don't have enough ammo
return TRUE;
};
#endif
precache_sound("weapons/neximpact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
- w_deathtypestring = "%s has been vaporized by %s";
+ w_deathtypestring = _("%s has been vaporized by %s");
return TRUE;
}
#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", "Port-O-Launch");
+REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", _("Port-O-Launch"))
#else
#ifdef SVQC
.entity porto_current;
if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
- W_SetupShot (self, FALSE, 4, "porto/fire.wav", 0);
+ W_SetupShot (self, FALSE, 4, "porto/fire.wav", CHAN_WEAPON, 0);
// always shoot from the eye
w_shotdir = v_forward;
w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
setorigin(gren, w_shotorg);
setsize(gren, '0 0 0', '0 0 0');
- gren.nextthink = time + cvar("g_balance_porto_primary_lifetime");
+ gren.nextthink = time + autocvar_g_balance_porto_primary_lifetime;
gren.think = W_Porto_Think;
gren.touch = W_Porto_Touch;
if(self.items & IT_STRENGTH)
- W_SetupProjectileVelocity(gren, cvar("g_balance_porto_primary_speed") * cvar("g_balance_powerup_strength_force"), 0);
+ W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed * autocvar_g_balance_powerup_strength_force, 0);
else
- W_SetupProjectileVelocity(gren, cvar("g_balance_porto_primary_speed"), 0);
+ W_SetupProjectileVelocity(gren, autocvar_g_balance_porto_primary_speed, 0);
gren.angles = vectoangles (gren.velocity);
gren.flags = FL_PROJECTILE;
{
self.BUTTON_ATCK = FALSE;
self.BUTTON_ATCK2 = FALSE;
- if(bot_aim(cvar("g_balance_porto_primary_speed"), 0, cvar("g_balance_grenadelauncher_primary_lifetime"), FALSE))
+ if(bot_aim(autocvar_g_balance_porto_primary_speed, 0, autocvar_g_balance_grenadelauncher_primary_lifetime, FALSE))
self.BUTTON_ATCK = TRUE;
}
else if (req == WR_THINK)
if (self.BUTTON_ATCK)
if (!self.porto_current)
if (!self.porto_forbidden)
- if (weapon_prepareattack(0, cvar("g_balance_porto_primary_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_porto_primary_refire))
{
W_Porto_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_porto_primary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_porto_primary_animtime, w_ready);
}
}
else if (req == WR_PRECACHE)
// nothing to do
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
- w_deathtypestring = "%s felt %s doing the impossible to him";
+ w_deathtypestring = _("%s felt %s doing the impossible to him");
return TRUE;
}
#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "rl", "rocketlauncher", "Rocket Launcher");
+REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "rl", "rocketlauncher", _("Rocket Launcher"))
#else
#ifdef SVQC
.float rl_release;
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
{
- if(self.owner.ammo_rockets < cvar("g_balance_rocketlauncher_ammo"))
+ if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
{
self.owner.cnt = WEP_ROCKET_LAUNCHER;
ATTACK_FINISHED(self.owner) = time;
self.event_damage = SUB_Null;
self.takedamage = DAMAGE_NO;
- RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_remote_damage"), cvar("g_balance_rocketlauncher_remote_edgedamage"), cvar("g_balance_rocketlauncher_remote_radius"), world, cvar("g_balance_rocketlauncher_remote_force"), self.projectiledeathtype | HITTYPE_BOUNCE, world);
+ RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
{
- if(self.owner.ammo_rockets < cvar("g_balance_rocketlauncher_ammo"))
+ if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
{
self.owner.cnt = WEP_ROCKET_LAUNCHER;
ATTACK_FINISHED(self.owner) = time;
{
if((self.spawnshieldtime >= 0)
? (time >= self.spawnshieldtime) // timer
- : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_remote_radius")) // safety device
+ : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
)
{
W_Rocket_DoRemoteExplode();
// accelerate
makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
- velspeed = cvar("g_balance_rocketlauncher_speed") * g_weaponspeedfactor - (self.velocity * v_forward);
+ velspeed = autocvar_g_balance_rocketlauncher_speed * g_weaponspeedfactor - (self.velocity * v_forward);
if (velspeed > 0)
- self.velocity = self.velocity + v_forward * min(cvar("g_balance_rocketlauncher_speedaccel") * g_weaponspeedfactor * frametime, velspeed);
+ self.velocity = self.velocity + v_forward * min(autocvar_g_balance_rocketlauncher_speedaccel * g_weaponspeedfactor * frametime, velspeed);
// laser guided, or remote detonation
if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
if(self == self.owner.lastrocket)
if not(self.owner.rl_release)
if not(self.BUTTON_ATCK2)
- if(cvar("g_balance_rocketlauncher_guiderate"))
+ if(autocvar_g_balance_rocketlauncher_guiderate)
if(time > self.pushltime)
if(self.owner.deadflag == DEAD_NO)
{
- f = cvar("g_balance_rocketlauncher_guideratedelay");
+ f = autocvar_g_balance_rocketlauncher_guideratedelay;
if(f)
f = bound(0, (time - self.pushltime) / f, 1);
else
desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs);
olddir = normalize(self.velocity);
-#if 0
- // disabled this code because it doesn't do what I want it to do :P
- cosminang = cos(cvar("g_balance_rocketlauncher_guidefadeangle") * DEG2RAD);
- cosmaxang = cos(cvar("g_balance_rocketlauncher_guidemaxangle") * DEG2RAD);
- cosang = desireddir * normalize(self.origin - desiredorigin);
- if(cosminang == cosmaxang)
- f *= (cosang >= cosminang);
- else
- f *= bound(0, (cosang - cosmaxang) / (cosminang - cosmaxang), 1);
-#endif
-
// now it gets tricky... we want to move like some curve to approximate the target direction
// but we are limiting the rate at which we can turn!
- goal = desiredorigin + ((self.origin - desiredorigin) * desireddir + cvar("g_balance_rocketlauncher_guidegoal")) * desireddir;
- newdir = rocket_steerto(olddir, normalize(goal - self.origin), cos(cvar("g_balance_rocketlauncher_guiderate") * f * frametime * DEG2RAD));
+ goal = desiredorigin + ((self.origin - desiredorigin) * desireddir + autocvar_g_balance_rocketlauncher_guidegoal) * desireddir;
+ newdir = rocket_steerto(olddir, normalize(goal - self.origin), cos(autocvar_g_balance_rocketlauncher_guiderate * f * frametime * DEG2RAD));
self.velocity = newdir * velspeed;
self.angles = vectoangles(self.velocity);
local entity flash;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_rocketlauncher_ammo");
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_rocketlauncher_ammo;
- W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", cvar("g_balance_rocketlauncher_damage"));
+ W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", CHAN_WEAPON, autocvar_g_balance_rocketlauncher_damage);
pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile = WarpZone_RefSys_SpawnSameRefSys(self);
missile.owner = self;
self.lastrocket = missile;
- if(cvar("g_balance_rocketlauncher_detonatedelay") >= 0)
- missile.spawnshieldtime = time + cvar("g_balance_rocketlauncher_detonatedelay");
+ if(autocvar_g_balance_rocketlauncher_detonatedelay >= 0)
+ missile.spawnshieldtime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
else
missile.spawnshieldtime = -1;
- missile.pushltime = time + cvar("g_balance_rocketlauncher_guidedelay");
+ missile.pushltime = time + autocvar_g_balance_rocketlauncher_guidedelay;
missile.classname = "rocket";
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_rocketlauncher_damage") * 2; // * 2 because it can be detonated inflight which makes it even more dangerous
+ missile.bot_dodgerating = autocvar_g_balance_rocketlauncher_damage * 2; // * 2 because it can be detonated inflight which makes it even more dangerous
missile.takedamage = DAMAGE_YES;
- missile.damageforcescale = cvar("g_balance_rocketlauncher_damageforcescale");
- missile.health = cvar("g_balance_rocketlauncher_health");
+ missile.damageforcescale = autocvar_g_balance_rocketlauncher_damageforcescale;
+ missile.health = autocvar_g_balance_rocketlauncher_health;
missile.event_damage = W_Rocket_Damage;
missile.movetype = MOVETYPE_FLY;
setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
setorigin (missile, w_shotorg - v_forward * 3); // move it back so it hits the wall at the right point
- W_SetupProjectileVelocity(missile, cvar("g_balance_rocketlauncher_speedstart"), 0);
+ W_SetupProjectileVelocity(missile, autocvar_g_balance_rocketlauncher_speedstart, 0);
missile.angles = vectoangles (missile.velocity);
missile.touch = W_Rocket_Touch;
missile.think = W_Rocket_Think;
missile.nextthink = time;
- missile.cnt = time + cvar("g_balance_rocketlauncher_lifetime");
+ missile.cnt = time + autocvar_g_balance_rocketlauncher_lifetime;
missile.flags = FL_PROJECTILE;
- CSQCProjectile(missile, cvar("g_balance_rocketlauncher_guiderate") == 0 && cvar("g_balance_rocketlauncher_speedaccel") == 0, PROJECTILE_ROCKET, FALSE); // because of fly sound
+ CSQCProjectile(missile, autocvar_g_balance_rocketlauncher_guiderate == 0 && autocvar_g_balance_rocketlauncher_speedaccel == 0, PROJECTILE_ROCKET, FALSE); // because of fly sound
// muzzle flash for 1st person view
flash = spawn ();
if (req == WR_AIM)
{
// aim and decide to fire if appropriate
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_rocketlauncher_speed"), 0, cvar("g_balance_rocketlauncher_lifetime"), FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_rocketlauncher_speed, 0, autocvar_g_balance_rocketlauncher_lifetime, FALSE);
if(skill >= 2) // skill 0 and 1 bots won't detonate rockets!
{
// decide whether to detonate rockets
local entity missile, targetlist, targ;
local float edgedamage, coredamage, edgeradius, recipricoledgeradius, d;
local float selfdamage, teamdamage, enemydamage;
- edgedamage = cvar("g_balance_rocketlauncher_edgedamage");
- coredamage = cvar("g_balance_rocketlauncher_damage");
- edgeradius = cvar("g_balance_rocketlauncher_radius");
+ edgedamage = autocvar_g_balance_rocketlauncher_edgedamage;
+ coredamage = autocvar_g_balance_rocketlauncher_damage;
+ edgeradius = autocvar_g_balance_rocketlauncher_radius;
recipricoledgeradius = 1 / edgeradius;
selfdamage = 0;
teamdamage = 0;
}
local float desirabledamage;
desirabledamage = enemydamage;
- if (teamplay != 1 && time > self.invincible_finished && time > self.spawnshieldtime)
- desirabledamage = desirabledamage - selfdamage * cvar("g_balance_selfdamagepercent");
- if (self.team && teamplay != 1)
+ if (time > self.invincible_finished && time > self.spawnshieldtime)
+ desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
+ if (teams_matter && self.team)
desirabledamage = desirabledamage - teamdamage;
missile = find(world, classname, "rocket");
{
if (self.BUTTON_ATCK)
{
- if(self.rl_release || cvar("g_balance_rocketlauncher_guidestop"))
- if(weapon_prepareattack(0, cvar("g_balance_rocketlauncher_refire")))
+ if(self.rl_release || autocvar_g_balance_rocketlauncher_guidestop)
+ if(weapon_prepareattack(0, autocvar_g_balance_rocketlauncher_refire))
{
W_Rocket_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_rocketlauncher_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_rocketlauncher_animtime, w_ready);
self.rl_release = 0;
}
}
{
// don't switch while guiding a missile
if ((ATTACK_FINISHED(self) <= time || self.weapon != WEP_ROCKET_LAUNCHER)
- && self.ammo_rockets < cvar("g_balance_rocketlauncher_ammo"))
+ && self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
return FALSE;
}
else if (req == WR_CHECKAMMO2)
precache_sound("weapons/rocket_impact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s exploded";
+ w_deathtypestring = _("%s exploded");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
- w_deathtypestring = "%s got too close to %s's rocket";
+ w_deathtypestring = _("%s got too close to %s's rocket");
else if(w_deathtype & HITTYPE_SPLASH)
- w_deathtypestring = "%s almost dodged %s's rocket";
+ w_deathtypestring = _("%s almost dodged %s's rocket");
else
- w_deathtypestring = "%s ate %s's rocket";
+ w_deathtypestring = _("%s ate %s's rocket");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 9, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "seeker", "seeker", "T.A.G. Seeker");
+REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 8, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "seeker", "seeker", _("T.A.G. Seeker"))
#else
#ifdef SVQC
-//.float speed; = switchweapon
//.float proxytime; = autoswitch
//.float tl; = wait
void Seeker_Missile_Explode ()
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
remove (self);
}
vector desireddir, olddir, newdir, eorg;
float turnrate;
float dist;
+ float spd;
if (time > self.cnt)
{
Seeker_Missile_Explode();
}
- if (!self.switchweapon)
- self.switchweapon = cvar("g_balance_seeker_missile_speed");
-
- if ((self.switchweapon < cvar("g_balance_seeker_missile_speed_max")) && cvar("g_balance_seeker_missile_speed_accel"))
- self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_accel");
-
- if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max"))
- self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel");
+ spd = vlen(self.velocity);
+ spd = bound(
+ spd - autocvar_g_balance_seeker_missile_decel * frametime,
+ autocvar_g_balance_seeker_missile_speed_max,
+ spd + autocvar_g_balance_seeker_missile_accel * frametime
+ );
if (self.enemy != world)
if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
{
e = self.enemy;
eorg = 0.5 * (e.absmin + e.absmax);
- turnrate = cvar("g_balance_seeker_missile_turnrate"); // how fast to turn
+ turnrate = autocvar_g_balance_seeker_missile_turnrate; // how fast to turn
desireddir = normalize(eorg - self.origin);
olddir = normalize(self.velocity); // get my current direction
dist = vlen(eorg - self.origin);
// Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
- if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
+ if (autocvar_g_balance_seeker_missile_smart && (dist > autocvar_g_balance_seeker_missile_smart_mindist))
{
// Is it a better idea (shorter distance) to trace to the target itself?
if ( vlen(self.origin + olddir * self.wait) < dist)
traceline(self.origin, eorg, FALSE, self);
// Setup adaptive tracelength
- self.wait = bound(cvar("g_balance_seeker_missile_smart_trace_min"), vlen(self.origin - trace_endpos), self.wait = cvar("g_balance_seeker_missile_smart_trace_max"));
+ self.wait = bound(autocvar_g_balance_seeker_missile_smart_trace_min, vlen(self.origin - trace_endpos), self.wait = autocvar_g_balance_seeker_missile_smart_trace_max);
// Calc how important it is that we turn and add this to the desierd (enemy) dir.
desireddir = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
}
newdir = normalize(olddir + desireddir * turnrate); // take the average of the 2 directions; not the best method but simple & easy
- self.velocity = newdir * self.switchweapon; // make me fly in the new direction at my flight speed
+ self.velocity = newdir * spd; // make me fly in the new direction at my flight speed
}
// Proxy
- if (cvar("g_balance_seeker_missile_proxy"))
+ if (autocvar_g_balance_seeker_missile_proxy)
{
- if ( dist <= cvar("g_balance_seeker_missile_proxy_maxrange"))
+ if ( dist <= autocvar_g_balance_seeker_missile_proxy_maxrange)
{
if (self.autoswitch == 0)
{
- self.autoswitch = time + cvar("g_balance_seeker_missile_proxy_delay");
+ self.autoswitch = time + autocvar_g_balance_seeker_missile_proxy_delay;
}
else
{
self.think = Seeker_Missile_Think;
self.nextthink = time;// + cvar("g_balance_seeker_missile_activate_delay"); // cant dealy with csqc projectiles
- if (cvar("g_balance_seeker_missile_proxy"))
+ if (autocvar_g_balance_seeker_missile_proxy)
self.movetype = MOVETYPE_BOUNCEMISSILE;
else
self.movetype = MOVETYPE_FLYMISSILE;
{
local entity missile;
- if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_seeker_missile_ammo;
makevectors(self.v_angle);
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", cvar("g_balance_seeker_missile_damage"));
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", CHAN_WEAPON, 0);
w_shotorg += f_diff;
pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile.owner = self;
missile.classname = "seeker_missile";
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_seeker_missile_damage");
+ missile.bot_dodgerating = autocvar_g_balance_seeker_missile_damage;
missile.think = Seeker_Missile_Think;
missile.touch = Seeker_Missile_Touch;
missile.event_damage = Seeker_Missile_Damage;
missile.nextthink = time;// + 0.2;// + cvar("g_balance_seeker_missile_activate_delay");
- missile.cnt = time + cvar("g_balance_seeker_missile_lifetime");
+ missile.cnt = time + autocvar_g_balance_seeker_missile_lifetime;
missile.enemy = self.enemy;
missile.solid = SOLID_BBOX;
missile.scale = 2;
missile.takedamage = DAMAGE_YES;
- missile.health = cvar("g_balance_seeker_missile_health");
- missile.damageforcescale = cvar("g_balance_seeker_missile_damageforcescale");
+ missile.health = autocvar_g_balance_seeker_missile_health;
+ missile.damageforcescale = autocvar_g_balance_seeker_missile_damageforcescale;
missile.projectiledeathtype = WEP_SEEKER;
//missile.think = Seeker_Missile_Animate; // csqc projectiles.
missile.flags = FL_PROJECTILE;
W_SETUPPROJECTILEVELOCITY_UP(missile, g_balance_seeker_missile);
- missile.switchweapon = vlen(missile.velocity);
missile.angles = vectoangles (missile.velocity);
CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
entity oldself,oldenemy;
self.cnt = self.cnt - 1;
- if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO))
+ if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER))
{
remove(self);
return;
}
- self.nextthink = time + cvar("g_balance_seeker_missile_delay");
+ self.nextthink = time + autocvar_g_balance_seeker_missile_delay;
oldself = self;
self = self.owner;
if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
{
e = spawn();
- e.cnt = cvar("g_balance_seeker_missile_count");
+ e.cnt = autocvar_g_balance_seeker_missile_count;
e.owner = self.owner;
e.enemy = other;
e.think = Seeker_Vollycontroler_Think;
{
local entity missile;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_seeker_tag_ammo;
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", 0);
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
missile = spawn();
missile.owner = self;
missile.bot_dodgerating = 50;
missile.touch = Seeker_Tag_Touch;
missile.think = SUB_Remove;
- missile.nextthink = time + cvar("g_balance_seeker_tag_lifetime");
+ missile.nextthink = time + autocvar_g_balance_seeker_tag_lifetime;
missile.movetype = MOVETYPE_FLY;
missile.solid = SOLID_BBOX;
missile.owner = self;
missile.takedamage = DAMAGE_YES;
missile.event_damage = Seeker_Tag_Explode;
- missile.health = cvar("g_balance_seeker_tag_health");
- missile.damageforcescale = cvar("g_balance_seeker_tag_damageforcescale");
+ missile.health = autocvar_g_balance_seeker_tag_health;
+ missile.damageforcescale = autocvar_g_balance_seeker_tag_damageforcescale;
setorigin (missile, w_shotorg);
setsize (missile, '-2 -2 -2', '2 2 2');
{
self.event_damage = SUB_Null;
- RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
+ RadiusDamage (self, self.owner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
remove (self);
}
float c;
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
+ self.ammo_rockets = self.ammo_rockets - autocvar_g_balance_seeker_flac_ammo;
c = mod(self.bulletcounter, 4);
switch(c)
f_diff = '+1.25 +3.75 0';
break;
}
- W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", cvar("g_balance_seeker_flac_damage"));
+ W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_flac_damage);
w_shotorg += f_diff;
pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
missile.owner = missile.realowner = self;
missile.classname = "missile";
missile.bot_dodge = TRUE;
- missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
+ missile.bot_dodgerating = autocvar_g_balance_seeker_flac_damage;
missile.touch = Seeker_Flac_Explode;
missile.use = Seeker_Flac_Explode;
missile.think = adaptor_think2use_hittype_splash;
- missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
+ missile.nextthink = time + autocvar_g_balance_seeker_flac_lifetime + autocvar_g_balance_seeker_flac_lifetime_rand;
missile.solid = SOLID_BBOX;
missile.movetype = MOVETYPE_FLY;
missile.projectiledeathtype = WEP_SEEKER;
float w_seeker(float req)
{
if (req == WR_AIM)
- self.BUTTON_ATCK = bot_aim(cvar("g_balance_seeker_tag_speed"), 0, 20, FALSE);
+ self.BUTTON_ATCK = bot_aim(autocvar_g_balance_seeker_tag_speed, 0, 20, FALSE);
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_seeker_tag_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_seeker_tag_refire))
{
Seeker_Fire_Tag();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_seeker_tag_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_seeker_tag_animtime, w_ready);
}
if (self.BUTTON_ATCK2)
- if (weapon_prepareattack(1, cvar("g_balance_seeker_flac_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_seeker_flac_refire))
{
Seeker_Fire_Flac();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_seeker_flac_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_seeker_flac_animtime, w_ready);
}
}
else if (req == WR_SETUP)
weapon_setup(WEP_SEEKER);
else if (req == WR_CHECKAMMO1)
- return self.ammo_rockets >= cvar("g_balance_seeker_tag_ammo") + cvar("g_balance_seeker_missile_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_seeker_tag_ammo + autocvar_g_balance_seeker_missile_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_rockets >= cvar("g_balance_seeker_flac_ammo");
+ return self.ammo_rockets >= autocvar_g_balance_seeker_flac_ammo;
return TRUE;
};
#endif
precache_sound("weapons/tag_impact.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s played with tiny rockets";
+ w_deathtypestring = _("%s played with tiny rockets");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s ran into %s's flac";
+ w_deathtypestring = _("%s ran into %s's flac");
else
- w_deathtypestring = "%s was tagged by %s";
+ w_deathtypestring = _("%s was tagged by %s");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(SHOTGUN, w_shotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "shotgun", "shotgun", "Shotgun");
+REGISTER_WEAPON(SHOTGUN, w_shotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "shotgun", "shotgun", _("Shotgun"))
#else
#ifdef SVQC
void W_Shotgun_Attack (void)
float bulletconstant;
local entity flash;
- ammoamount = cvar("g_balance_shotgun_primary_ammo");
- bullets = cvar("g_balance_shotgun_primary_bullets");
- d = cvar("g_balance_shotgun_primary_damage");
- f = cvar("g_balance_shotgun_primary_force");
- spread = cvar("g_balance_shotgun_primary_spread");
- bulletspeed = cvar("g_balance_shotgun_primary_speed");
- bulletconstant = cvar("g_balance_shotgun_primary_bulletconstant");
+ ammoamount = autocvar_g_balance_shotgun_primary_ammo;
+ bullets = autocvar_g_balance_shotgun_primary_bullets;
+ d = autocvar_g_balance_shotgun_primary_damage;
+ f = autocvar_g_balance_shotgun_primary_force;
+ spread = autocvar_g_balance_shotgun_primary_spread;
+ bulletspeed = autocvar_g_balance_shotgun_primary_speed;
+ bulletconstant = autocvar_g_balance_shotgun_primary_bulletconstant;
- W_SetupShot (self, cvar("g_antilag_bullets") && bulletspeed >= cvar("g_antilag_bullets"), 5, "weapons/shotgun_fire.wav", cvar("g_balance_shotgun_primary_damage"));
+ W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CHAN_WEAPON, d * bullets);
for (sc = 0;sc < bullets;sc = sc + 1)
fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
endFireBallisticBullet();
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
self.ammo_shells = self.ammo_shells - ammoamount;
- pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"));
+ pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_shotgun_primary_ammo);
// casing code
- if (cvar("g_casings") >= 1)
+ if (autocvar_g_casings >= 1)
for (sc = 0;sc < ammoamount;sc = sc + 1)
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, self);
vector angle;
angle = v_forward;
+ float meleetime;
+ meleetime = autocvar_g_balance_shotgun_secondary_melee_time * W_WeaponRateFactor();
+
// perform trace
float f;
- f = (self.cnt + cvar("g_balance_shotgun_secondary_melee_time") - time) / cvar("g_balance_shotgun_secondary_melee_time") * 2 - 1;
+ f = (self.cnt + meleetime - time) / meleetime * 2 - 1;
vector targpos;
- targpos = self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_shotgun_secondary_melee_range") + v_right * f * cvar("g_balance_shotgun_secondary_melee_swing") + v_up * f * cvar("g_balance_shotgun_secondary_melee_swing");
+ targpos = self.owner.origin + self.owner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body"))
{
vector force;
- force = angle * cvar("g_balance_shotgun_secondary_force");
- Damage (trace_ent, self.owner, self.owner, cvar("g_balance_shotgun_secondary_damage") * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force);
- Damage_RecordDamage(self.owner, WEP_SHOTGUN | HITTYPE_SECONDARY, cvar("g_balance_shotgun_secondary_damage") * min(1, f + 1));
+ force = angle * autocvar_g_balance_shotgun_secondary_force;
+ if(accuracy_isgooddamage(self.owner, trace_ent))
+ accuracy_add(self.owner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
+ Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force);
remove(self);
}
- else if(time >= self.cnt + cvar("g_balance_shotgun_secondary_melee_time")) // missed, remove ent
+ else if(time >= self.cnt + meleetime) // missed, remove ent
remove(self);
else // continue swinging the weapon in hope of hitting someone :)
self.nextthink = time;
void W_Shotgun_Attack2 (void)
{
sound (self, CHAN_PROJECTILE, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), w_ready);
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_shotgun_secondary_animtime, w_ready);
entity meleetemp;
meleetemp = spawn();
meleetemp.owner = self;
meleetemp.think = shotgun_meleethink;
- meleetemp.nextthink = time + cvar("g_balance_shotgun_secondary_melee_delay");
- W_SetupShot_Range(self, TRUE, 0, "", cvar("g_balance_shotgun_secondary_damage"), cvar("g_balance_shotgun_secondary_melee_range"));
+ meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay;
+ W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_shotgun_secondary_damage, autocvar_g_balance_shotgun_secondary_melee_range);
}
void spawnfunc_weapon_shotgun(); // defined in t_items.qc
float w_shotgun(float req)
{
if (req == WR_AIM)
- if(vlen(self.origin-self.enemy.origin)>200)
- self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
- else
+ if(vlen(self.origin-self.enemy.origin) <= autocvar_g_balance_shotgun_secondary_melee_range)
self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
+ else
+ self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
{
if (time >= self.shotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary
{
- if(weapon_prepareattack(0, cvar("g_balance_shotgun_primary_animtime")))
+ if(weapon_prepareattack(0, autocvar_g_balance_shotgun_primary_animtime))
{
W_Shotgun_Attack();
- self.shotgun_primarytime = time + cvar("g_balance_shotgun_primary_refire");
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_shotgun_primary_animtime"), w_ready);
+ self.shotgun_primarytime = time + autocvar_g_balance_shotgun_primary_refire;
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_shotgun_primary_animtime, w_ready);
}
}
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_shotgun_secondary"))
- if (weapon_prepareattack(1, cvar("g_balance_shotgun_secondary_refire")))
+ if (self.BUTTON_ATCK2 && autocvar_g_balance_shotgun_secondary)
+ if (weapon_prepareattack(1, autocvar_g_balance_shotgun_secondary_refire))
{
// attempt forcing playback of the anim by switching to another anim (that we never play) here...
weapon_thinkf(WFRAME_FIRE1, 0, W_Shotgun_Attack2);
else if (req == WR_SETUP)
weapon_setup(WEP_SHOTGUN);
else if (req == WR_CHECKAMMO1)
- return self.ammo_shells >= cvar("g_balance_shotgun_primary_ammo");
+ return self.ammo_shells >= autocvar_g_balance_shotgun_primary_ammo;
else if (req == WR_CHECKAMMO2)
{
return TRUE;
precache_sound("weapons/ric3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun";
+ w_deathtypestring = _("%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun");
else
- w_deathtypestring = "%s was gunned by %s";
+ w_deathtypestring = _("%s was gunned by %s");
}
return TRUE;
}
--- /dev/null
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(SNIPERRIFLE, w_sniperrifle, IT_NAILS, 7, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "campingrifle", "sniperrifle", _("Sniper Rifle"))
+#else
+#ifdef SVQC
+//Sniper rifle Primary mode: manually operated bolt*, Secondary: full automatic**
+//* Manually operating the bolt means that all the power of the gas is used to propell the bullet. In this mode the bolt is prevented from moving backwards in response to the firing of the bullet.
+//** In fully automatic mode some of the gas is used to extract and reload the next cartrige, thus there is less power and range.
+
+.float sniperrifle_accumulator;
+
+float W_SniperRifle_CheckMaxBullets(float checkammo)
+{
+ float maxbulls;
+ maxbulls = autocvar_g_balance_sniperrifle_magazinecapacity;
+ if(!maxbulls)
+ maxbulls = 8; // match HUD
+ if(checkammo)
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ maxbulls = min(maxbulls, floor(self.ammo_nails / min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)));
+ if(self.sniperrifle_bulletcounter > maxbulls || !autocvar_g_balance_sniperrifle_magazinecapacity)
+ self.sniperrifle_bulletcounter = maxbulls;
+ return (self.sniperrifle_bulletcounter == maxbulls);
+}
+
+void W_SniperRifle_ReloadedAndReady()
+{
+ float t;
+ self.sniperrifle_bulletcounter = autocvar_g_balance_sniperrifle_magazinecapacity;
+ W_SniperRifle_CheckMaxBullets(TRUE);
+ t = ATTACK_FINISHED(self) - autocvar_g_balance_sniperrifle_reloadtime - 1;
+ ATTACK_FINISHED(self) = t;
+ w_ready();
+}
+
+float W_SniperRifle_Reload()
+{
+ float t;
+
+ W_SniperRifle_CheckMaxBullets(TRUE);
+
+ if(self.ammo_nails < min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)) // when we get here, bulletcounter must be 0 or -1
+ {
+ print("cannot reload... not enough bullets\n");
+ self.sniperrifle_bulletcounter = -1; // reload later
+ W_SwitchToOtherWeapon(self);
+ return 0;
+ }
+
+ if (self.sniperrifle_bulletcounter >= autocvar_g_balance_sniperrifle_magazinecapacity)
+ return 0;
+
+ if (self.weaponentity)
+ {
+ if (self.weaponentity.wframe == WFRAME_RELOAD)
+ return 0;
+
+ // allow to switch away while reloading, but this will cause a new reload!
+ self.weaponentity.state = WS_READY;
+ }
+
+ sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
+
+ t = max(time, ATTACK_FINISHED(self)) + autocvar_g_balance_sniperrifle_reloadtime + 1;
+ ATTACK_FINISHED(self) = t;
+
+ weapon_thinkf(WFRAME_RELOAD, autocvar_g_balance_sniperrifle_reloadtime, W_SniperRifle_ReloadedAndReady);
+
+ self.sniperrifle_bulletcounter = -1;
+
+ return 1;
+}
+
+void W_SniperRifle_CheckReloadAndReady()
+{
+ w_ready();
+ if(self.sniperrifle_bulletcounter <= 0)
+ if(W_SniperRifle_Reload())
+ return;
+}
+
+void W_SniperRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
+{
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.ammo_nails -= pAmmo;
+
+ if(deathtype & HITTYPE_SECONDARY)
+ W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, "weapons/campingrifle_fire2.wav", CHAN_WEAPON, autocvar_g_balance_sniperrifle_secondary_damage + autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage);
+ else
+ W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, "weapons/campingrifle_fire.wav", CHAN_WEAPON, autocvar_g_balance_sniperrifle_primary_damage + autocvar_g_balance_sniperrifle_primary_headshotaddeddamage);
+
+ pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
+
+ if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
+ {
+ w_shotdir = v_forward;
+ w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
+ }
+
+ if(deathtype & HITTYPE_SECONDARY)
+ fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (autocvar_g_balance_sniperrifle_secondary_tracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
+ else
+ fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (autocvar_g_balance_sniperrifle_primary_tracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
+ endFireBallisticBullet();
+
+ 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);
+
+ self.sniperrifle_bulletcounter = self.sniperrifle_bulletcounter - 1;
+ W_SniperRifle_CheckMaxBullets(TRUE);
+}
+
+void W_SniperRifle_Attack()
+{
+ W_SniperRifle_FireBullet(autocvar_g_balance_sniperrifle_primary_spread, autocvar_g_balance_sniperrifle_primary_damage, autocvar_g_balance_sniperrifle_primary_headshotaddeddamage, autocvar_g_balance_sniperrifle_primary_force, autocvar_g_balance_sniperrifle_primary_speed, autocvar_g_balance_sniperrifle_primary_lifetime, autocvar_g_balance_sniperrifle_primary_ammo, WEP_SNIPERRIFLE, autocvar_g_balance_sniperrifle_primary_bulletconstant);
+}
+
+void W_SniperRifle_Attack2()
+{
+ W_SniperRifle_FireBullet(autocvar_g_balance_sniperrifle_secondary_spread, autocvar_g_balance_sniperrifle_secondary_damage, autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage, autocvar_g_balance_sniperrifle_secondary_force, autocvar_g_balance_sniperrifle_secondary_speed, autocvar_g_balance_sniperrifle_secondary_lifetime, autocvar_g_balance_sniperrifle_secondary_ammo, WEP_SNIPERRIFLE | HITTYPE_SECONDARY, autocvar_g_balance_sniperrifle_secondary_bulletconstant);
+}
+
+void spawnfunc_weapon_sniperrifle (void)
+{
+ weapon_defaultspawnfunc(WEP_SNIPERRIFLE);
+}
+
+// compatibility alias
+void spawnfunc_weapon_campingrifle (void)
+{
+ spawnfunc_weapon_sniperrifle();
+}
+
+.void(void) sniperrifle_bullethail_attackfunc;
+.float sniperrifle_bullethail_frame;
+.float sniperrifle_bullethail_animtime;
+.float sniperrifle_bullethail_refire;
+void W_SniperRifle_BulletHail_Continue()
+{
+ float r, sw, af;
+ W_SniperRifle_CheckReloadAndReady();
+ if(self.sniperrifle_bulletcounter < 0)
+ return; // reloading, so we are done
+ sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
+ af = ATTACK_FINISHED(self);
+ self.switchweapon = self.weapon;
+ ATTACK_FINISHED(self) = time;
+ print(ftos(self.ammo_nails), "\n");
+ r = weapon_prepareattack(self.sniperrifle_bullethail_frame == WFRAME_FIRE2, self.sniperrifle_bullethail_refire);
+ if(self.switchweapon == self.weapon)
+ self.switchweapon = sw;
+ if(r)
+ {
+ self.sniperrifle_bullethail_attackfunc();
+ weapon_thinkf(self.sniperrifle_bullethail_frame, self.sniperrifle_bullethail_animtime, W_SniperRifle_BulletHail_Continue);
+ print("thinkf set\n");
+ }
+ else
+ {
+ ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
+ print("out of ammo... ", ftos(self.weaponentity.state), "\n");
+ }
+}
+
+void W_SniperRifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
+{
+ // if we get here, we have at least one bullet to fire
+ AttackFunc();
+ if(mode)
+ {
+ // continue hail
+ self.sniperrifle_bullethail_attackfunc = AttackFunc;
+ self.sniperrifle_bullethail_frame = fr;
+ self.sniperrifle_bullethail_animtime = animtime;
+ self.sniperrifle_bullethail_refire = refire;
+ weapon_thinkf(fr, animtime, W_SniperRifle_BulletHail_Continue);
+ }
+ else
+ {
+ // just one shot
+ weapon_thinkf(fr, animtime, W_SniperRifle_CheckReloadAndReady);
+ }
+}
+
+.float bot_secondary_sniperriflemooth;
+float w_sniperrifle(float req)
+{
+ float full;
+ if (req == WR_AIM)
+ {
+ self.BUTTON_ATCK=FALSE;
+ self.BUTTON_ATCK2=FALSE;
+ if(vlen(self.origin-self.enemy.origin) > 1000)
+ self.bot_secondary_sniperriflemooth = 0;
+ if(self.bot_secondary_sniperriflemooth == 0)
+ {
+ if(bot_aim(autocvar_g_balance_sniperrifle_primary_speed, 0, autocvar_g_balance_sniperrifle_primary_lifetime, TRUE))
+ {
+ self.BUTTON_ATCK = TRUE;
+ if(random() < 0.01) self.bot_secondary_sniperriflemooth = 1;
+ }
+ }
+ else
+ {
+ if(bot_aim(autocvar_g_balance_sniperrifle_secondary_speed, 0, autocvar_g_balance_sniperrifle_secondary_lifetime, TRUE))
+ {
+ self.BUTTON_ATCK2 = TRUE;
+ if(random() < 0.03) self.bot_secondary_sniperriflemooth = 0;
+ }
+ }
+ }
+ else if (req == WR_THINK)
+ {
+ if(self.sniperrifle_bulletcounter < 0) // forced reload (e.g. because interrupted)
+ {
+ self.wish_reload = 1;
+ }
+ else
+ {
+ self.sniperrifle_accumulator = bound(time - autocvar_g_balance_sniperrifle_bursttime, self.sniperrifle_accumulator, time);
+ if (self.BUTTON_ATCK)
+ if (weapon_prepareattack_check(0, autocvar_g_balance_sniperrifle_primary_refire))
+ if (time >= self.sniperrifle_accumulator + autocvar_g_balance_sniperrifle_primary_burstcost)
+ {
+ weapon_prepareattack_do(0, autocvar_g_balance_sniperrifle_primary_refire);
+ W_SniperRifle_BulletHail(autocvar_g_balance_sniperrifle_primary_bullethail, W_SniperRifle_Attack, WFRAME_FIRE1, autocvar_g_balance_sniperrifle_primary_animtime, autocvar_g_balance_sniperrifle_primary_refire);
+ self.sniperrifle_accumulator += autocvar_g_balance_sniperrifle_primary_burstcost;
+ }
+ if (self.BUTTON_ATCK2)
+ {
+ if (autocvar_g_balance_sniperrifle_secondary)
+ {
+ if(autocvar_g_balance_sniperrifle_secondary_reload)
+ self.wish_reload = 1;
+ else
+ {
+ if (weapon_prepareattack_check(1, autocvar_g_balance_sniperrifle_secondary_refire))
+ if (time >= self.sniperrifle_accumulator + autocvar_g_balance_sniperrifle_secondary_burstcost)
+ {
+ weapon_prepareattack_do(1, autocvar_g_balance_sniperrifle_secondary_refire);
+ W_SniperRifle_BulletHail(autocvar_g_balance_sniperrifle_secondary_bullethail, W_SniperRifle_Attack2, WFRAME_FIRE2, autocvar_g_balance_sniperrifle_secondary_animtime, autocvar_g_balance_sniperrifle_primary_refire);
+ self.sniperrifle_accumulator += autocvar_g_balance_sniperrifle_secondary_burstcost;
+ }
+ }
+ }
+ }
+ }
+ if(self.wish_reload)
+ {
+ if(self.switchweapon == self.weapon)
+ {
+ if(self.weaponentity.state == WS_READY)
+ {
+ self.wish_reload = 0;
+ W_SniperRifle_Reload();
+ }
+ }
+ }
+ }
+ else if (req == WR_PRECACHE)
+ {
+ precache_model ("models/weapons/g_campingrifle.md3");
+ precache_model ("models/weapons/v_campingrifle.md3");
+ precache_model ("models/weapons/h_campingrifle.iqm");
+ precache_sound ("weapons/campingrifle_reload.wav");
+ precache_sound ("weapons/campingrifle_fire.wav");
+ precache_sound ("weapons/campingrifle_fire2.wav");
+ }
+ else if (req == WR_SETUP)
+ {
+ weapon_setup(WEP_SNIPERRIFLE);
+
+ full = W_SniperRifle_CheckMaxBullets(TRUE);
+ if(autocvar_g_balance_sniperrifle_auto_reload_on_switch)
+ if(!full)
+ self.sniperrifle_bulletcounter = -1;
+ }
+ else if (req == WR_CHECKAMMO1)
+ return self.ammo_nails >= autocvar_g_balance_sniperrifle_primary_ammo;
+ else if (req == WR_CHECKAMMO2)
+ return self.ammo_nails >= autocvar_g_balance_sniperrifle_secondary_ammo;
+ else if (req == WR_RELOAD)
+ {
+ self.wish_reload = 1;
+ }
+ else if (req == WR_RESETPLAYER)
+ {
+ self.sniperrifle_accumulator = time - autocvar_g_balance_sniperrifle_bursttime;
+ self.sniperrifle_bulletcounter = autocvar_g_balance_sniperrifle_magazinecapacity;
+ W_SniperRifle_CheckMaxBullets(FALSE);
+ }
+ return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_sniperrifle(float req)
+{
+ if(req == 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.2)
+ sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+ else if(w_random < 0.4)
+ sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+ else if(w_random < 0.5)
+ sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+ }
+ }
+ else if(req == WR_PRECACHE)
+ {
+ precache_sound("weapons/ric1.wav");
+ precache_sound("weapons/ric2.wav");
+ precache_sound("weapons/ric3.wav");
+ }
+ else if (req == WR_SUICIDEMESSAGE)
+ {
+ if(w_deathtype & HITTYPE_SECONDARY)
+ w_deathtypestring = _("%s shot themself automatically");
+ else
+ w_deathtypestring = _("%s sniped themself somehow");
+ }
+ else if (req == WR_KILLMESSAGE)
+ {
+ if(w_deathtype & HITTYPE_SECONDARY)
+ {
+ if(w_deathtype & HITTYPE_BOUNCE)
+ w_deathtypestring = _("%s failed to hide from %s's bullet hail");
+ else
+ w_deathtypestring = _("%s died in %s's bullet hail");
+ }
+ else
+ {
+ if(w_deathtype & HITTYPE_BOUNCE)
+ {
+ // TODO special headshot message here too?
+ w_deathtypestring = _("%s failed to hide from %s's rifle");
+ }
+ else
+ {
+ if(w_deathtype & HITTYPE_HEADSHOT)
+ w_deathtypestring = _("%s got hit in the head by %s");
+ else
+ w_deathtypestring = _("%s was sniped by %s");
+ }
+ }
+ }
+ return TRUE;
+}
+#endif
+#endif
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(TUBA, w_tuba, 0, 1, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "tuba", "tuba", "@!#%'n Tuba");
+REGISTER_WEAPON(TUBA, w_tuba, 0, 1, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "tuba", "tuba", _("@!#%'n Tuba"))
#else
#ifdef SVQC
//#define TUBA_NOTE(n) strcat("weapons/tuba_note", ftos(n), ".wav")
return;
}
self.nextthink = time;
- dist_mult = cvar("g_balance_tuba_attenuation") / cvar("snd_soundradius");
+ dist_mult = autocvar_g_balance_tuba_attenuation / autocvar_snd_soundradius;
FOR_EACH_REALCLIENT(e)
if(e != self.owner)
{
{
vector o;
float c, n;
- W_SetupShot(self, FALSE, 2, "", cvar("g_balance_tuba_damage"));
+ W_SetupShot(self, FALSE, 2, "", 0, autocvar_g_balance_tuba_damage);
if(self.tuba_notecount)
{
self.tuba_notecount = FALSE;
Net_LinkEntity(self.tuba_note, FALSE, 0, W_Tuba_NoteSendEntity);
}
- self.tuba_note.teleport_time = time + cvar("g_balance_tuba_refire") * 2; // so it can get prolonged safely
+ self.tuba_note.teleport_time = time + autocvar_g_balance_tuba_refire * 2; // so it can get prolonged safely
- //sound(self, c, TUBA_NOTE(n), bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1), cvar("g_balance_tuba_attenuation"));
- RadiusDamage(self, self, cvar("g_balance_tuba_damage"), cvar("g_balance_tuba_edgedamage"), cvar("g_balance_tuba_radius"), world, cvar("g_balance_tuba_force"), hittype | WEP_TUBA, world);
+ //sound(self, c, TUBA_NOTE(n), bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1), autocvar_g_balance_tuba_attenuation);
+ RadiusDamage(self, self, autocvar_g_balance_tuba_damage, autocvar_g_balance_tuba_edgedamage, autocvar_g_balance_tuba_radius, world, autocvar_g_balance_tuba_force, hittype | WEP_TUBA, world);
o = gettaginfo(self.exteriorweaponentity, 0);
if(time > self.tuba_smoketime)
{
// bots cannot play the Tuba well yet
// I think they should start with the recorder first
- if(vlen(self.origin - self.enemy.origin) < cvar("g_balance_tuba_radius"))
+ if(vlen(self.origin - self.enemy.origin) < autocvar_g_balance_tuba_radius)
{
if(random() > 0.5)
self.BUTTON_ATCK = 1;
else if (req == WR_THINK)
{
if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, cvar("g_balance_tuba_refire")))
+ if (weapon_prepareattack(0, autocvar_g_balance_tuba_refire))
{
W_Tuba_Attack(0);
- //weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_tuba_animtime"), w_ready);
- weapon_thinkf(WFRAME_IDLE, cvar("g_balance_tuba_animtime"), w_ready);
+ //weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_tuba_animtime, w_ready);
+ weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_tuba_animtime, w_ready);
}
if (self.BUTTON_ATCK2)
- if (weapon_prepareattack(1, cvar("g_balance_tuba_refire")))
+ if (weapon_prepareattack(1, autocvar_g_balance_tuba_refire))
{
W_Tuba_Attack(HITTYPE_SECONDARY);
- //weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_tuba_animtime"), w_ready);
- weapon_thinkf(WFRAME_IDLE, cvar("g_balance_tuba_animtime"), w_ready);
+ //weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_tuba_animtime, w_ready);
+ weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_tuba_animtime, w_ready);
}
if(self.tuba_note)
{
}
else if (req == WR_SUICIDEMESSAGE)
{
- w_deathtypestring = "%s hurt his own ears with the @!#%%'n Tuba";
+ w_deathtypestring = _("%s hurt his own ears with the @!#%%'n Tuba");
}
else if (req == WR_KILLMESSAGE)
{
- w_deathtypestring = "%s died of %s's great playing on the @!#%%'n Tuba";
+ w_deathtypestring = _("%s died of %s's great playing on the @!#%%'n Tuba");
}
return TRUE;
}
#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", "Machine Gun");
+REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", _("Machine Gun"))
#else
#ifdef SVQC
-.entity muzzle_flash;
// leilei's fancy muzzleflash stuff
void Uzi_Flash_Go()
self.muzzle_flash.angles_z = random() * 180;
self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
self.muzzle_flash.owner = self;
-
-
}
-.float uzi_bulletcounter;
void W_Uzi_Attack (float deathtype)
{
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- if (self.uzi_bulletcounter == 1)
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
+ if (self.misc_bulletcounter == 1)
+ self.ammo_nails = self.ammo_nails - autocvar_g_balance_uzi_first_ammo;
else
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
+ self.ammo_nails = self.ammo_nails - autocvar_g_balance_uzi_sustained_ammo;
}
- W_SetupShot (self, cvar("g_antilag_bullets") && cvar("g_balance_uzi_speed") >= cvar("g_antilag_bullets"), 0, "weapons/uzi_fire.wav", cvar("g_balance_uzi_first_damage"));
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
}
// this attack_finished just enforces a cooldown at the end of a burst
- ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
- if (self.uzi_bulletcounter == 1)
- fireBallisticBullet(w_shotorg, w_shotdir, cvar("g_balance_uzi_first_spread"), cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_first_damage"), 0, cvar("g_balance_uzi_first_force"), deathtype, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ if (self.misc_bulletcounter == 1)
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, 0, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
else
- fireBallisticBullet(w_shotorg, w_shotdir, cvar("g_balance_uzi_sustained_spread"), cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_sustained_damage"), 0, cvar("g_balance_uzi_sustained_force"), deathtype, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
// casing code
- if (cvar("g_casings") >= 2)
+ 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);
}
w_ready();
return;
}
- self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
W_Uzi_Attack(WEP_UZI);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_fire1_02);
}
else
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
-};
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
+}
+
+
+void uzi_mode1_fire_auto()
+{
+ float uzi_spread;
+
+ if (self.BUTTON_ATCK)
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
+ else
+ {
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
+ return;
+ }
+
+ if (!weapon_action(self.weapon, WR_CHECKAMMO1))
+ {
+ W_SwitchWeapon_Force(self, w_getbestweapon(self));
+ w_ready();
+ return;
+ }
+
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+ if (!g_norecoil)
+ {
+ self.punchangle_x = random () - 0.5;
+ self.punchangle_y = random () - 0.5;
+ }
+
+ uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
+ fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_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);
+
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.ammo_nails = self.ammo_nails - autocvar_g_balance_uzi_sustained_ammo;
+
+}
+
+void uzi_mode1_fire_burst()
+{
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+ if (!g_norecoil)
+ {
+ self.punchangle_x = random () - 0.5;
+ self.punchangle_y = random () - 0.5;
+ }
+
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_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 + autocvar_g_balance_uzi_burst_refire2 * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_animtime, w_ready);
+ }
+ else
+ {
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_refire, uzi_mode1_fire_burst);
+ }
+
+}
void spawnfunc_weapon_machinegun(); // defined in t_items.qc
}
else if (req == WR_THINK)
{
- if (self.BUTTON_ATCK)
- if (weapon_prepareattack(0, 0))
+ if(autocvar_g_balance_uzi_mode == 1)
{
- self.uzi_bulletcounter = 1;
- W_Uzi_Attack(WEP_UZI); // sets attack_finished
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
+ 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 (!weapon_action(self.weapon, WR_CHECKAMMO2))
+ {
+ W_SwitchWeapon_Force(self, w_getbestweapon(self));
+ w_ready();
+ return FALSE;
+ }
+
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ self.ammo_nails = self.ammo_nails - autocvar_g_balance_uzi_burst_ammo;
+
+ self.misc_bulletcounter = autocvar_g_balance_uzi_burst * -1;
+ uzi_mode1_fire_burst();
+ }
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
- if (weapon_prepareattack(1, 0))
+ else
{
- self.uzi_bulletcounter = 1;
- W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_first_refire"), w_ready);
+
+ 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, autocvar_g_balance_uzi_sustained_refire, uzi_fire1_02);
+ }
+
+ if (self.BUTTON_ATCK2 && autocvar_g_balance_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, autocvar_g_balance_uzi_first_refire, w_ready);
+ }
}
}
else if (req == WR_PRECACHE)
else if (req == WR_SETUP)
weapon_setup(WEP_UZI);
else if (req == WR_CHECKAMMO1)
- return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
+ if(autocvar_g_balance_uzi_mode == 1)
+ return self.ammo_nails >= autocvar_g_balance_uzi_sustained_ammo;
+ else
+ return self.ammo_nails >= autocvar_g_balance_uzi_first_ammo;
else if (req == WR_CHECKAMMO2)
- return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
+ if(autocvar_g_balance_uzi_mode == 1)
+ return self.ammo_nails >= autocvar_g_balance_uzi_burst_ammo;
+ else
+ return self.ammo_nails >= autocvar_g_balance_uzi_first_ammo;
return TRUE;
};
#endif
precache_sound("weapons/ric3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s was sniped by %s";
+ w_deathtypestring = _("%s was sniped by %s");
else
- w_deathtypestring = "%s was riddled full of holes by %s";
+ w_deathtypestring = _("%s was riddled full of holes by %s");
}
return TRUE;
}
e.SendFlags |= 32;
}
+.float waypointsprite_pingtime;
void WaypointSprite_Ping(entity e)
{
+ // anti spam
+ if(time < e.waypointsprite_pingtime)
+ return;
+ e.waypointsprite_pingtime = time + 0.3;
// ALWAYS sends (this causes a radar circle), thus no check
e.cnt |= 0x80;
e.SendFlags |= 32;
float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
void WaypointSprite_Init()
{
- waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
- waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
- waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
+ waypointsprite_limitedrange = autocvar_g_waypointsprite_limitedrange;
+ waypointsprite_deployed_lifetime = autocvar_g_waypointsprite_deployed_lifetime;
+ waypointsprite_deadlifetime = autocvar_g_waypointsprite_deadlifetime;
}
void WaypointSprite_InitClient(entity e)
{
e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
if(e)
{
- WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, cvar("g_balance_armor_blockpercent")) * 2);
- WaypointSprite_UpdateHealth(e, '1 0 0' * healtharmor_maxdamage(carrier.health, carrier.armorvalue, cvar("g_balance_armor_blockpercent")));
+ WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent) * 2);
+ WaypointSprite_UpdateHealth(e, '1 0 0' * healtharmor_maxdamage(carrier.health, carrier.armorvalue, autocvar_g_balance_armor_blockpercent));
}
return e;
}
entity wz;
vector vf, vr, vu;
+ WarpZone_trace_firstzone = world;
+ WarpZone_trace_lastzone = world;
WarpZone_Trace_InitTransform();
if(!warpzone_warpzones_exist)
{
wz = WarpZone_Find(org + mi, org + ma);
if(wz)
{
+ WarpZone_trace_firstzone = wz;
+ WarpZone_trace_lastzone = wz;
if(zone && wz != zone)
{
// we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
}
if(trace_ent == wz)
{
+ // FIXME can this check be removed? Do we really need it?
dprint("I transformed into the same zone again, wtf, aborting the trace\n");
trace_ent = world;
break;
}
wz = trace_ent;
+ if(!WarpZone_trace_firstzone)
+ WarpZone_trace_firstzone = wz;
+ WarpZone_trace_lastzone = wz;
if(zone && wz != zone)
break;
WarpZone_Trace_AddTransform(wz);
o0 = e.origin;
v0 = e.velocity;
+ WarpZone_trace_firstzone = world;
+ WarpZone_trace_lastzone = world;
WarpZone_Trace_InitTransform();
WarpZone_tracetoss_time = 0;
if(!warpzone_warpzones_exist)
wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
if(wz)
{
+ WarpZone_trace_firstzone = wz;
+ WarpZone_trace_lastzone = wz;
if(zone && wz != zone)
{
// we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
break;
if(trace_ent == wz)
{
+ // FIXME can this check be removed? Do we really need it?
dprint("I transformed into the same zone again, wtf, aborting the trace\n");
trace_ent = world;
break;
}
wz = trace_ent;
+ if(!WarpZone_trace_firstzone)
+ WarpZone_trace_firstzone = wz;
+ WarpZone_trace_lastzone = wz;
if(zone && wz != zone)
break;
WarpZone_Trace_AddTransform(wz);
typedef void(vector start, vector hit, vector end) WarpZone_trace_callback_t; // called on every elementary trace
const var WarpZone_trace_callback_t WarpZone_trace_callback_t_null;
entity WarpZone_trace_transform; // transform accumulator during a trace
+entity WarpZone_trace_firstzone; // first warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone, the trace is aborted then)
+entity WarpZone_trace_lastzone; // first warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone, the trace is aborted then)
vector WarpZone_tracetoss_velocity; // ending velocity of a tracetoss (post-transform)
float WarpZone_tracetoss_time; // duration of toss (approximate)
void WarpZone_TraceBox(vector org, vector min, vector max, vector end, float nomonsters, entity forent);
}
int isnan(float x)
{
- return !(x + x == x + x);
+ float y;
+ y = x;
+ return (x != y);
}
int isnormal(float x)
{
self = e;
WarpZones_Reconnect();
}
+
+ entity oldself, oldother;
+ oldself = self;
+ oldother = other;
for(e = world; (e = nextent(e)); )
+ {
WarpZone_StoreProjectileData(e);
+ float f;
+ f = clienttype(e);
+ if(f == CLIENTTYPE_REAL)
+ {
+ if(e.solid != SOLID_NOT) // not spectating?
+ continue;
+ if(e.movetype != MOVETYPE_NOCLIP && e.movetype != MOVETYPE_FLY) // not spectating? (this is to catch observers)
+ continue;
+ self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
+ if(!self)
+ continue;
+ other = e;
+ if(WarpZoneLib_ExactTrigger_Touch())
+ continue;
+ WarpZone_Teleport(e); // NOT triggering targets by this!
+ }
+ if(f == CLIENTTYPE_NOTACLIENT)
+ {
+ for(; (e = nextent(e)); )
+ WarpZone_StoreProjectileData(e);
+ break;
+ }
+ }
+ self = oldself;
+ other = oldother;
}
.float warpzone_reconnecting;
exec default.cfg
exec config.cfg
+maxplayers $menu_maxplayers
exec data/campaign.cfg
exec config_update.cfg
+exec font-xolonium.cfg
exec autoexec.cfg
-exec font-nimbussansl.cfg
stuffcmds
//startdemos demos/demo1 demos/demo2 demos/demo3
//startdemos
//play announcer/male/welcome.ogg
-crypto_keygen 0 http://rm.endoftheinternet.org/~xonotic/keygen/?ca=0&key=
+crypto_keygen 0 http://ca.xonotic.org/?ca=0&key=
--- /dev/null
+models/ctf/glow_red
+{
+ {
+ map models/ctf/glow_red.tga
+ tcMod scale 0.03 0.03
+ tcMod scroll 0.1 -0.04
+ tcMod rotate 0.1
+ }
+}
+models/ctf/glow_blue
+{
+ {
+ map models/ctf/glow_blue.tga
+ tcMod scale 0.03 0.03
+ tcMod scroll 0.1 -0.04
+ tcMod rotate 0.1
+ }
+}
\ No newline at end of file
--- /dev/null
+models/ice/ice
+{
+ dpnoshadow
+ dpreflectcube cubemaps/default/sky
+ {
+ map models/ice/ice.tga
+ blendfunc add
+ rgbgen vertex
+ }
+}
--- /dev/null
+models/orbs/orbblue
+{
+ deformVertexes autosprite
+ dpnoshadow
+
+ {
+ map models/orbs/orbblue.tga
+ blendfunc add
+ tcmod page 4 4 0.05
+ rgbgen vertex
+ }
+}
+models/orbs/orbred
+{
+ deformVertexes autosprite
+ dpnoshadow
+
+ {
+ map models/orbs/orbred.tga
+ blendfunc add
+ tcmod page 4 4 0.05
+ rgbgen vertex
+ }
+}
+models/orbs/orbyellow
+{
+ deformVertexes autosprite
+ dpnoshadow
+
+ {
+ map models/orbs/orbyellow.tga
+ blendfunc add
+ tcmod page 4 4 0.05
+ rgbgen vertex
+ }
+}
+models/orbs/orbpink
+{
+ deformVertexes autosprite
+ dpnoshadow
+
+ {
+ map models/orbs/orbpink.tga
+ blendfunc add
+ tcmod page 4 4 0.05
+ rgbgen vertex
+ }
+}
\ No newline at end of file
--- /dev/null
+crylink_projectile_core
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite
+ {
+ map textures/projectiles/crylink_projectile_core.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
+crylink_projectile_long
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite2
+ {
+ map textures/projectiles/crylink_projectile_long.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
+hlac_projectile_core
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite
+ {
+ map textures/projectiles/hlac_projectile_core.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
+hlac_projectile_long
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite2
+ {
+ map textures/projectiles/hlac_projectile_long.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
+electro_projectile_core
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite
+ {
+ map textures/projectiles/electro_projectile_core.tga
+ blendfunc add
+ tcmod page 4 1 0.1
+ rgbGen lightingDiffuse
+ }
+}
+electro_projectile_long
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite2
+ {
+ map textures/projectiles/electro_projectile_long.tga
+ blendfunc add
+ tcmod page 4 1 0.1
+ rgbGen lightingDiffuse
+ }
+}
+laser_projectile_core
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite
+ {
+ map textures/projectiles/laser_projectile_core.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
+laser_projectile_long
+{
+ surfaceparm nonsolid
+ surfaceparm nolightmap
+ deformVertexes autosprite2
+ {
+ map textures/projectiles/laser_projectile_long.tga
+ blendfunc add
+ rgbGen lightingDiffuse
+ }
+}
\ No newline at end of file
rgbgen lightingDiffuse
}
}
+minelayer
+{
+ dpreflectcube cubemaps/default/sky
+ {
+ map textures/minelayer.tga
+ rgbgen lightingDiffuse
+ }
+}
fraglimit_override 0
timelimit_override 3
sv_eventlog 1
-g_nix 1
-g_nix_with_laser 1
-g_balance_nix_roundtime 3
-map downer
+g_weaponarena all
+g_weaponarena_random 2
+map g-23
-// time darkplaces/xonotic-dedicated +exec serverbench.cfg | grep ^: > serverbench.log
+// time ./all run +exec serverbench.cfg | grep ^: > serverbench.log
// on Linux/Ubuntu, this should always yield a file with the md5sum
\sv_gravity\Make things fall to the ground slower, lower value means lower gravity
\g_grappling_hook\Players spawn with the grappling hook
\g_jetpack\Players spawn with the jetpack
-\g_laserguided_missile\Rockets can be steered using a laser pointer
\g_pinata\Players will drop all weapons they possessed when they are killed
\g_weapon_stay\Weapons stay after they are picked up
\g_weaponarena\Selecting a weapon arena will give all players that weapon at spawn as well as unlimited ammo, and disable all other weapon pickups.
--- /dev/null
+0
+\XonoticSingleplayerDialog\Spiele die Einzelspieler-Kampagne oder habe Instant-Action Spiele gegen Bots
+
+
+\XonoticMultiplayerDialog\Spiele online, gegen deine Freunde im LAN, gucke dir Demos an oder ändere deine Spieler-Einstellungen
+\XonoticMultiplayerDialog/Server\Finde Server um auf ihnen zu spielen
+\menu_slist_showempty\Zeige leere Server
+\menu_slist_showfull\Zeige volle Server, die keinen freien Platz mehr haben
+\net_slist_pause\Unterbreche die automatische Aktualisierung der Serverliste um ein "Herumspringen" zu verhindern
+\XonoticMultiplayerDialog/Info\Zeige mehr Informationen über den markierten Server
+\XonoticMultiplayerDialog/Bookmark\Setze ein Lesezeichen für den markierten Server um ihn beim nächsten mal schneller wiederzufinden
+\XonoticMultiplayerDialog/Havoc\Wechsel in den Havoc Modus, welcher zu Änderungen des Spielverhaltens führt
+\XonoticMultiplayerDialog/Starten\Hoste dein eigenes Spiel
+\XonoticMultiplayerDialog/Demos\Gucke dir Demos an
+\XonoticMultiplayerDialog/Spieler-Einstellungen\Ändere deine Spieler-Einstellungen
+
+\XonoticTeamSelectDialog/'bestem' Team beitreten\Automatische Auswahl des Teams (bevorzugt)
+\XonoticTeamSelectDialog/rot\Trete dem roten Team bei
+\XonoticTeamSelectDialog/blau\Trete dem blauen Team bei
+\XonoticTeamSelectDialog/gelb\Trete dem gelben Team bei
+\XonoticTeamSelectDialog/pink\Trete dem pinken Team bei
+
+\timelimit_override\Beim Erreichen dieses Zeitlimits in Minuten endet das Spiel
+\fraglimit_override\Die Anzahl an Frags die benötigt wird, bevor das Spiel endet
+\menu_maxplayers\Die maximale Anzahl der Spieler oder Bots, welche sich mit dem Server gleichzeitig verbinden können
+\bot_number\Anzahl von Bots auf dem Server
+\skill\Gib an, wie erfahren die Bots sein sollen
+\g_maplist_votable\Anzahl von Maps, welche am Ende des Spiels zur Wahl stehen
+\sv_vote_simple_majority_factor\Einfache Mehrheit gewinnt die Abstimmung
+\XonoticMultiplayerDialog/Erweiterte Einstellungen...\Erweiterte Einstellungen für den Server
+\XonoticMultiplayerDialog/Mutators...\Mutators und Waffen-Arenen
+\g_cloaked\Alle Spieler sind fast unsichtbar
+\g_footsteps\Aktiviere den Schrittklang
+\g_midair\Dem Gegner Schaden zuzufügen ist nur möglich, wenn er sich in der Luft befindet
+\g_vampire\Der Schaden dem du anderen Spielern zufügst, wird deiner Lebensenergie hinzugefügt
+\g_bloodloss\Höhe der Lebensenergie, bei der dein Spieler auf Grund von Blutverlust betäubt wirkt
+\sv_gravity\Lass Gegenstände langsamer zu Boden fallen, ein niedrigerer Wert verringert die Gravitation
+\g_grappling_hook\Neu erzeugte/auferstandene Spieler starten mit dem Enterhaken
+\g_jetpack\Neu erzeugte/auferstandene Spieler starten mit dem Jetpack
+\g_pinata\Spieler lassen alle Waffen fallen, die sie besaßen, wenn sie sterben
+\g_weapon_stay\Waffen bleiben liegen, auch wenn sie aufgenommen wurden
+\g_weaponarena\Auswahl einer Waffen-Arena führt dazu, dass jeder Spieler mit der gewählten Waffe startet. Diese hat unendlich viel Munition und andere Waffen sind nicht vorhanden..
+\menu_weaponarena_with_laser\Aktiviere auch Laser in der Waffen-Arena
+\g_minstagib\Alle Spieler starten mit der Minstanex, eine elektromagnetische Schienenkanone mit unendlich viel Schaden. Wenn ein Spieler keine Munition mehr hat, bleiben ihm 10 Sekunden welche zu finden, ansonsten stirbt er. Der 2. Feuermodus ist Laser, welcher keinen Schaden hinzufügen kann. Dieser eignet sich gut für Tricksprünge.
+\g_nixnex\keine Gegenstände in Xonotic - Anstelle der Möglichkeit Waffen aufzusammeln, spielen alle mit der gleichen Waffe. Nach einiger Zeit startet ein Countdown, danach wechseln alle zu einer neuen gleichen Waffe.
+\g_nixnex_with_laser\In NixNex ist immer als zweite Waffe der Laser vorhanden
+\XonoticMultiplayerDialog/All\Wähle alle Maps
+\XonoticMultiplayerDialog/None\Wähle alle Maps ab
+
+
+\XonoticMultiplayerDialog/Timedemo\Teste wie schnell dein Computer die markierte Demo abspielen kann - Es wird ein Benchmark-Test ausgeführt, dessen Ergebniss in "gamedir/data/" gespeichert wird.
+
+\fov\Sichtfeld in Grad mit einem Wert zwischen 60 und 130, Standard ist 90
+\cl_bobcycle\Setze den Wert für das "Sicht-Wackeln". Deaktivieren für kein "Sicht-Wackeln"
+\cl_zoomfactor\Setze den Vergrößerungsfaktor
+\cl_zoomsensitivity\Bestimme die Änderung der Empfindlichkeit während des Vergrößerns, Werte von 0 (geringste Sensiviät) bis 1 (keine Änderung der Sensivität sind möglich)
+\cl_zoomspeed\Bestimme wie schnell der angegebene Vergrößerungsfaktor erreicht werden soll, deaktivieren für sofortige Vergrößerung
+\XonoticMultiplayerDialog/Waffeneinstellungen...\Lege deine bevorzugten Waffen fest, sowie den automatischen Wechsel der Waffenmodelle und Weiteres
+
+\cl_weaponpriority_useforcycling\Benutze die oben angegebene Liste, wenn die Waffen mit Hilfe des Mausrads gewechselt werden
+\cl_autoswitch\Wechsel automatisch zu der neu aufgesammelten Waffe, wenn diese besser ist als die, welche Du zur Zeit trägst
+\r_drawviewmodel\Darstellung der Waffe im Spiel
+\cl_gunalign\Position der Waffe, links oder rechts; erfordert Neustart
+
+\crosshair_per_weapon\Ermögliche unterschiedliche Fadenkreuze für unterschiedliche Waffen, zu empfehlen, wenn du ohne dargstelltes Waffenmodel spielst
+\crosshair_color_override\Ermögliche unterschiedliche Farben für unterschiedliche Fandenkreuze, abhängig von der Waffe die gerade getragen wird
+\crosshair_size\Lege die Größe des Fadenkreuzes fest
+\crosshair_color_alpha\Lege die Opazität des Fadenkreuzes fest
+\crosshair_color_red\Roter Farbanteil des Fadenkreuzes
+\crosshair_color_green\grüner Farbanteil des Fadenkreuzes
+\crosshair_color_blue\blauer Farbanteil des Fadenkreuzes
+\sbar_hudselector\Benutze das alte HUD Layout
+\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Stelle Radar, HUD & Wegpunkte ein
+\_cl_name\Lege deinen Namen im Spiel fest
+
+\XonoticSettingsDialog\Ändere die Spiel-Einstellungen
+\XonoticCreditsDialog\Die Xonotic Credits
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Beende das Spiel
+\XonoticQuitDialog/Ja\Zurück an die Arbeit...
+\XonoticQuitDialog/Nein\Ich muss noch ein paar Typen fraggen!
+
+\XonoticSettingsDialog/Eingabe\Einstellungen der Eingabe
+\sensitivity\Maus Geschwindigkeitsmultiplikator
+\menu_mouse_speed\Maus Geschwindigkeitsmultiplikator im Menü, hat keinen Effekt auf die Mausbewegung im Spiel
+\m_filter\Glättet die Mausbewegung, aber verringert die Reaktion des Zielens etwas
+\m_pitch\Umkehren der Mausbewegung entlang der Y-Achse
+\vid_dgamouse\Verwende die DGA Maus Eingabe
+\con_closeontoggleconsole\Schließen der Konsole auch mit der Taste, die zum Öffnen verwendet wird
+\sbar_showbinds\Display actions / bound keys in the strings shown during the game
+\cl_showpressedkeys\Lass dir die gedrückten Tasten anderer Spieler anzeigen
+
+\XonoticSettingsDialog/Video\Video Einstellungen
+\vid_width\Einstellung der zu verwendenden Bildschirmauflösung
+\vid_bitsperpixel\Bestimme wie viele Bits pro Pixel (BPP) gerendert werden sollen, 32 ist der bevorzugte Wert
+\vid_fullscreen\Aktiviere den Vollbildmodus (Standard: aktiviert)
+\vid_vsync\Aktiviere die vertikale Synchronization um ein Zeilenreißen zu unterdrücken, die FPS werden auf den Wert der Bildwiederholungsrate deines Monitors gesetzt (Standard: deaktiviert)
+\r_glsl\Aktiviere OpenGL 2.0 Enable OpenGL 2.0 Pixel-Shader für Lichteffekte (Standard: aktiviert)
+\gl_vbo\Speicher Eckpunkte und einige Dreiecke der statischen Geometrie im Videospeicher um ein schnelleres Rendern zu ermöglichen (Standard: aktiviert)
+\r_depthfirst\erhindere das Überblenden indem nur die das Tiefenbild der Szene vor dem Licht gerendert wird (Standard: deaktiviert)
+\gl_texturecompression\Komprimiere die Texturen für Grafikkarten mit einem geringen Grafikspeicher (Standard: deaktiviert)
+\gl_finish\Die Grafikkarte wartet bis die CPU die Berechnung eines jeden Frames beendet hat, dies kann bei merkwürdigen Verhalten der Eingabe helfen (Standard: deaktiviert)
+\v_brightness\Helligkeit von Schwarz (Standard: 0)
+\v_contrast\Helligkeit von Weiß (Standard: 1)
+\v_gamma\Korrekturwert für die Kontraststärke (Gamma-Wert), Helligkeitseffekt, der keinen Einfluss auf Weiß und Schwarz hat (Standard: 1.125)
+\v_contrastboost\Faktor für die Änderung des Kontrasts in dunklen Bildteilen (Standard: 1)
+\r_glsl_saturation\Sättigungskorrektur (0 = Graustufenbild, 1 = normales Bild, 2 = übersättigtes Bild), benötigt GLSL Farbkontrolle (Standard: 1)
+\v_glslgamma\Aktiviere die Verwendung von GLSL um die Gamma-Korrektur zu ermöglichen, kann die Leistung stark verringern (Standard: Deaktiviert)
+\r_ambient\Ambientebeleuchtung, ein zu hoch eingestellter Wert lässt das Map matt und flach erscheinenht (Standard: 4)
+\r_hdr_scenebrightness\Globales Rendern der Helligkeit (Standard: 1)
+\vid_samples\Aktiviere Antialiasing um Ecken der 3D-Geometire zu glätten. Kann die Leistung stark verringern (Standard: deaktiviert)
+\v_flipped\Linkshänder Modus für arme Leute (Standard: deaktiviert)
+
+\XonoticSettingsDialog/Effekte\Einstellungen der Effekte
+\r_subdivisions_tolerance\Ändere die Rundheit/Glattheit von Kurven in der Map (Standard: Normal)
+\gl_picmip\Ändere die Schärfe von Texturen. Ein geringerer Wert verringert die Auslastung des Speichers, aber lässt die Texturen verschwommen aussehen. (Standard: Gut)
+\r_picmipworld\Wenn aktiviert, wird nur die Texturqualität von Modellen verringert (Standard: aktiviert)
+\mod_q3bsp_nolightmaps\Verwende hochauflösende Lightmaps, welche sehr schön aussehen, aber etwas mehr Videospeicher benötigen (Standard: aktiviert)
+\cl_particles_quality\Faktor für die Anzahl von Partikel. Weniger beudetet weniger Parikel, was zu einer besseren Performance führt (Standard: 0.5)
+\r_drawparticles_drawdistance\Weiter entfernte Partikel werden nicht dargestellt (Standard 1000)
+\cl_decals\Aktiviere Dekore (Einschusslöcher und Blut) (Standard: aktiviert)
+\r_drawdecals_drawdistance\Weiter entfernte Dekore werden nicht dargestellt (Standard: 300)
+\cl_decals_time\Zeit in Sekunden nach dem Dekore verschwinden (Standard: 2)
+\cl_gentle\Blut und Fleischteile werden durch andere, nicht blutige, Effekte ersetzt (Standard: deaktiviert)
+\cl_nogibs\Verringere die Anzahl von Fleischteilen oder entferne sie vollständig (Standard: viele)
+\v_kicktime\Wert für die Dauer der Beeinträchtigung der Sicht durch einen Schaden (Standard: 0)
+\gl_texture_anisotropy\Qualität für das Filtern von Anisotropie (Standard: 1x)
+\r_glsl_deluxemapping\Verwende ein-Pixel Lichteffekte (default: enabled)
+\r_shadow_gloss\Aktiviere Glanzeffekte für Texturen, wenn die Textur es unterstützt (glossmap) (Standard: aktiviert)
+\gl_flashblend\Enable faster but uglier dynamic lights by rendering bright coronas instead of real dynamic lights (default: disabled)
+\r_shadow_realtime_dlight\Aktiviere das Rendern von dynamischen Lichtern, wie Explosionen und Raketen-Lichter (Standard: aktiviert)
+\r_shadow_realtime_dlight_shadows\Aktiviere das Rendern von Schatten von dynamischen Lichtern (Standard: deaktiviert)
+\r_shadow_realtime_world\Aktiviere das Rendern der gesamten Echtzeit-Welt-Lichter. Hat einen großen Einfluss auf die Performance (Standard: deaktiviert)
+\r_shadow_realtime_world_shadows\Aktiviere das Rendern von Schatten von Echtzeit-Welt-Lichter (Standard: deaktiviert)
+\r_shadow_usenormalmap\Aktiviere die Verwendung von gerichteter Schattierung auf Texturen (Standard: aktiviert)
+\r_showsurfaces\Komplettes Deaktivieren von Texturen für sehr langsame Hardware. Starke Verbesserung der Performace, sieht aber sehr komisch aus. (Standard: deaktiviert)
+\r_glsl_offsetmapping\Effekt für den Tiefendruck von Texturen, dieser Effekt lässt Texturen mit Bumpmap aus der 2D Ebene "herausgedrückt" erscheinen (Deaktiviert: deaktiviert)
+\r_glsl_offsetmapping_reliefmapping\Higher quality offset mapping, which also has a huge impact on performance (default: disabled)
+\r_water\Reflektions- und Refraktionsqualität, hat einen großen Einfluss auf die Performance von Maps mit reflektierenden Oberflächen (Standard: deaktiviert)
+\r_water_resolutionmultiplier\Auflösung von Reflektion und Refraktion (Standard: gut)
+\r_coronas\Aktiviere die Korona um bestimmte Lichter (Standard: aktiviert)
+\r_coronas_occlusionquery\Verringern der Korona, der Sichtbarkeit entsprechend (Standard: deaktiviert)
+\r_bloom\Aktiviere Bloom-Effekt, der die umgebenden Pixel sehr hell erleuchteter Pixel erhellt. Dieser Effekt hat einen großen Einfluss auf die Leistung (Standard: deaktiviert)
+\r_hdr\Höhere Qualität des Bloom-Effekts, hat einen sehr gr0ßen Einfluss auf die Leistung (Standard: deaktiviert)
+\r_motionblur\Stäre der Bewegungsunschärfe - 0.5 empfohlen
+\r_damageblur\Wert für die Bewegungsunschärfe bei einer Verletzung - 0.4 empfohlen
+
+\XonoticSettingsDialog/Audio\Audio-Einstellungen
+\bgmvolume\-
+\volume\-
+\snd_staticvolume\-
+\snd_worldchannel0volume\-
+\snd_entchannel3volume\-
+\snd_playerchannel6volume\-
+\snd_playerchannel7volume\-
+\snd_entchannel4volume\-
+\snd_playerchannel2volume\-
+\snd_playerchannel1volume\-
+\snd_speed\Ausgangsfrequenz des Tons
+\snd_channels\Anzahl der Kanäle für die Audiowiedergabe
+\snd_swapstereo\Linken und rechten Kanal tauschen
+\snd_spatialization_control\Aktiviere "räumlicheren" Klang (Mischung des linken und rechten Kanals um die Stereo-Trennung leicht zu verringern, für Kopfhörer)
+\cl_voice_directional\Aktiviere richtungsunabhängige Geräusche
+\cl_voice_directional_taunt_attenuation\Distanz in der "Bemerkungen" anderer Spieler gehört werden können
+\cl_autotaunt\Automatisches "Bemerkung", wenn Gegner gefraggt wurden
+\cl_sound_maptime_warning\Ansgage-Sound für die verbleibenden Minuten des Spiels
+\cl_hitsound\Spiele einen Treffer-Sound, wenn der Spieler auf den gezielt wurde, getroffen wurde
+\menu_sounds\Sound abspielen, wenn auf ein Menüitem geklickt wird oder mit dem Mauszeiger auf das Menüitem gezeit wird
+
+\XonoticSettingsDialog/Netzwerk\Netzwerk Einstellungen
+\cl_movement\Aktiviere die Client-seitige Bewegungssimulation
+\cl_nolerp\Enable network update smoothing
+\shownetgraph\Anzeige eines Netzwerkgraphens für gesendete/empfangene Pakete und weitere Informationen
+\_cl_rate\Gib die Netzwerkgeschwindigkeit mit dem deine Netzwerkgeschwindigkeit mit dem Schieberegler an
+\cl_netfps\Anzahl der Pakete die pro Sekunde zum Server, mit dem man verbunden ist, geschickt werden sollen
+\cl_curl_maxdownloads\Maximale Anzahl der gleichzeitigen HTTP/FTP Downloads
+\cl_curl_maxspeed\Maximale Download Geschwindigkeit
+\cl_port\Stelle den zu verwendenden UDP Port als Client ein, wenn der Port auf 0 gesetzt ist, wird kein bestimmter Port erzwungen
+
+\XonoticSettingsDialog/Sonstiges\Sonstige Einstellungen, wie Sprache, Menü-Skins
+\showtime\Uhrzeit im Spiel anzeigen, geeignet für Screenshots
+\showdate\Datum im Spiel anzeigen, geeignet für Screenshots
+\showfps\Zeige die gerenderten Frames pro Sekunde
+\cl_showspeed\Zeige die Gescheindigkeit des Spielers
+\cl_showspeed_unit\Wähle die Einheit, in der die Geschindigkeit angezeigt werden soll, qu/s = in/s
+\cl_showacceleration\Zeige die Beschleunigung des Spielers
+\cl_showacceleration_scale\Skalierungsfaktor für das Akzelerometer
+
+\XonoticSettingsDialog/Erweiterte Einstellungen...\Erweiterte Einstellungen, in denen du jede beliebige Variable des Spiels ändern kannst
+\g_friendlyfire\Prozentualer Anteil des Schadens, der Mitspielern hinzugefügt wird
+\g_mirrordamage\Percentage of teamdamage that will be mirrored to you
+\g_tdm_teams_override\Überschreibe die Standardgröße eines Teams in Teammodi
+
+\cl_teamradar_position\-
+\cl_teamradar_size\-
+\cl_teamradar_zoommode\-
+\cl_teamradar_rotation\-
+\cl_teamradar_scale\-
+\cl_teamradar_foreground_alpha\-
+\cl_teamradar_background_alpha\Wert für die Opazität des Radar-Hintergrunds
+\viewsize\Aktiviere/Deaktiviere den HUD-Hintergrund
+\sbar_alpha_bg\Wert für die Opazität des HUD-Hintergrunds
+\sbar_color_bg_r\Roter Farbanteil des HUD-Hintergrunds
+\sbar_color_bg_g\Grüner Farbanteil des HUD-Hintergrunds
+\sbar_color_bg_b\Blauer Farbanteil des HUD-Hintergrunds
+\sbar_color_bg_team\Team-Farben Sättigung des HUD-Hintergrunds
+\cl_hidewaypoints\Lass dir verschiedene Spieltyp spezifische Wegpunkte anzeigen
+\g_waypointsprite_scale\Skalierungsfaktor für Wegpunkte
+\g_waypointsprite_alpha\Verändere den Wert der Transparenz von der Anzeige der Wegpunkte
+\cl_shownames\Lass dir den Namen des Spielers anzeigen auf den du gerade zielst.
+
+\crosshair_hittest\None: do not do hit tests for the crosshair; TrueAim: blur the crosshair when you would not hit the wall; Enemies: also enlarge the crosshair when you would hit an enemy
--- /dev/null
+0
+\XonoticSingleplayerDialog\Jouer en mode un joueur contre des adversaires contrôlés par l'ordinateur
+
+
+\XonoticMultiplayerDialog\Jouer en ligne avec des amis en réseau local ou sur Internet
+\XonoticMultiplayerDialog/Servers\Trouver des serveurs pour y jouer dessus
+\menu_slist_showempty\Montrer les serveurs vides
+\menu_slist_showfull\Montrer les serveurs où toutes les places sont prises
+\net_slist_pause\Ne met pas à jour la liste de serveurs pour éviter de "glisser" sur un autre serveur
+\XonoticMultiplayerDialog/Info\Montrer plus d'information sur le serveur séléctionné
+\XonoticMultiplayerDialog/Bookmark\Mettre le serveur en haut de la liste pour pouvoir le repérer plus facilement plus tard
+\XonoticMultiplayerDialog/Havoc\Changer au mode Havoc qui comporte des modifications sur le jeu
+\XonoticMultiplayerDialog/Create\Héberger votre propre partie
+\XonoticMultiplayerDialog/Demos\Regarder des Vidéos pré-enregistrées
+\XonoticMultiplayerDialog/Player Setup\Personaliser vos paramètres
+
+\XonoticTeamSelectDialog/join 'best' team (auto-select)\Auto-séléction de l'équipe qui a le plus besoin de vous (recommandé)
+\XonoticTeamSelectDialog/red\Joindre l'équipe rouge
+\XonoticTeamSelectDialog/blue\Joindre l'équipe bleue
+\XonoticTeamSelectDialog/yellow\Joindre l'équipe jaune
+\XonoticTeamSelectDialog/pink\Joindre l'équipe rose
+
+\timelimit_override\Limite de temps au match, le match se finit quand elle est atteinte
+\fraglimit_override\Limite de tués pour le match, le match se finit quand elle est atteinte
+\menu_maxplayers\Le nombre maximum de personnes pouvant jouer sur votre serveur en même temps
+\bot_number\Nombre d'adversaires ordinateur
+\skill\Spécifier la difficulté des adversaires ordinateur
+\g_maplist_votable\Le nombre de cartes pouvant être votées à la fin du match
+\sv_vote_simple_majority_factor\À partir de 51% de oui seulement, un vote est gagné
+\XonoticMultiplayerDialog/Advanced settings...\Paramètres du serveur avancés
+\XonoticMultiplayerDialog/Mutators...\Spéciales et arènes d'une seule arme
+\g_cloaked\Tous les joueurs sont presque invisibles
+\g_footsteps\Activer les bruitages de pas
+\g_midair\Il faut que votre adversaire soit en l'air pour lui faire mal
+\g_vampire\Les dégâts faits à vos enemies vous font gagner de la santé
+\g_bloodloss\Si vous avez moins de santé que spécifié ici, vous perdrez du sang et mourez progressivement
+\sv_gravity\Vous tombez plus lentement, comme sur la lune
+\g_grappling_hook\Tous les joueurs ont un grappin
+\g_jetpack\Tous les joueurs ont un jetpack
+\g_pinata\Tous les joueurs lâchent toutes leurs armes quand ils meurent
+\g_weapon_stay\Les armes restent où elles sont quand elles sont prises sur la carte
+\g_weaponarena\Séléctionner une arène d'une seule arme donne des munitions illimitées pour cette arme, et désactive toutes les autres armes
+\menu_weaponarena_with_laser\Also enable the laser in the weapon arena
+\g_minstagib\Tous les joueurs reçoivent un MinstaNex, qui est un sniper hyperpuissant qui tue d'un coup. Si vous n'avez plus de munitions, vous mourez progressivement.
+\g_nixnex\No Items Xonotic; tous les joueurs ont la même arme en même temps, et on change d'arme régulièrement
+\g_nixnex_with_laser\Porter le laser avec l'arme du No Items Xonotic
+\XonoticMultiplayerDialog/All\Séléctionner toutes les cartes
+\XonoticMultiplayerDialog/None\Déséléctionner toutes les cartes
+
+
+\XonoticMultiplayerDialog/Timedemo\Faire un test de performance en utilisant la vidéo choisie
+
+\fov\Champ de vision en degrés, par défaut 90, certains joueurs préfèrent entre 110 et 130
+\cl_bobcycle\Effet de "tremblement" de la caméra en courant
+\cl_zoomfactor\Facteur de Zoom
+\cl_zoomsensitivity\Changer la sensitivité du Zoom: 0 est la plus basse, 1 ne comporte pas de changement par rapport au mode dézoomé
+\cl_zoomspeed\Facteur "d'adoucissement" du Zoom, 0 désactive complètement
+\XonoticMultiplayerDialog/Weapon settings...\Paramétrer les armes (affichage, priorité)
+
+\cl_weaponpriority_useforcycling\Utiliser la liste de priorité pour le changement d'armes à la molette
+\cl_autoswitch\Automatiquement changer d'arme si vous avez une meilleure arme que celle que vous portez
+\r_drawviewmodel\Afficher l'arme à la permière personne
+\cl_gunalign\Position de l'arme à l'écran, reconnection au serveur nécessaire pour prendre effet
+
+\crosshair_per_weapon\Set a different crosshair for each weapon, good if you play without weapon models
+\crosshair_color_override\Also set the color of the crosshair depending on the weapon you are currently holding
+\crosshair_size\Ajuster la taille du viseur
+\crosshair_color_alpha\Ajuster l'opacité du viseur
+\crosshair_color_red\Couleur: intensité du rouge dans le viseur
+\crosshair_color_green\Couleur: intensité du vert dans le viseur
+\crosshair_color_blue\Couleur: intensité du bleu dans le viseur
+\sbar_hudselector\Utiliser l'ancienne interface HUD
+\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Ajuster les paramètres de l'interface, de la mini-carte et des Waypoints
+\_cl_name\Pseudonyme utilisé pour vous reconnaître dans le jeu
+
+\XonoticSettingsDialog\Changer les paramètres du jeu
+\XonoticCreditsDialog\Les Crédits de Xonotic
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Quitter Xonotic
+\XonoticQuitDialog/Yes\Retour au boulot...
+\XonoticQuitDialog/No\'Faut que je fragge plus de monde!
+
+\XonoticSettingsDialog/Input\Paramètres contrôle souris/clavier
+\sensitivity\Sensitivité de la souris
+\menu_mouse_speed\Sensitivité de la souris dans les menus, n'affecte pas le jeu
+\m_filter\Adoucit le mouvement de souris, mais crée une légère latence de souris
+\m_pitch\Inverser la souris sur l'axe vertical (mode jeu d'avion)
+\vid_dgamouse\Utiliser une souris DGA
+\con_closeontoggleconsole\Autoriser la fermeture de console avec la touche d'ouverture de console (sinon, Shift+Échap)
+\sbar_showbinds\Afficher les actions possibles avec des touches/commandes
+\cl_showpressedkeys\Afficher les touches qu'un joueur est en train d'appuyer
+
+\XonoticSettingsDialog/Video\Video settings
+\vid_width\Résolution de l'écran
+\vid_bitsperpixel\Profondeur des couleurs: 16 bits est plus rapide, mais 32 bits est de meilleure qualité (recommandé)
+\vid_fullscreen\Activer le mode plein écran (par défaut: activé)
+\vid_vsync\Activer la syncronisation verticale pour éviter des problèmes d'affichage, limite le nombre maximum d'images par seconde (par défaut: désactivé)
+\r_glsl\Activer les Shaders OpenGL 2.0 pour des effets de lumière améliorés
+\gl_vbo\Utiliser les VBOs pour stocker les modèles 3D statiques dans la mémoire pour une meilleure performance (par défaut: Points et Triangles)
+\r_depthfirst\Éviter des problèmes de profondeur de rendu en faisant un rendu de profondeur de la carte/joueurs avant le rendu "standard" (par défaut: désactivé)
+\gl_texturecompression\Compresser les textures pour économiser de la mémoire graphique (par défaut: aucun)
+\gl_finish\Faire attendre le processeur que le rendu graphique se finisse pour éviter des problèmes d'affichage divers (par défaut: désactivé)
+\v_brightness\Luminosité du noir (par défaut: 0)
+\v_contrast\Luminosité du blanc (par défaut: 1)
+\v_gamma\Correction du gamma ne changeant pas la luminosité du noir ou du blanc (par défaut: 1.125)
+\v_contrastboost\Multiplier le constraste dans des salles sombres (par défaut: 1)
+\r_glsl_saturation\Ajustement de la saturation (0 = noir et blanc, 1 = normal, 2 = saturé) des couleurs (par défaut: 1)
+\v_glslgamma\Utiliser GLSL pour corriger le gamma, attention, cela risque d'augementer fortement l'utilisation de ressources (par défaut: désactivé)
+\r_ambient\Lumière ambiente, si elle est trop élévée, les cartes auront un éclairage plus "plat" et moins contrasté
+\r_hdr_scenebrightness\Éclairage du rendu global (par défaut: 1)
+\vid_samples\Activer l'anticrénelage, réduit l'effet d'escalier sur les modèles 3D, mais augmente fortement l'utilisation des ressources
+\v_flipped\Mode mirroir (par défaut: désactivé)
+
+\XonoticSettingsDialog/Effects\Paramètres des effets graphiques
+\r_subdivisions_tolerance\Ajuster la qualité des modèles 3D de carte (courbes, tuyaux) (par défaut: normal)
+\gl_picmip\Ajuster la qualité des textures. La baisser diminue l'utilisation des ressources, mais rend les textures floues. (par défaut: normal)
+\r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
+\mod_q3bsp_nolightmaps\Utiliser des lightmaps haute résolution, augmente l'utilisation des resources, mais rend les lightmaps plus nettes (par défaut: activé)
+\cl_particles_quality\Nombre de particules; moins de particules consomment moins de ressources (par défaut: 0.5)
+\r_drawparticles_drawdistance\Toutes les particules qui sont plus loin que cette distance ne seront pas affichées (par défaut: 1000)
+\cl_decals\Activer les marques d'impacts et de sang (par défaut: activé)
+\r_drawdecals_drawdistance\Toutes les marques d'impacts qui sont plus loin que cette distance ne seront pas affichées (par défaut: 300)
+\cl_decals_time\Temps en secondes avant que les marques d'impacts disparaissent (par défaut: 2 secondes)
+\cl_gentle\Remplacer les effets gore par des effets moins violents (par défaut: désactivé)
+\cl_nogibs\Réduire le nombre de Gibs ou les désactiver totalement (par défaut: beaucoup)
+\v_kicktime\Faire trembler la vue en recevant des dégâts (par défaut: 0)
+\gl_texture_anisotropy\Qualité du filtrage anistrope (par défaut: 1x)
+\r_glsl_deluxemapping\Utiliser les effets lumineux avancés (par défaut: activé)
+\r_shadow_gloss\Utiliser le reflet des textures (par défaut: activé)
+\gl_flashblend\Enable faster but uglier dynamic lights by rendering bright coronas instead of real dynamic lights (default: disabled)
+\r_shadow_realtime_dlight\Activer le rendu des lumières dynamiques en temps réel (par défaut: activé)
+\r_shadow_realtime_dlight_shadows\Activer le rendu des ombres depuis les lumières dynamiques en temps réel (par défaut: désactivé)
+\r_shadow_realtime_world\Activer le rendu des lumières carte en temps réel, a un gros impact sur la performance (par défaut: désactivé)
+\r_shadow_realtime_world_shadows\Activer le rendu des ombres depuis les lumières carte en temps réel, a un impact sur la performance aussi (par défaut: désactivé)
+\r_shadow_usenormalmap\Utiliser des effets d'ombrage de lumière sur les textures (par défaut: activé)
+\r_showsurfaces\Désactiver les textures et les remplacer par des couleurs unies. Utile pour les configurations très faible, mais laid. (par défaut: désactivé)
+\r_glsl_offsetmapping\Activer l'effet de relief sur les textures, a un léger impact sur la performance (par défaut: désactivé)
+\r_glsl_offsetmapping_reliefmapping\Augmenter la qualité des effets de relief sur les textures, a un gros impact sur la performance (par défaut: désactivé)
+\r_water\Activer des reflets de réflecion et de réfraction d'eau et des portails Warpzone (par défaut: désactivé)
+\r_water_resolutionmultiplier\Qualité des reflets d'eau et des portails Warpzone, l'augmenter a un gros impact sur la performance (par défaut: bon)
+\r_coronas\Activer des effets d'éblouissement peu gourmands (par défaut: activé)
+\r_coronas_occlusionquery\Prendre en compte la visibilité pour les effets "Brillance Lumière" (par défaut: activé)
+\r_bloom\Activer un effet d'éblouissement plus beau, mais gourmand (par défaut: désactivé)
+\r_hdr\Activer un effet d'ébloissement encore plus beau, mais encore plus gourmand (par défaut: désactivé)
+\r_motionblur\Intensité du flou de mouvement - 0.5 est recommandé
+\r_damageblur\Intensité du flou en recevant des dégâts - 0.4 est recommandé
+
+\XonoticSettingsDialog/Audio\Audio settings
+\bgmvolume\-
+\volume\-
+\snd_staticvolume\-
+\snd_worldchannel0volume\-
+\snd_entchannel3volume\-
+\snd_playerchannel6volume\-
+\snd_playerchannel7volume\-
+\snd_entchannel4volume\-
+\snd_playerchannel2volume\-
+\snd_playerchannel1volume\-
+\snd_speed\Fréquence de la sortie audio
+\snd_channels\Nombre de canaux pour la sortie audio
+\snd_swapstereo\Échanger les canneaux stéréo gauche/droite
+\snd_spatialization_control\Essayer de diminuer le "constraste" entre la partie gauche et droite du casque audio pour un meilleur son
+\cl_voice_directional\Activer les voix des personnages sur la carte
+\cl_voice_directional_taunt_attenuation\Distance à laquelle les voix sont audibles
+\cl_autotaunt\Automatiquement narguer les enemis quand vous les tuez
+\cl_sound_maptime_warning\Voix (en anglais) qui vous dit le temps restant avant la fin du match
+\cl_hitsound\Jouer un son quand vous touchez un enemi
+\menu_sounds\Jouer des sons en cliquant ou en passant la souris sur des options
+
+\XonoticSettingsDialog/Network\Paramètres du jeu en réseau
+\cl_movement\Activer la prédiction des mouvements du joueur pour éviter les saccades lors de parties en réseau
+\cl_nolerp\Algorithme pour éviter les saccades lors de parties en réseau
+\shownetgraph\Show a
+\_cl_rate\Specify your network speed with this slider
+\cl_netfps\Nombre maximum de paquets à envoyer au server chaque seconde
+\cl_curl_maxdownloads\Nombre maximum de téléchargements simultanés
+\cl_curl_maxspeed\Vitesse maximum de téléchargement
+\cl_port\Forcer le client à passer par le port défini (UDP) s'il n'est pas 0
+
+\XonoticSettingsDialog/Misc\Autres paramètres
+\showtime\Montrer l'heure, utile pour les captures d'écran
+\showdate\Montrer la date, utile pour les captures d'écran
+\showfps\Montrer le nombre d'Images Par Seconde rendues (Frames Per Second = FPS)
+\cl_showspeed\Montrer la vitesse du joueur
+\cl_showspeed_unit\Séléctionner l'unité de mesure de la vitesse (qu/s = in/s)
+\cl_showacceleration\Montrer l'accélération du joueur
+\cl_showacceleration_scale\Éxagérer l'accéléromètre avec ce facteur pour qu'il soit plus visible
+
+\XonoticSettingsDialog/Advanced settings...\Paramètres avancés pour configuer le jeu dans ses moindres détails
+\g_friendlyfire\Pourcentage de dégâts infligés aux équipiers si vous les touchez
+\g_mirrordamage\Pourcentage de dégâts infligés aux équipiers qui vous sera renvoyé
+\g_tdm_teams_override\Écraser le nombre d'équipes défini par la carte
+
+\cl_teamradar_position\-
+\cl_teamradar_size\-
+\cl_teamradar_zoommode\-
+\cl_teamradar_rotation\-
+\cl_teamradar_scale\-
+\cl_teamradar_foreground_alpha\-
+\cl_teamradar_background_alpha\Opacité de l'arrière-plan du radar
+\viewsize\Enable/Désactiver l'arrière plan de l'interface
+\sbar_alpha_bg\Opacité de l'arrière plan de l'interface
+\sbar_color_bg_r\Intensité du rouge dans l'arrière-plan de l'interface
+\sbar_color_bg_g\Intensité du vert dans l'arrière-plan de l'interface
+\sbar_color_bg_b\Intensité du bleu dans l'arrière-plan de l'interface
+\sbar_color_bg_team\Saturation de la couleur d'équipe avec l'arrière-plan de l'interface
+\cl_hidewaypoints\Montrer/Cacher les Waypoints (flèches 3D)
+\g_waypointsprite_scale\Ajuster la taille des Waypoints
+\g_waypointsprite_alpha\Ajuster l'opacité des Waypoints
+\cl_shownames\Afficher le nom du joueur que vous pointez avec votre viseur
+
+\crosshair_hittest\Aucun: aucun effet de viseur - TrueAim: rendre le viseur flou si vous risquez de vous blesser vous même ou un équipier - Enemis: rendre le viseur plus grand si vous pouvez toucher un enemi
--- /dev/null
+0
+\XonoticSingleplayerDialog\Начать одиночную кампанию или быструю игру против ботов
+
+
+\XonoticMultiplayerDialog\Играть по сети, просмотреть демо или изменить настройки игрока
+\XonoticMultiplayerDialog/Servers\Поиск игровых серверов
+\menu_slist_showempty\Показывать пустые сервера
+\menu_slist_showfull\Показывать полные сервера, не имеющие свободных мест
+\net_slist_pause\Приостановить обновление списка серверов для предотвращения их скакания
+\XonoticMultiplayerDialog/Info\Показать больше сведений о выбранном сервере
+\XonoticMultiplayerDialog/Bookmark\Добавить выбранный сервер в закладки, так найти его будет быстрее
+\XonoticMultiplayerDialog/Havoc\Change to Havoc mode which has some modifications to the gameplay
+\XonoticMultiplayerDialog/Create\Запустить собственную игру
+\XonoticMultiplayerDialog/Demos\Список демо для просмотра
+\XonoticMultiplayerDialog/Player Setup\Изменить настройки игрока
+
+\XonoticTeamSelectDialog/join 'best' team (auto-select)\Автовыбор команды (советуется)
+\XonoticTeamSelectDialog/red\Присоединиться к красной команде
+\XonoticTeamSelectDialog/blue\Присоединиться к синей команде
+\XonoticTeamSelectDialog/yellow\Присоединиться к жёлтой команде
+\XonoticTeamSelectDialog/pink\Присоединиться к розовой команде
+
+\timelimit_override\Ограничение времени в минутах, состязание закончится при его достижении
+\fraglimit_override\Количество очков, необходимых для завершения состязания
+\menu_maxplayers\Предельное количество игроков и ботов, которые могут быть одновременно подключены к серверу
+\bot_number\Количество ботов на сервере
+\skill\Насколько искусными будут боты
+\g_maplist_votable\Количество карт, предлагаемых в голосовании после состязания
+\sv_vote_simple_majority_factor\Простое большинство выигрывает голосование
+\XonoticMultiplayerDialog/Advanced settings...\Дополнительные серверные настройки
+\XonoticMultiplayerDialog/Mutators...\Мутаторы и арены оружий
+\g_cloaked\Все игроки почти невидимы
+\g_footsteps\Включить звуки шагов
+\g_midair\Только находящиеся в воздухе получают повреждения
+\g_vampire\Урон, наносимый противнику, прибавляется к собственному здоровью
+\g_bloodloss\Величина здоровья, ниже которой наступает оглушение из-за потери крови
+\sv_gravity\Падение происходит медленнее. Чем ниже значение, тем ниже гравитация
+\g_grappling_hook\Передвижение и полёты на подтягивающем крюке
+\g_jetpack\Полёты на реактивном ранце
+\g_pinata\Во время смерти выбрасывается всё оружие, которое нёс "убитый", что даёт возможность его подобрать
+\g_weapon_stay\Всё собранное оружие остаётся после возрождений
+\g_weaponarena\Selecting a weapon arena will give all players that weapon at spawn as well as unlimited ammo, and disable all other weapon pickups.
+\menu_weaponarena_with_laser\Also enable the laser in the weapon arena
+\g_minstagib\Players will be given the Minstanex, which is a railgun with infinite damage. If the player runs out of ammo, he will have 10 seconds to find some or if he fails to do so, face death. The secondary fire mode is a laser which does not inflict any damage and is good for doing trickjumps.
+\g_nixnex\No items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon.
+\g_nixnex_with_laser\Always carry the laser as an additional weapon in NixNex
+\XonoticMultiplayerDialog/All\Выбрать все карты
+\XonoticMultiplayerDialog/None\Снять выделение со всех карт
+
+
+\XonoticMultiplayerDialog/Timedemo\Замерить, насколько быстро компьютер способен играть выбранное демо
+
+\fov\Угол обзора в градусах, допустимы значения от 60 то 130, по умолчанию 90
+\cl_bobcycle\Частота качания вида
+\cl_zoomfactor\How big the zoom factor is when the zoom button is pressed
+\cl_zoomsensitivity\How zoom changes sensitivity, from 0 (lower sensitivity) to 1 (no sensitivity change)
+\cl_zoomspeed\How fast the view will be zoomed, disable to zoom instantly
+\XonoticMultiplayerDialog/Weapon settings...\Set your most preferred weapons, autoswitch and weapon model settings
+
+\cl_weaponpriority_useforcycling\Make use of the list above when cycling through weapons with the mouse wheel
+\cl_autoswitch\Automatically switch to newly picked up weapons if they are better than what you are carrying
+\r_drawviewmodel\Draw the weapon model
+\cl_gunalign\Position of the weapon model; requires reconnect
+
+\crosshair_per_weapon\Set a different crosshair for each weapon, good if you play without weapon models
+\crosshair_color_override\Also set the color of the crosshair depending on the weapon you are currently holding
+\crosshair_size\Настроить размер перекрестья
+\crosshair_color_alpha\Настроить прозрачность перекрестья
+\crosshair_color_red\Красная составляющая цвета перекрестья
+\crosshair_color_green\Зелёная составляющая цвета перекрестья
+\crosshair_color_blue\Синяя составляющая цвета перекрестья
+\sbar_hudselector\Use the old HUD layout
+\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Настроить радар, HUD и отметки
+\_cl_name\Имя, под которым вы появитесь в игре
+
+\XonoticSettingsDialog\Изменить настройки игры
+\XonoticCreditsDialog\The Xonotic credits
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Выйти из игры
+\XonoticQuitDialog/Yes\Пора саночки возить...
+\XonoticQuitDialog/No\Остались здесь ещё дела!
+
+\XonoticSettingsDialog/Input\Настройки устройств ввода
+\sensitivity\Множитель скорости мыши
+\menu_mouse_speed\Множитель скорости мыши в меню, не влияет на прицеливание в игре
+\m_filter\Сглаживает движения мыши, но значительно ухудшает отзывчивость прицеливания
+\m_pitch\Обратить движения мыши по вертикальной оси
+\vid_dgamouse\Использовать DGA ввод для мыши
+\con_closeontoggleconsole\Использовать привязку для открытия консоли также и для её сокрытия
+\sbar_showbinds\Отображать действия / привязанные клавиши в строках, показываемых во время игры
+\cl_showpressedkeys\Показывать, какие кнопки движений нажимает игрок
+
+\XonoticSettingsDialog/Video\Настройки изображения
+\vid_width\Разрешение экрана
+\vid_bitsperpixel\Сколько бит на точку использовать для вывода, советуется 32
+\vid_fullscreen\Включить полноэкранный режим (по умолчанию: включено)
+\vid_vsync\Enable vertical synchronization to prevent tearing, will cap your fps to the screen refresh rate (default: disabled)
+\r_glsl\Enable OpenGL 2.0 pixel shaders for lightning (default: enabled)
+\gl_vbo\Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering (default: Vertex and Triangles)
+\r_depthfirst\Eliminate overdraw by rendering a depth-only version of the scene before the normal rendering starts (default: disabled)
+\gl_texturecompression\Compress the textures for video cards with small amounts of video memory available (default: None)
+\gl_finish\Make the CPU wait for the GPU to finish each frame, can help with some strange input or video lag on some machines (default: disabled)
+\v_brightness\Яркость чёрного (по умолчанию: 0)
+\v_contrast\Яркость белого (по умолчанию: 1)
+\v_gamma\Inverse gamma correction value, a brightness effect that does not affect white or black (default: 1.125)
+\v_contrastboost\By how much to multiply the contrast in dark areas (default: 1)
+\r_glsl_saturation\Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), requires GLSL color control (default: 1)
+\v_glslgamma\Enable use of GLSL to apply gamma correction, note that it might decrease performance by a lot (default: disabled)
+\r_ambient\Окружающее освещение, если выставлено слишком сильным, приводит к тому, что свет на картах выглядит блёклым и плоским (по умолчанию: 4)
+\r_hdr_scenebrightness\Общая яркость вывода (по умолчанию: 1)
+\vid_samples\Enable antialiasing, which smooths the edges of 3D geometry. Note that it might decrease performance by quite a lot (default: disabled)
+\v_flipped\Poor man's left handed mode (default: off)
+
+\XonoticSettingsDialog/Effects\Настройки эффектов
+\r_subdivisions_tolerance\Change the smoothness of the curves on the map (default: normal)
+\gl_picmip\Change the sharpness of the textures. Lowering it will effectively reduce texture memory usage, but make the textures appear very blurry. (default: good)
+\r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
+\mod_q3bsp_nolightmaps\Use high resolution lightmaps, which will look pretty but use up some extra video memory (default: enabled)
+\cl_particles_quality\Multiplier for amount of particles. Less means less particles, which in turn gives for better performance (default: 0.5)
+\r_drawparticles_drawdistance\Particles further away than this will not be drawn (default: 1000)
+\cl_decals\Enable decals (bullet holes and blood) (default: enabled)
+\r_drawdecals_drawdistance\Decals further away than this will not be drawn (default: 300)
+\cl_decals_time\Time in seconds before decals fade away (default: 2)
+\cl_gentle\Replace blood and gibs with content that does not have any gore effects (default: disabled)
+\cl_nogibs\Reduce the amount of gibs or remove them completely (default: lots)
+\v_kicktime\How long a view kick from damage lasts (default: 0)
+\gl_texture_anisotropy\Anisotropic filtering quality (default: 1x)
+\r_glsl_deluxemapping\Use per-pixel lighting effects (default: enabled)
+\r_shadow_gloss\Enable the use of glossmaps on textures supporting it (default: enabled)
+\gl_flashblend\Enable faster but uglier dynamic lights by rendering bright coronas instead of real dynamic lights (default: disabled)
+\r_shadow_realtime_dlight\Enable rendering of dynamic lights such as explosions and rocket lights (default: enabled)
+\r_shadow_realtime_dlight_shadows\Enable rendering of shadows from dynamic lights (default: disabled)
+\r_shadow_realtime_world\Enable rendering of full realtime world lighting on maps that support it. Note that this might have a big impact on performance. (default: disabled)
+\r_shadow_realtime_world_shadows\Enable rendering of shadows from realtime world lights (default: disabled)
+\r_shadow_usenormalmap\Enable use of directional shading on textures (default: enabled)
+\r_showsurfaces\Disable textures completely for very slow hardware. This gives a huge performance boost, but looks very ugly. (default: disabled)
+\r_glsl_offsetmapping\Offset mapping effect that will make textures with bumpmaps appear like they "pop out" of the flat 2D surface (default: disabled)
+\r_glsl_offsetmapping_reliefmapping\Higher quality offset mapping, which also has a huge impact on performance (default: disabled)
+\r_water\Reflection and refraction quality, has a huge impact on performance on maps with reflecting surfaces (default: disabled)
+\r_water_resolutionmultiplier\Resolution of reflections/refractions (default: good)
+\r_coronas\Enable corona flares around certain lights (default: enabled)
+\r_coronas_occlusionquery\Fade coronas according to visibility (default: enabled)
+\r_bloom\Enable bloom effect, which brightens the neighboring pixels of very bright pixels. Has a big impact on performance. (default: disabled)
+\r_hdr\Higher quality version of bloom, which has a huge impact on performance. (default: disabled)
+\r_motionblur\Motion blur strength - 0.5 recommended
+\r_damageblur\Amount of motion blur when hurt - 0.4 recommended
+
+\XonoticSettingsDialog/Audio\Настройки звука
+\bgmvolume\-
+\volume\-
+\snd_staticvolume\-
+\snd_worldchannel0volume\-
+\snd_entchannel3volume\-
+\snd_playerchannel6volume\-
+\snd_playerchannel7volume\-
+\snd_entchannel4volume\-
+\snd_playerchannel2volume\-
+\snd_playerchannel1volume\-
+\snd_speed\Частота дискретизации для вывода звука
+\snd_channels\Число каналов для вывода звука
+\snd_swapstereo\Поменять местами правый и левый каналы
+\snd_spatialization_control\Enable spatialization (blend the right and left channel slightly to decrease stereo separation a bit for headphones)
+\cl_voice_directional\Enable directional voices
+\cl_voice_directional_taunt_attenuation\Расстояние, с которого будут слышны насмешки
+\cl_autotaunt\Автоматически насмехаться над противниками после их поражений
+\cl_sound_maptime_warning\Звук предупреждения, сообщающий оставшиеся до конца состязания минуты
+\cl_hitsound\Играть звук оповещения, когда выстрел достигает противника
+\menu_sounds\Играть звуки при взаимодействии с меню
+
+\XonoticSettingsDialog/Network\Настройки сети
+\cl_movement\Включить предсказание движения на стороне клиента
+\cl_nolerp\Enable network update smoothing
+\shownetgraph\Показывать график размеров пакетов и других сведений
+\_cl_rate\Укажите скорость вашей сети с помощью этого ползунка
+\cl_netfps\Сколько пакетов посылать серверу каждую секунду
+\cl_curl_maxdownloads\Предел одновременных HTTP/FTP загрузок
+\cl_curl_maxspeed\Предел скорости скачивания
+\cl_port\Force client to use chosen port unless it is set to 0
+
+\XonoticSettingsDialog/Misc\Разные настройки
+\showtime\Показывать текущее время, полезно на снимках экранов
+\showdate\Показывать текущую дату, полезно на снимках экранов
+\showfps\Show your rendered frames per second
+\cl_showspeed\Показывать скорость игрока
+\cl_showspeed_unit\Выбор единиц измерения спидометра. qu/s = quake units/second = дюйм/секунду
+\cl_showacceleration\Показывать ускорение игрока
+\cl_showacceleration_scale\Excaggerate the accelerometer by this scale multiplier
+
+\XonoticSettingsDialog/Advanced settings...\Продвинутые настройки, в которых можно подстроить каждую переменную игры
+\g_friendlyfire\Доля урона, получаемого союзниками от союзников
+\g_mirrordamage\Доля урона, наносимого союзнику, которая будет отражена на себя
+\g_tdm_teams_override\Заменить значение по умолчанию количества команд в командных играх
+
+\cl_teamradar_position\-
+\cl_teamradar_size\-
+\cl_teamradar_zoommode\-
+\cl_teamradar_rotation\-
+\cl_teamradar_scale\-
+\cl_teamradar_foreground_alpha\-
+\cl_teamradar_background_alpha\Значение прозрачности фона радара
+\viewsize\Включить/выключить фон HUD
+\sbar_alpha_bg\Значение прозрачности фона HUD
+\sbar_color_bg_r\Красная составляющая цвета фона HUD
+\sbar_color_bg_g\Зелёная составляющая цвета фона HUD
+\sbar_color_bg_b\Синяя составляющая цвета фона HUD
+\sbar_color_bg_team\Насыщенность командного цвета фона HUD
+\cl_hidewaypoints\Показывать различные отметки, определяемые видом игры
+\g_waypointsprite_scale\Множитель размера отметок
+\g_waypointsprite_alpha\Управление прозрачностью отметок
+\cl_shownames\Показывать имя игрока, в которого вы целитесь
+
+\crosshair_hittest\Отключена: нет проверок перекрестья на попадание; TrueAim: размывать перекрестье, когда не наведено на стену; Враги: также увеличивать перекрестье, когда наведено на врага
// OMG! Its the Evil Wheel! :O
exec unit_ewheel.cfg
-//
-exec unit_repulsor.cfg
+// It is so repulsive, it doesn't even exist!
+// exec unit_repulsor.cfg
set g_turrets_reloadcvars 0 // reload when this cfg has been exec'd
alias g_turrets_reload "set g_turrets_reloadcvars 1"
awk '/^seta? g_/ { print $2; }' "$b" | sort -u | tr -d '\r' > "$B"
diff "$A" "$B" | grep '^[<>]' | sort
rm -f "$A" "$B"
- exit 1
+ echo "Please wait for 30 seconds, so you have had enough time to read this..."
+ sleep 30
fi
done
**Core Team
Rudolf "divVerent" Polzer
--z-
+Tyler "-z-" Mulligan
Merlijn Hofstra
morphed
mand1nga
Diabolik a.k.a Dib
*2D Art / Web
--z- (web / game)
+Tyler "-z-" Mulligan (web / game)
FruitieX (game / web)
*3D Art
morphed
+*Concept Art
+LJFHutch
+Pearce "theShadow" Michal
+
*Level Design
FruitieX
+MirceaKitsune
*Music / Sound FX
mand1nga
tZork
*Marketing / PR
--z-
+Tyler "-z-" Mulligan
mand1nga
*Legal
DarkPlaces
by Forest "LordHavoc" Hale
+**Translators
+
+*German
+Rudolf "divVerent" Polzer
+
+*Finnish
+Exitium
+
+*French
+Calinou
+
+*Portuguese
+Ricardo "Hellgardia" Silva
+
+*Romanian
+MirceaKitsune
+
+*Russian
+Lord Canistra
+Nikoli
+
**Active Contributors
Antonio "terencehill" Piu
Ben "MooKow" Banker
Calinou
+chooksta
+Cuinn "Cuinnton" Herrick
Kristian "morfar" Johansson
kojn
Maik "SavageX" Merten
MrBougo
+Ruszkai "C.Brutail" Ákos
+Samual Lenks
+Severin "sev" Meyer
Stephan "esteel" Stahl
Wolfgang "Blub\0" Bumiller
Mephisto
michaelb
Michael "Tenshihan" Quinn
-MirceaKitsune
Munyul
Netzwerg
NoelCower
Robert "ai" Kuroto
Ronan
Sajt
-Samual Lenks
-Severin "sev" Meyer
Shaggy
Shank
Simon O'Callaghan
--- /dev/null
+**Dévlopeurs principaux
+
+Rudolf "divVerent" Polzer
+Tyler "-z-" Mulligan
+Merlijn Hofstra
+morphed
+mand1nga
+tZork
+
+
+**Dévlopeurs secondaires
+
+*Art
+Diabolik a.k.a Dib
+
+*Textures / Web
+Tyler "-z-" Mulligan (web / game)
+FruitieX (game / web)
+
+*Modèles 3D
+morphed
+
+*Concepts
+LJFHutch
+Pearce "theShadow" Michal
+
+*Création des cartes
+FruitieX
+MirceaKitsune
+
+*Musique / Sons
+mand1nga
+Merlijn Hofstra
+remaxim
+
+*Améliorations du moteur et QA
+Rudolf "divVerent" Polzer
+
+*Code source du jeu
+Rudolf "divVerent" Polzer
+FruitieX
+tZork
+
+*Marketing / Management du Projet
+Tyler "-z-" Mulligan
+mand1nga
+
+*Légalité
+Rudolf "divVerent" Polzer
+Merlijn Hofstra
+
+**Moteur du jeu
+DarkPlaces
+by Forest "LordHavoc" Hale
+
+**Traducteurs
+
+*Allemand
+Rudolf "divVerent" Polzer
+
+*Finnish (TODO TRANSLATE THIS)
+Exitium
+
+*Français
+Calinou
+
+*Portugais
+Ricardo "Hellgardia" Silva
+
+*Roumain
+MirceaKitsune
+
+*Russe
+Lord Canistra
+Nikoli
+
+**Contribueurs actifs
+Antonio "terencehill" Piu
+Ben "MooKow" Banker
+Calinou
+chooksta
+Cuinn "Cuinnton" Herrick
+Kristian "morfar" Johansson
+kojn
+Maik "SavageX" Merten
+MrBougo
+Ruszkai "C.Brutail" Ákos
+Samual Lenks
+Severin "sev" Meyer
+Stephan "esteel" Stahl
+Wolfgang "Blub\0" Bumiller
+
+**Anciens contribueurs
+Alexander "motorsep" Zubov
+Amos "torus" Dudley
+Andreas "Black" Kirsch
+Attila "WW3" Houtkooper
+BigMac
+blkrbt
+Braden "meoblast001" Walters
+Brain Younds
+Chris "amethyst7" Matz
+Christian Ice
+Clinton "Kaziganthe" Freeman
+Dan "Digger" Korostelev
+Dan "Wazat" Hale
+Donkey
+dstrek
+Dustin Geeraert
+Edgenetwork
+Edward "Ed" Holness
+Eric "Munyul Verminard" Sambach
+Fabien "H. Reaper" Tschirhart
+FrikaC
+Garth "Zombie" Hendy
+Gerd "Elysis" Raudenbusch
+Gottfried "Toddd" Hofmann
+Henning "Tymo" Janssen
+"Innovati"
+Jitspoe
+Jody Gallagher
+Juergen "LowDragon" Timm
+KadaverJack
+Kevin "Tyrann" Shanahan
+Kurt Dereli
+lcatlnx
+Lee David Ash
+Lee Vermeulen
+leileilol
+Marius "GreEn`mArine" Shekow
+Marko "Urre" Permanto
+Mathieu "Elric" Olivier
+Mattrew "Tronyn" Rye
+MauveBib
+Mephisto
+michaelb
+Michael "Tenshihan" Quinn
+Munyul
+Netzwerg
+NoelCower
+Parapraxis
+Paul "Strahlemann" Evers
+Petithomme
+Q1 Retexturing Project
+Qantourisc
+Rick "Rat" Kelley
+Robert "ai" Kuroto
+Ronan
+Sajt
+Severin "sev" Meyer
+Shaggy
+Shank
+Simon O'Callaghan
+SomeGuy
+Spike
+Spirit
+Steve Vermeulen
+Supajoe
+Tei
+terencehill
+Tomaz
+Ulrich Galbraith
+Vortex
+William Libert
+William "Willis" Weilep
+Yves "EviLair" Allaire
+Zenex