]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/mrbougo/tooltips_fix'
authorRudolf Polzer <divverent@alientrap.org>
Tue, 1 Mar 2011 17:50:50 +0000 (18:50 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Tue, 1 Mar 2011 17:50:50 +0000 (18:50 +0100)
572 files changed:
Makefile
_hud_descriptions.cfg
apply-eol-style.sh [deleted file]
balance25.cfg
balanceLeeStricklin.cfg
balanceNexSVN.cfg [deleted file]
balanceSamual.cfg
balanceTest.cfg [deleted file]
balanceXonotic.cfg
balancetZork.cfg
check-translations.sh [new file with mode: 0755]
csprogs.dat.de.po.disabled [new file with mode: 0644]
defaultSamual.cfg
defaultXPM.cfg
defaultXonotic.cfg
demos/the-big-keybench.dem [new file with mode: 0644]
effectinfo.txt
effects-high.cfg
effects-low.cfg
effects-med.cfg
effects-normal.cfg
effects-omg.cfg
effects-ultimate.cfg
effects-ultra.cfg
fixbalance.sh [new file with mode: 0755]
gfx/blood.tga [new file with mode: 0644]
gfx/crosshairdot.tga
gfx/crosshairlaser.tga
gfx/crosshairrocketlauncher.tga
gfx/hud/default/keepawayball_carrying.tga [new file with mode: 0644]
gfx/hud/default/notify_balldropped.tga [new file with mode: 0644]
gfx/hud/default/notify_ballpickedup.tga [new file with mode: 0644]
gfx/hud/default/weaponcampingrifle.tga [deleted file]
gfx/hud/default/weaponminelayer.tga
gfx/hud/default/weaponsniperrifle.tga [new file with mode: 0644]
gfx/hud/luminos/keepawayball_carrying.tga [new file with mode: 0644]
gfx/hud/luminos/notify_balldropped.tga [new file with mode: 0644]
gfx/hud/luminos/notify_ballpickedup.tga [new file with mode: 0644]
gfx/hud/luminos/weaponcampingrifle.tga [deleted file]
gfx/hud/luminos/weaponminelayer.tga
gfx/hud/luminos/weaponsniperrifle.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_bullets.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_cells.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_current_bg.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_rockets.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/ammo_shells.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/border_healtharmor.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_ammo.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_armor_vertical.tga [new file with mode: 0644]
gfx/hud/luminos_xhair/progressbar_health_vertical.tga [new file with mode: 0644]
gfx/hud/old/weaponcampingrifle.tga [deleted file]
gfx/hud/old/weaponminelayer.tga
gfx/hud/old/weaponsniperrifle.tga [new file with mode: 0644]
gfx/loading.tga
gfx/menu/default/icon_ipv4.tga [new file with mode: 0644]
gfx/menu/default/icon_ipv6.tga [new file with mode: 0644]
gfx/menu/default/skinvalues.txt
gfx/menu/luminos/checkbox_d0.tga
gfx/menu/luminos/checkbox_f0.tga
gfx/menu/luminos/checkbox_n0.tga
gfx/menu/luminos/icon_ipv4.tga [new file with mode: 0644]
gfx/menu/luminos/icon_ipv6.tga [new file with mode: 0644]
gfx/menu/luminos/skinvalues.txt
gfx/menu/xaw/colorpicker_selected.tga [new file with mode: 0644]
gfx/menu/xaw/icon_ipv4.tga [new file with mode: 0644]
gfx/menu/xaw/icon_ipv6.tga [new file with mode: 0644]
gfx/menu/xaw/skinvalues.txt
gfx/net.tga
gfx/winner.tga
hook-firing_swap.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg [new file with mode: 0644]
hud_luminos_xhair_minimal.cfg [new file with mode: 0644]
hud_nexuiz.cfg
keybinds.txt
keybinds.txt.de [new file with mode: 0644]
keybinds.txt.fr [new file with mode: 0644]
keybinds.txt.ru [new file with mode: 0644]
languages.txt [new file with mode: 0644]
menu.dat.de.po [new file with mode: 0644]
menu.dat.fi.po [new file with mode: 0644]
menu.dat.fr.po [new file with mode: 0644]
menu.dat.hu.po [new file with mode: 0644]
menu.dat.nl.po [new file with mode: 0644]
menu.dat.pt.po [new file with mode: 0644]
menu.dat.ro.po [new file with mode: 0644]
menu.dat.ru.po [new file with mode: 0644]
menu.dat.se.po [new file with mode: 0644]
merge-settings-into-cfg.pl [deleted file]
models/ctf/banner_blue.tga [new file with mode: 0644]
models/ctf/banner_blue_gloss.tga [new file with mode: 0644]
models/ctf/banner_red.tga [new file with mode: 0644]
models/ctf/banner_red_gloss.tga [new file with mode: 0644]
models/ctf/flag_blue.tga [new file with mode: 0644]
models/ctf/flag_blue_gloss.tga [new file with mode: 0644]
models/ctf/flag_blue_glow.tga [new file with mode: 0644]
models/ctf/flag_blue_norm.tga [new file with mode: 0644]
models/ctf/flag_red.tga [new file with mode: 0644]
models/ctf/flag_red_gloss.tga [new file with mode: 0644]
models/ctf/flag_red_glow.tga [new file with mode: 0644]
models/ctf/flag_red_norm.tga [new file with mode: 0644]
models/ctf/flags.md3
models/ctf/flags.md3.framegroups [new file with mode: 0644]
models/ctf/flags.md3_0.skin
models/ctf/flags.md3_1.skin
models/ctf/glow_blue.tga [new file with mode: 0644]
models/ctf/glow_blue_glow.tga [new file with mode: 0644]
models/ctf/glow_red.tga [new file with mode: 0644]
models/ctf/glow_red_glow.tga [new file with mode: 0644]
models/elaser.mdl
models/hlac_bullet.md3
models/ice/ice.md3 [new file with mode: 0644]
models/ice/ice.tga [new file with mode: 0644]
models/ice/ice_gloss.tga [new file with mode: 0644]
models/ice/ice_glow.tga [new file with mode: 0644]
models/ice/ice_norm.tga [new file with mode: 0644]
models/ice/ice_reflect.tga [new file with mode: 0644]
models/ice/iceshard.md3 [new file with mode: 0644]
models/laser.mdl
models/mine.md3
models/orbs/orbblue.md3 [new file with mode: 0644]
models/orbs/orbblue.tga [new file with mode: 0644]
models/orbs/orbblue_glow.tga [new file with mode: 0644]
models/orbs/orbpink.md3 [new file with mode: 0644]
models/orbs/orbpink.tga [new file with mode: 0644]
models/orbs/orbpink_glow.tga [new file with mode: 0644]
models/orbs/orbred.md3 [new file with mode: 0644]
models/orbs/orbred.tga [new file with mode: 0644]
models/orbs/orbred_glow.tga [new file with mode: 0644]
models/orbs/orbyellow.md3 [new file with mode: 0644]
models/orbs/orbyellow.tga [new file with mode: 0644]
models/orbs/orbyellow_glow.tga [new file with mode: 0644]
models/plasmatrail.mdl
models/player/erebus.iqm.framegroups
models/player/erebus.iqm_0.skin [new file with mode: 0644]
models/player/erebus.iqm_1.skin [new file with mode: 0644]
models/player/erebus.iqm_1.sounds [new file with mode: 0644]
models/player/erebus.iqm_1.tga [new file with mode: 0644]
models/player/erebus.iqm_1.txt [new file with mode: 0644]
models/player/erebus_lod1.iqm.framegroups
models/player/erebus_lod1.iqm_0.skin [new file with mode: 0644]
models/player/erebus_lod1.iqm_1.skin [new file with mode: 0644]
models/player/erebus_lod2.iqm.framegroups
models/player/erebus_lod2.iqm_0.skin [new file with mode: 0644]
models/player/erebus_lod2.iqm_1.skin [new file with mode: 0644]
models/player/gak.iqm.framegroups
models/player/gakarmored.iqm.framegroups
models/player/gakmasked.iqm.framegroups
models/player/ignis.iqm.framegroups
models/player/ignis_lod1.iqm.framegroups
models/player/ignis_lod2.iqm.framegroups
models/player/ignishalfmasked.iqm.framegroups
models/player/ignishalfmasked_lod1.iqm.framegroups
models/player/ignishalfmasked_lod2.iqm.framegroups
models/player/ignismasked.iqm.framegroups
models/player/ignismasked_lod1.iqm.framegroups
models/player/ignismasked_lod2.iqm.framegroups
models/player/nyx.iqm.framegroups
models/player/pyria.iqm.framegroups
models/player/seraphina.iqm.framegroups
models/player/seraphina_lod1.iqm.framegroups
models/player/seraphina_lod2.iqm.framegroups
models/player/seraphinamasked.iqm.framegroups
models/player/seraphinamasked_lod1.iqm.framegroups
models/player/seraphinamasked_lod2.iqm.framegroups
models/player/umbra.iqm.framegroups
models/sprites/freezetag_frozen_frame0.tga [new file with mode: 0644]
models/sprites/ka-ball.tga [new file with mode: 0644]
models/sprites/ka-ballcarrier.tga [new file with mode: 0644]
models/sprites/make-sprites.sh
models/sprites/wpn-minelayer_frame0.tga [new file with mode: 0644]
models/weapons/g_crylink.md3
models/weapons/g_hlac.md3
models/weapons/g_laser.md3
models/weapons/g_minelayer.md3
models/weapons/g_nex.md3
models/weapons/g_porto.md3
models/weapons/v_crylink.md3
models/weapons/v_hlac.md3
models/weapons/v_hookgun.md3
models/weapons/v_laser.md3
models/weapons/v_minelayer.md3
models/weapons/v_nex.md3
models/weapons/v_porto.md3
particles/nexbeam.tga [deleted file]
physics10.cfg [deleted file]
physics11.cfg [deleted file]
physics151.cfg [deleted file]
physics151b.cfg [deleted file]
physics16rc1.cfg [deleted file]
physics20.cfg [deleted file]
physics25.cfg [deleted file]
physics26.cfg [deleted file]
physicsCPMA.cfg
physicsFruit.cfg
physicsHavoc.cfg
physicsLeeStricklin-ModdedFruit.cfg [new file with mode: 0644]
physicsLeeStricklin.cfg
physicsLeeStricklinOld.cfg
physicsLzd.cfg
physicsNexuiz10.cfg [new file with mode: 0644]
physicsNexuiz11.cfg [new file with mode: 0644]
physicsNexuiz151.cfg [new file with mode: 0644]
physicsNexuiz151b.cfg [new file with mode: 0644]
physicsNexuiz16rc1.cfg [new file with mode: 0644]
physicsNexuiz20.cfg [new file with mode: 0644]
physicsNexuiz25.cfg [new file with mode: 0644]
physicsNexuiz26.cfg [new file with mode: 0644]
physicsNoQWBunny-nexbased.cfg
physicsNoQWBunny-xpmbased.cfg [deleted file]
physicsQ.cfg
physicsQ2.cfg
physicsQ2a.cfg
physicsQ3.cfg
physicsQBF.cfg
physicsQBFplus.cfg
physicsSamual.cfg
physicsWarsow.cfg
physicsWarsowClassicBunny.cfg
physicsWarsowDev.cfg
physicsX0.cfg [new file with mode: 0644]
physicsXPM.cfg
physicsXPMLight.cfg
qcsrc/autocvarize-update.sh [new file with mode: 0755]
qcsrc/autocvarize.pl [new file with mode: 0644]
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/bgmscript.qc
qcsrc/client/casings.qc
qcsrc/client/csqc_constants.qc
qcsrc/client/ctf.qc
qcsrc/client/damage.qc
qcsrc/client/effects.qc
qcsrc/client/gibs.qc
qcsrc/client/hook.qc
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/client/main.qh
qcsrc/client/mapvoting.qc
qcsrc/client/miscfunctions.qc
qcsrc/client/particles.qc
qcsrc/client/prandom.qc
qcsrc/client/projectile.qc
qcsrc/client/scoreboard.qc
qcsrc/client/target_music.qc
qcsrc/client/teamplay.qc
qcsrc/client/teamradar.qc
qcsrc/client/tuba.qc
qcsrc/client/wall.qc
qcsrc/client/waypointsprites.qc
qcsrc/common/constants.qh
qcsrc/common/gamecommand.qc
qcsrc/common/items.qc
qcsrc/common/items.qh
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/util-pre.qh
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/i18n-badwords.txt [new file with mode: 0644]
qcsrc/i18n-guide.txt [new file with mode: 0644]
qcsrc/menu/anim/animhost.c
qcsrc/menu/classes.c
qcsrc/menu/draw.qc
qcsrc/menu/gamecommand.qc
qcsrc/menu/item.c
qcsrc/menu/item/borderimage.c
qcsrc/menu/item/button.c
qcsrc/menu/item/dialog.c
qcsrc/menu/item/gecko.c
qcsrc/menu/item/inputbox.c
qcsrc/menu/item/label.c
qcsrc/menu/item/listbox.c
qcsrc/menu/item/nexposee.c
qcsrc/menu/item/slider.c
qcsrc/menu/item/textslider.c
qcsrc/menu/mbuiltin.qh
qcsrc/menu/menu.qc
qcsrc/menu/menu.qh
qcsrc/menu/skin-customizables.inc
qcsrc/menu/skin.qh
qcsrc/menu/xonotic/button.c
qcsrc/menu/xonotic/campaign.c
qcsrc/menu/xonotic/colorpicker.c
qcsrc/menu/xonotic/colorpicker_string.c
qcsrc/menu/xonotic/credits.c
qcsrc/menu/xonotic/crosshairbutton.c
qcsrc/menu/xonotic/cvarlist.c
qcsrc/menu/xonotic/dialog.c
qcsrc/menu/xonotic/dialog_credits.c
qcsrc/menu/xonotic/dialog_firstrun.c [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_hudpanel_ammo.c
qcsrc/menu/xonotic/dialog_hudpanel_chat.c
qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c
qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c
qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c
qcsrc/menu/xonotic/dialog_hudpanel_modicons.c
qcsrc/menu/xonotic/dialog_hudpanel_notification.c
qcsrc/menu/xonotic/dialog_hudpanel_powerups.c
qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c
qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c
qcsrc/menu/xonotic/dialog_hudpanel_radar.c
qcsrc/menu/xonotic/dialog_hudpanel_score.c
qcsrc/menu/xonotic/dialog_hudpanel_timer.c
qcsrc/menu/xonotic/dialog_hudpanel_vote.c
qcsrc/menu/xonotic/dialog_hudpanel_weapons.c
qcsrc/menu/xonotic/dialog_hudsetup_exit.c
qcsrc/menu/xonotic/dialog_multiplayer.c
qcsrc/menu/xonotic/dialog_multiplayer_create.c
qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/menu/xonotic/dialog_multiplayer_demo.c
qcsrc/menu/xonotic/dialog_multiplayer_join.c
qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c
qcsrc/menu/xonotic/dialog_news.c
qcsrc/menu/xonotic/dialog_quit.c
qcsrc/menu/xonotic/dialog_settings.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/dialog_settings_input.c
qcsrc/menu/xonotic/dialog_settings_input_userbind.c
qcsrc/menu/xonotic/dialog_settings_misc.c
qcsrc/menu/xonotic/dialog_settings_misc_cvars.c
qcsrc/menu/xonotic/dialog_settings_network.c
qcsrc/menu/xonotic/dialog_settings_video.c
qcsrc/menu/xonotic/dialog_singleplayer.c
qcsrc/menu/xonotic/dialog_singleplayer_winner.c
qcsrc/menu/xonotic/dialog_teamselect.c
qcsrc/menu/xonotic/gametypelist.c [new file with mode: 0644]
qcsrc/menu/xonotic/inputbox.c
qcsrc/menu/xonotic/keybinder.c
qcsrc/menu/xonotic/languagelist.c [new file with mode: 0644]
qcsrc/menu/xonotic/mainwindow.c
qcsrc/menu/xonotic/maplist.c
qcsrc/menu/xonotic/playermodel.c
qcsrc/menu/xonotic/rootdialog.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/menu/xonotic/skinlist.c
qcsrc/menu/xonotic/slider_decibels.c
qcsrc/menu/xonotic/slider_picmip.c
qcsrc/menu/xonotic/slider_resolution.c
qcsrc/menu/xonotic/util.qc
qcsrc/menu/xonotic/util.qh
qcsrc/server/accuracy.qc [new file with mode: 0644]
qcsrc/server/accuracy.qh [new file with mode: 0644]
qcsrc/server/anticheat.qc
qcsrc/server/arena.qc
qcsrc/server/assault.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/aim.qc
qcsrc/server/bot/bot.qc
qcsrc/server/bot/bot.qh
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/havocbot/role_ctf.qc
qcsrc/server/bot/havocbot/role_keyhunt.qc
qcsrc/server/bot/havocbot/role_onslaught.qc
qcsrc/server/bot/havocbot/roles.qc
qcsrc/server/bot/navigation.qc
qcsrc/server/bot/scripting.qc
qcsrc/server/bot/waypoints.qc
qcsrc/server/campaign.qc
qcsrc/server/cheats.qc
qcsrc/server/cheats.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_impulse.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/clientcommands.qc
qcsrc/server/csqcprojectile.qc
qcsrc/server/ctf.qc
qcsrc/server/defs.qh
qcsrc/server/domination.qc
qcsrc/server/extensions.qh
qcsrc/server/func_breakable.qc
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_subs.qc
qcsrc/server/g_triggers.qc
qcsrc/server/g_world.qc
qcsrc/server/gamecommand.qc
qcsrc/server/ipban.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mode_onslaught.qc
qcsrc/server/monsters/ai.qc
qcsrc/server/monsters/defs.qc
qcsrc/server/monsters/m_monsters.qc
qcsrc/server/monsters/mode_management.qc [deleted file]
qcsrc/server/monsters/monster_zombie.qc
qcsrc/server/movelib.qc
qcsrc/server/mutators/base.qc
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/gamemode_freezetag.qc [new file with mode: 0644]
qcsrc/server/mutators/gamemode_keepaway.qc [new file with mode: 0644]
qcsrc/server/mutators/gamemode_keyhunt.qc
qcsrc/server/mutators/mutator_dodging.qc
qcsrc/server/mutators/mutator_nix.qc
qcsrc/server/mutators/mutator_vampire.qc
qcsrc/server/mutators/mutators.qh
qcsrc/server/nexball.qc
qcsrc/server/playerstats.qc [new file with mode: 0644]
qcsrc/server/playerstats.qh [new file with mode: 0644]
qcsrc/server/portals.qc
qcsrc/server/progs.src
qcsrc/server/race.qc
qcsrc/server/runematch.qc
qcsrc/server/scores.qc
qcsrc/server/scores.qh
qcsrc/server/scores_rules.qc
qcsrc/server/sv_main.qc
qcsrc/server/t_items.qc
qcsrc/server/t_jumppads.qc
qcsrc/server/t_plats.qc
qcsrc/server/t_quake3.qc
qcsrc/server/t_teleporters.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/system/system_aimprocs.qc
qcsrc/server/tturrets/system/system_damage.qc
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/tturrets/units/unit_ewheel.qc
qcsrc/server/tturrets/units/unit_fusionreactor.qc
qcsrc/server/tturrets/units/unit_hellion.qc
qcsrc/server/tturrets/units/unit_hk.qc
qcsrc/server/tturrets/units/unit_machinegun.qc
qcsrc/server/tturrets/units/unit_phaser.qc
qcsrc/server/tturrets/units/unit_targettrigger.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vote.qc
qcsrc/server/w_all.qc
qcsrc/server/w_campingrifle.qc [deleted file]
qcsrc/server/w_common.qc
qcsrc/server/w_crylink.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hagar.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_hook.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_porto.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_sniperrifle.qc [new file with mode: 0644]
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc
qcsrc/server/waypointsprites.qc
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh
qcsrc/warpzonelib/mathlib.qc
qcsrc/warpzonelib/server.qc
quake.rc
scripts/ctf.shader [new file with mode: 0644]
scripts/ice.shader [new file with mode: 0644]
scripts/orbs.shader [new file with mode: 0644]
scripts/projectiles.shader [new file with mode: 0644]
scripts/weapons.shader
serverbench.cfg
sound/announcer/default/03kills.ogg
sound/announcer/default/05kills.ogg
sound/announcer/default/10kills.ogg
sound/announcer/default/15kills.ogg
sound/announcer/default/1fragleft.ogg
sound/announcer/default/1minuteremains.ogg
sound/announcer/default/20kills.ogg
sound/announcer/default/25kills.ogg
sound/announcer/default/2fragsleft.ogg
sound/announcer/default/30kills.ogg
sound/announcer/default/3fragsleft.ogg
sound/announcer/default/5minutesremain.ogg
sound/announcer/default/airshot.ogg
sound/announcer/default/amazing.ogg
sound/announcer/default/awesome.ogg
sound/announcer/default/blueteamtakeslead.ogg
sound/announcer/default/headshot.ogg
sound/announcer/default/impressive.ogg
sound/announcer/default/redteamtakeslead.ogg
sound/keepaway/dropped.wav [new file with mode: 0644]
sound/keepaway/pickedup.wav [new file with mode: 0644]
sound/keepaway/respawn.wav [new file with mode: 0644]
sound/keepaway/touch.wav [new file with mode: 0644]
sound/misc/armor25.wav
sound/monsters/alien_chant_loop.ogg [new file with mode: 0644]
sound/monsters/giant_snoring_loop.ogg [new file with mode: 0644]
sound/monsters/growl1.wav [new file with mode: 0644]
sound/monsters/growl2.wav [new file with mode: 0644]
sound/monsters/growl3.wav [new file with mode: 0644]
sound/player/slime.wav
sound/weapons/crylink_fire.ogg
sound/weapons/crylink_fire2.ogg
sound/weapons/electro_fire.ogg
sound/weapons/electro_fire2.ogg
sound/weapons/grenade_fire.ogg
sound/weapons/grenade_impact.ogg
sound/weapons/hagar_fire.ogg
sound/weapons/hagexp1.ogg
sound/weapons/hagexp2.ogg
sound/weapons/hagexp3.ogg
sound/weapons/minstanexfire.ogg
sound/weapons/nexcharge.ogg [new file with mode: 0644]
sound/weapons/nexfire.ogg
sound/weapons/nexwhoosh1.ogg
sound/weapons/nexwhoosh2.ogg
sound/weapons/nexwhoosh3.ogg
sound/weapons/rocket_impact.ogg
sound/weapons/shotgun_fire.ogg
sound/weapons/strength_fire.ogg
sound/weapons/uzi_fire.ogg
textures/erebusfullbright.tga [new file with mode: 0644]
textures/erebusfullbright_gloss.tga [new file with mode: 0644]
textures/erebusfullbright_glow.tga [new file with mode: 0644]
textures/erebusfullbright_norm.tga [new file with mode: 0644]
textures/erebusfullbright_shirt.tga [new file with mode: 0644]
textures/flags/flag_blue.tga [deleted file]
textures/flags/flag_blue_cloth.tga [deleted file]
textures/flags/flag_blue_gloss.tga [deleted file]
textures/flags/flag_blue_glow.tga [deleted file]
textures/flags/flag_blue_laser.tga [deleted file]
textures/flags/flag_blue_norm.tga [deleted file]
textures/flags/flag_red.tga [deleted file]
textures/flags/flag_red_cloth.tga [deleted file]
textures/flags/flag_red_gloss.tga [deleted file]
textures/flags/flag_red_glow.tga [deleted file]
textures/flags/flag_red_laser.tga [deleted file]
textures/flags/flag_red_norm.tga [deleted file]
textures/hlac_glass.tga [new file with mode: 0644]
textures/hlac_plasma.tga [new file with mode: 0644]
textures/mine.tga [new file with mode: 0644]
textures/mine_gloss.tga [new file with mode: 0644]
textures/mine_glow.tga [new file with mode: 0644]
textures/minelayer.tga [new file with mode: 0644]
textures/minelayer_gloss.tga [new file with mode: 0644]
textures/minelayer_glow.tga [new file with mode: 0644]
textures/nexgun.tga
textures/nexgun_glow.tga
textures/projectiles/crylink_projectile_core.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_long.tga [new file with mode: 0644]
textures/projectiles/crylink_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_core.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_long.tga [new file with mode: 0644]
textures/projectiles/electro_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_core.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_long.tga [new file with mode: 0644]
textures/projectiles/hlac_projectile_long_glow.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_core.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_core_glow.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_long.tga [new file with mode: 0644]
textures/projectiles/laser_projectile_long_glow.tga [new file with mode: 0644]
tooltips.db
tooltips.db.de [new file with mode: 0644]
tooltips.db.fr [new file with mode: 0644]
tooltips.db.ru [new file with mode: 0644]
turrets.cfg
update-cvarcount.sh
xonotic-credits.txt
xonotic-credits.txt.fr [new file with mode: 0644]

index e71d9d1c10d656da49ad3a9901544c6646907149..caab47a809b19cdc078626da15943e619515b5a8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ ZIP ?= 7za a -tzip -mx=9
 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 ?=
@@ -38,17 +38,17 @@ skin: gfx/menu/default/skinvalues.txt
 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)
index ddcd45a364fcbb4dbdb4e1b089cdbbe979414c2a..269b07c526ce3dc2293a7cf67e38bb2c81066359 100644 (file)
@@ -47,6 +47,8 @@ seta hud_panel_weapons_complainbubble_color_donthave "" "color of the complainbu
 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"
@@ -59,6 +61,10 @@ seta hud_panel_ammo_bg_color_team "" "override panel color with team color in te
 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"
@@ -73,6 +79,9 @@ seta hud_panel_powerups_bg_alpha "" "if set to something else than \"\" = overri
 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"
@@ -87,6 +96,9 @@ seta hud_panel_healtharmor_bg_alpha "" "if set to something else than \"\" = ove
 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"
diff --git a/apply-eol-style.sh b/apply-eol-style.sh
deleted file mode 100755 (executable)
index 6c6c997..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/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
index 116c9a1cea86e3256d84e974d3f5725e637f68d0..864d169c3baa3d23ff3a00fbfb28ee0b2a278b5b 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 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"
@@ -226,6 +226,7 @@ set g_balance_laser_primary_delay 0.05
 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
@@ -241,6 +242,7 @@ 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
+set g_balance_laser_secondary_force_other_scale 1
 // }}}
 // {{{ shotgun
 set g_balance_shotgun_primary_bullets 6
@@ -263,17 +265,33 @@ set g_balance_shotgun_secondary_refire 1.1
 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
 // }}}
@@ -317,7 +335,7 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 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
@@ -325,6 +343,7 @@ 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_ammo 5
@@ -373,6 +392,8 @@ 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_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
@@ -393,7 +414,15 @@ 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_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
@@ -413,7 +442,15 @@ 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_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
@@ -434,6 +471,10 @@ set g_balance_nex_primary_damagefalloff_forcehalflife 0
 set g_balance_nex_secondary 0
 set g_balance_nex_secondary_charge 0
 set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_chargepool 0
+set g_balance_nex_secondary_chargepool_regen 0.15
+set g_balance_nex_secondary_chargepool_pause_regen 1
+set g_balance_nex_secondary_chargepool_pause_health_regen 1
 set g_balance_nex_secondary_damage 100
 set g_balance_nex_secondary_force 600
 set g_balance_nex_secondary_refire 1.5
@@ -448,8 +489,10 @@ set g_balance_nex_charge 0
 set g_balance_nex_charge_mindmg 40
 set g_balance_nex_charge_start 0
 set g_balance_nex_charge_rate 0.1
+set g_balance_nex_charge_animlimit 0.5
 set g_balance_nex_charge_limit 0.5
 set g_balance_nex_charge_rot_rate 0
+set g_balance_nex_charge_rot_pause 0 // Dont rot down 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
@@ -568,38 +611,39 @@ 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 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
@@ -664,13 +708,13 @@ 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_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
@@ -686,7 +730,6 @@ 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
index 807a8af180860a216b2953e32aa931c3d0a39ede..547a040ae2ab0b32652f1210e10891156c603961 100644 (file)
@@ -1,13 +1,3 @@
-////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"
@@ -23,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 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"
@@ -63,7 +53,6 @@ set g_balance_nix_ammoincr_fuel 2
 // }}}
 
 // {{{ pickup items
-// Ammo caps copied from balanceFruit
 set g_pickup_ammo_anyway 0
 set g_pickup_weapons_anyway 1
 set g_pickup_shells 20
@@ -237,6 +226,7 @@ set g_balance_laser_primary_delay 0.03
 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
@@ -252,6 +242,7 @@ set g_balance_laser_secondary_delay 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
@@ -274,17 +265,33 @@ set g_balance_shotgun_secondary_refire 1.1
 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
 // }}}
@@ -328,15 +335,16 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 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
@@ -375,8 +383,8 @@ 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_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
@@ -384,6 +392,8 @@ 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_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
@@ -396,7 +406,7 @@ set g_balance_crylink_primary_damage 23
 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
@@ -404,7 +414,15 @@ set g_balance_crylink_primary_refire 0.4
 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
@@ -424,7 +442,15 @@ set g_balance_crylink_secondary_refire 0.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
@@ -432,39 +458,45 @@ set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 80
 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
@@ -579,38 +611,39 @@ set g_balance_hlac_secondary_animtime 0.3
 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
@@ -675,13 +708,13 @@ 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_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
@@ -697,7 +730,6 @@ 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
diff --git a/balanceNexSVN.cfg b/balanceNexSVN.cfg
deleted file mode 100644 (file)
index 145db5d..0000000
+++ /dev/null
@@ -1,702 +0,0 @@
-// {{{ 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
index e33fb631ec64595d8890c3fed5918a440afb8584..83a1db0a7cab6a242bc5760f354b19cb0710e4f2 100644 (file)
@@ -7,19 +7,19 @@ set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provid
 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
@@ -55,22 +55,22 @@ 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 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
@@ -84,23 +84,23 @@ set g_pickup_armorlarge 100
 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
@@ -115,18 +115,18 @@ set g_balance_health_regenlinear 5
 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
@@ -164,7 +164,7 @@ set g_projectiles_newton_style 2
 // 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
@@ -175,13 +175,13 @@ set g_projectiles_spread_style 0
 // 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
@@ -213,22 +213,23 @@ set g_balance_grapplehook_health 130
 // {{{ 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
@@ -239,22 +240,23 @@ set g_balance_laser_secondary_lifetime 30
 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
@@ -263,30 +265,46 @@ set g_balance_shotgun_secondary_refire 1.1
 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
@@ -298,13 +316,13 @@ set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 
 set g_balance_grenadelauncher_secondary_type 1
 set g_balance_grenadelauncher_secondary_damage 60
-set g_balance_grenadelauncher_secondary_edgedamage 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
@@ -312,19 +330,20 @@ set g_balance_grenadelauncher_secondary_animtime 0.3
 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
@@ -341,119 +360,143 @@ 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_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 
+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 
+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
@@ -462,72 +505,72 @@ set g_balance_minstanex_ammo 10
 // }}}
 // {{{ 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...
@@ -541,14 +584,14 @@ 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_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
 
@@ -556,7 +599,7 @@ 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_damage 20
 set g_balance_hlac_secondary_edgedamage 10
 set g_balance_hlac_secondary_force 100
 set g_balance_hlac_secondary_radius 70
@@ -568,38 +611,39 @@ 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 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
@@ -653,24 +697,24 @@ 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_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
@@ -686,7 +730,6 @@ 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
diff --git a/balanceTest.cfg b/balanceTest.cfg
deleted file mode 100644 (file)
index ba4630b..0000000
+++ /dev/null
@@ -1,703 +0,0 @@
-// {{{ 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
index 189ac077f9e01f16bce012e047fdf1f31d010fb1..1842dabd4fc62c50990ffba826fc57c647de658a 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 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"
@@ -31,12 +31,12 @@ 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 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
@@ -72,22 +72,22 @@ set g_pickup_fuel_weapon 15
 set g_pickup_fuel_jetpack 50
 set g_pickup_fuel_max 100
 set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 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
@@ -99,7 +99,7 @@ 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_weapon 10
 set g_pickup_respawntime_ammo 25
 set g_pickup_respawntimejitter_short 0
 set g_pickup_respawntimejitter_medium 0
@@ -145,7 +145,7 @@ set g_balance_fuel_limit 999
 
 // {{{ 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"
@@ -153,8 +153,8 @@ 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_throughfloor_damage 0.7
+set g_throughfloor_force 0.8
 set g_projectiles_newton_style 2
 // possible values:
 // 0: absolute velocity projectiles (like Quake)
@@ -181,7 +181,7 @@ set g_balance_falldamage_maxdamage 15
 // }}}
 
 // {{{ 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
@@ -216,16 +216,17 @@ set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
 set g_balance_laser_primary_edgedamage 20
 set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
 set g_balance_laser_primary_radius 60
-set g_balance_laser_primary_speed 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
@@ -241,14 +242,15 @@ set g_balance_laser_secondary_delay 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
@@ -263,52 +265,68 @@ set g_balance_shotgun_secondary_refire 1.1
 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
@@ -317,19 +335,20 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 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
@@ -339,24 +358,24 @@ set g_balance_minelayer_remote_edgedamage 40
 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
@@ -373,7 +392,9 @@ 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 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
@@ -381,19 +402,27 @@ set g_balance_electro_combo_comboradius 0
 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
@@ -401,80 +430,94 @@ 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 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
@@ -482,34 +525,34 @@ set g_balance_hagar_secondary_lifetime_rand 0
 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
@@ -518,7 +561,7 @@ set g_balance_portal_lifetime 15 // these get recharged whenever the portal is u
 // {{{ 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
@@ -531,7 +574,7 @@ 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_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
 // }}}
@@ -542,14 +585,14 @@ set g_balance_hlac_primary_spread_add 0.001
 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
@@ -557,49 +600,50 @@ set g_balance_hlac_secondary_spread 0.15
 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
@@ -614,7 +658,7 @@ 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_animtime 0.2
 set g_balance_fireball_primary_bfgdamage 100
 set g_balance_fireball_primary_bfgforce 0
 set g_balance_fireball_primary_bfgradius 1000
@@ -634,7 +678,7 @@ 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_animtime 0.2
 set g_balance_fireball_secondary_damage 40
 set g_balance_fireball_secondary_damageforcescale 4
 set g_balance_fireball_secondary_damagetime 5
@@ -664,16 +708,16 @@ 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_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
@@ -686,18 +730,17 @@ 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_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
index ab53f475339e2d06d2b511c3d6f01d9ea8fefde2..ed8ea42d58d687ea2a77f4e3053c2d7c9b20bd18 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 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"
@@ -57,8 +57,8 @@ 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_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
@@ -66,7 +66,7 @@ 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_cells_max 300
 set g_pickup_fuel 25
 set g_pickup_fuel_weapon 15
 set g_pickup_fuel_jetpack 50
@@ -75,10 +75,10 @@ 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_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
@@ -87,10 +87,10 @@ 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_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
@@ -99,8 +99,8 @@ 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_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
@@ -115,18 +115,18 @@ 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_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
@@ -136,15 +136,15 @@ 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_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"
@@ -176,15 +176,15 @@ set g_projectiles_spread_style 7
 // 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
@@ -212,11 +212,11 @@ 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 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
@@ -224,8 +224,9 @@ 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
+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
@@ -241,11 +242,12 @@ 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
+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
@@ -263,25 +265,41 @@ set g_balance_shotgun_secondary_refire 1.1
 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
@@ -297,9 +315,9 @@ 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_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
@@ -317,7 +335,7 @@ set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 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
@@ -325,6 +343,7 @@ 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_ammo 5
@@ -340,64 +359,73 @@ 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_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
 
@@ -414,7 +442,15 @@ 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_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
@@ -424,7 +460,7 @@ 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_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
@@ -434,7 +470,11 @@ 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_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
@@ -449,8 +489,10 @@ 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_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
@@ -462,14 +504,14 @@ 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_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
@@ -483,22 +525,22 @@ 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
+// {{{ 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
@@ -546,7 +588,7 @@ 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_speed 15000
 set g_balance_hlac_primary_lifetime 3
 
 set g_balance_hlac_primary_refire 0.1
@@ -561,45 +603,47 @@ 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_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
@@ -615,7 +659,7 @@ 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_bfgdamage 150
 set g_balance_fireball_primary_bfgforce 0
 set g_balance_fireball_primary_bfgradius 1000
 set g_balance_fireball_primary_damage 200
@@ -664,14 +708,13 @@ 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_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
@@ -687,19 +730,17 @@ 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_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
diff --git a/check-translations.sh b/check-translations.sh
new file mode 100755 (executable)
index 0000000..6cfd13d
--- /dev/null
@@ -0,0 +1,30 @@
+#!/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
diff --git a/csprogs.dat.de.po.disabled b/csprogs.dat.de.po.disabled
new file mode 100644 (file)
index 0000000..495744c
--- /dev/null
@@ -0,0 +1,1446 @@
+# 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"
index c0dce41e134e5c73fad86305edbac252e5486451..4aacf09f1cff3d7c049302aacfc546330896f0d8 100644 (file)
@@ -15,7 +15,7 @@ set g_weaponreplace_porto ""
 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
index 37aee96d07a9f96acdff42e9cccfae4441f29119..b8a5ce7a17658bd11f6a50107cde738c5d8aaaf7 100644 (file)
@@ -1,22 +1,31 @@
+// 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
index 2e26355e7096a7bd332e8a46d9137f350dffade4..d038dc523c1df5762333a6c82066c39f789511e4 100644 (file)
@@ -9,6 +9,7 @@
 //
 // 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
@@ -25,6 +26,9 @@ 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" ""
@@ -85,150 +89,121 @@ alias movetoteam_auto "sv_cmd movetoteam $1 auto"
 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"
@@ -292,10 +267,18 @@ cl_followmodel_up_lowpass 10 "gun following upward lowpass in 1/s"
 
 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
@@ -309,7 +292,7 @@ seta cl_autotaunt 0 "automatically taunt enemies when fragging them"
 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"
@@ -321,7 +304,8 @@ set sv_ready_restart 0 "if set to 1 allow a map to be restarted once all players
 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)"
@@ -390,7 +374,7 @@ seta sv_precacheitems 0
 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
@@ -408,26 +392,8 @@ sv_jumpstep 1 // step up stairs while jumping, makes it easier to reach ledges
 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"
@@ -441,37 +407,37 @@ seta bot_suffix ""        "Suffix behind the bot names"
 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"
@@ -499,8 +465,9 @@ alias g_waypointeditor_unreachable "impulse 107"
 
 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"
@@ -521,11 +488,11 @@ set g_minstagib_extralives 2      "how many extra lives you will get per powerup"
 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"
@@ -601,6 +568,15 @@ seta g_nexball_goalleadlimit -1 "Nexball goal lead limit overriding the mapinfo
 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
@@ -610,36 +586,56 @@ set g_respawn_waves 0 "respawn in waves (every n seconds), intended to decrease
 // 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"
@@ -649,11 +645,14 @@ seta timelimit_suddendeath 5 "number of minutes suddendeath mode lasts after all
 // 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"
@@ -747,12 +746,9 @@ set g_balance_rune_regen_combo_limitmod                    1
 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"
@@ -792,10 +788,10 @@ set g_ca_warmup 10 "how long the players will have time to run around the map be
 
 // 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
@@ -848,7 +844,7 @@ set g_nexball_basketball_delay_hold           20    "time before a player who ca
 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"
@@ -883,7 +879,7 @@ r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team m
 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
@@ -935,7 +931,6 @@ sv_sound_watersplash ""
 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
@@ -951,8 +946,6 @@ alias +fire2 +button3
 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}"
@@ -966,6 +959,12 @@ alias _weapprev_1 "impulse 16"
 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
@@ -1094,8 +1093,8 @@ alias vstop "cmd vote stop"
 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"
 
@@ -1148,7 +1147,7 @@ set quit_and_redirect ""  "set to an IP to redirect all players at the end of the
 // 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
@@ -1158,14 +1157,14 @@ alias singleplayer_continue "set scmenu_campaign_goto -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
 
@@ -1280,6 +1279,30 @@ set g_balance_keyhunt_damageforcescale 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"
 
@@ -1375,19 +1398,18 @@ seta sbar_info_pos 0 "Y-axis distance from lower right corner for engine info pr
 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"
@@ -1408,12 +1430,38 @@ seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_ch
 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"
@@ -1431,6 +1479,11 @@ seta scoreboard_offset_left 0.04 "how many pixels the scoreboard is offset from
 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"
@@ -1439,7 +1492,7 @@ set menu_slist_modfilter "=" // set to either: !modname or modname. modname of =
 // 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
@@ -1451,8 +1504,8 @@ set timelimit_increment 5
 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
@@ -1508,7 +1561,8 @@ sv_gameplayfix_q2airaccelerate 1
 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
@@ -1558,9 +1612,6 @@ set capturelimit 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
@@ -1572,12 +1623,12 @@ set g_jump_grunt 0      "Do you make a grunting noise every time you jump? Is it the
 
 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"
@@ -1596,7 +1647,7 @@ if_dedicated set g_start_delay 15 "delay before the game starts, so everyone can
 
 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"
@@ -1614,7 +1665,6 @@ set cl_handicap 1 "the higher, the more damage you will receive (client setting)
 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
@@ -1696,7 +1746,7 @@ set camera_speed_roll             0.9     "Camera rotation speed"
 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"
@@ -1707,6 +1757,7 @@ seta sv_gentle 0          "force gentle mode for everyone, also remove references to act
 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"
@@ -1721,7 +1772,7 @@ seta cl_showspeed_position 0.7 "Y-axis positioning of the numbers"
 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"
@@ -1783,6 +1834,8 @@ alias cl_hook_gamestart_as
 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
 
@@ -1803,6 +1856,8 @@ alias sv_hook_gamestart_as
 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
 
@@ -1833,8 +1888,7 @@ set g_triggerimpulse_radial_multiplier 1 "trigger_impulse radial field multiplie
 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"
 
@@ -1881,9 +1935,6 @@ collision_endposnudge 1
 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
@@ -1928,7 +1979,7 @@ set g_weaponreplace_porto ""
 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 ""
@@ -1953,11 +2004,15 @@ scr_conscroll_y -0.3
 
 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
@@ -1989,7 +2044,7 @@ utf8_enable 1
 // 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)"
@@ -1997,6 +2052,8 @@ set cl_db_saveasdump 0 "write client.db in dump format (loads slower, easier to
 
 // 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
@@ -2011,11 +2068,40 @@ mod_q3shader_default_polygonfactor 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
@@ -2023,3 +2109,7 @@ exec _hud_descriptions.cfg
 // 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 $*"
diff --git a/demos/the-big-keybench.dem b/demos/the-big-keybench.dem
new file mode 100644 (file)
index 0000000..6f6aced
Binary files /dev/null and b/demos/the-big-keybench.dem differ
index 9529ebecc84f6ab943ba4fe2712014a46ae85b02..bb44e5b4dab208995bc03d9cf732b718cfb8d59b 100644 (file)
@@ -240,7 +240,7 @@ alpha 256 256 0
 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
@@ -251,7 +251,7 @@ originjitter 0 0 0
 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
@@ -262,7 +262,7 @@ originjitter 0 0 0
 velocityjitter 0 0 0
 // bouncing sparks
 effect TE_GUNSHOT
-count 5
+count 2.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -1022,7 +1022,7 @@ effect shotgun_impact
 type alphastatic
 notunderwater
 tex 0 8
-count 3
+count 1
 size 10 20
 sizeincrease 25
 alpha 300 550 756
@@ -1036,7 +1036,7 @@ effect shotgun_impact
 type alphastatic
 notunderwater
 tex 36 36
-count 0.5
+count 0.2
 size 10 11
 sizeincrease 74
 alpha 200 350 500
@@ -1049,7 +1049,7 @@ rotate 0 360 -50 50
 // sparks
 effect shotgun_impact
 notunderwater
-count 1.5
+count 0.5
 type spark
 tex 40 40
 color 0xFDFFD9 0xFDFFD9
@@ -1110,7 +1110,7 @@ effect machinegun_impact
 type alphastatic
 notunderwater
 tex 0 8
-count 3
+count 1.5
 size 10 20
 sizeincrease 15
 alpha 300 550 456
@@ -1134,7 +1134,7 @@ color 0x201d1a 0x000000
 bounce 6
 velocitymultiplier 0.03
 rotate 0 360 -50 50
-//derbis
+//debris
 effect machinegun_impact
 type alphastatic
 notunderwater
@@ -1985,7 +1985,7 @@ lightcolor 8 4 1
 // fire effect which make bright dot inside
 effect hagar_explode
 notunderwater
-count 5
+count 3.5
 type smoke
 tex 48 55
 color 0xffe955 0xff5a00
@@ -2018,7 +2018,7 @@ effect hagar_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 10
+count 7
 size 20 40
 sizeincrease 20
 alpha 200 500 600
@@ -4694,8 +4694,6 @@ bounce 1.5
 liquidfriction 4
 velocityjitter 16 16 16
 
-
-
 // rocket guiding start
 // underwater bubbles
 effect rocket_guide
@@ -5062,54 +5060,137 @@ gravity 1.3
 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
index 7b7358cd9465a44d08f018fc1db32869eb5cdfb9..e4d9632bcb458ec751958fe75220fe5da22a060e 100644 (file)
@@ -7,6 +7,7 @@ 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
index 79d56951f4d6c6a4dea4bc1246568dd4a28505ab..0c3fef95b8cd4524e1052a0d23444a01a93fe9e2 100644 (file)
@@ -7,6 +7,7 @@ gl_texture_anisotropy 1
 mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
+r_coronas_occlusionquery 0
 r_damageblur 0
 r_depthfirst 0
 r_drawdecals_drawdistance 200
index 0914dac6006e2bea3f955f9ebe52e6b40765141d..5b9ea85f39f48e75ee90ce96188460fe7655b629 100644 (file)
@@ -7,6 +7,7 @@ gl_texture_anisotropy 1
 mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
+r_coronas_occlusionquery 0
 r_damageblur 0
 r_depthfirst 0
 r_drawdecals_drawdistance 300
index 02796ca30aaeb92f043db6f6f68c7d9c2def3429..1ee62d057729f09d4eb04be9082c675c1cfdeff8 100644 (file)
@@ -7,6 +7,7 @@ gl_texture_anisotropy 1
 mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
+r_coronas_occlusionquery 0
 r_damageblur 0
 r_depthfirst 1
 r_drawdecals_drawdistance 300
index cf105ba2b4442b0e33da44ca406180f641dadd3e..ffd5af713e2fae60aa7942b7a4e1a017a6d0018b 100644 (file)
@@ -7,6 +7,7 @@ gl_texture_anisotropy 1
 mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
+r_coronas_occlusionquery 0
 r_damageblur 0
 r_depthfirst 0
 r_drawdecals_drawdistance 100
index f6e002ba6d1d69d19423656a818c4fcb0278ddb0..e7a2efb3f1a0c368448853ae2ae779b037f24317 100644 (file)
@@ -2,11 +2,12 @@ cl_decals 1
 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
index e9f7b0cc76d33fe7cda7f4327dd308d20290622b..218565408d372a4d3647ab023060e95b42d51575 100644 (file)
@@ -2,11 +2,12 @@ cl_decals 1
 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
diff --git a/fixbalance.sh b/fixbalance.sh
new file mode 100755 (executable)
index 0000000..cfc6cc0
--- /dev/null
@@ -0,0 +1,13 @@
+#!/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
diff --git a/gfx/blood.tga b/gfx/blood.tga
new file mode 100644 (file)
index 0000000..34c3d83
Binary files /dev/null and b/gfx/blood.tga differ
index 8d8741b5207cb5f3fa6cb654394db763a42ba48c..143a372f8c4ea9dec113759d80f93147d577f518 100644 (file)
Binary files a/gfx/crosshairdot.tga and b/gfx/crosshairdot.tga differ
index 884e9f03a373f4d201a8d4470e351bc0de703c2c..30e9bf3c839c4889964c128132d4da1a3221c231 100644 (file)
Binary files a/gfx/crosshairlaser.tga and b/gfx/crosshairlaser.tga differ
index ba1b7b17ae8908e02cd59dd2a7e7a11afbe58491..e77996d979c02adc8a09f127d07002dded217607 100644 (file)
Binary files a/gfx/crosshairrocketlauncher.tga and b/gfx/crosshairrocketlauncher.tga differ
diff --git a/gfx/hud/default/keepawayball_carrying.tga b/gfx/hud/default/keepawayball_carrying.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/default/keepawayball_carrying.tga differ
diff --git a/gfx/hud/default/notify_balldropped.tga b/gfx/hud/default/notify_balldropped.tga
new file mode 100644 (file)
index 0000000..7300a15
Binary files /dev/null and b/gfx/hud/default/notify_balldropped.tga differ
diff --git a/gfx/hud/default/notify_ballpickedup.tga b/gfx/hud/default/notify_ballpickedup.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/default/notify_ballpickedup.tga differ
diff --git a/gfx/hud/default/weaponcampingrifle.tga b/gfx/hud/default/weaponcampingrifle.tga
deleted file mode 100644 (file)
index f5c2e55..0000000
Binary files a/gfx/hud/default/weaponcampingrifle.tga and /dev/null differ
index 3fbccf9dee9f9d50f81982e9386e2f4dd17fa74e..4e31286157bb35c26cff8eb725df1f82117246fb 100644 (file)
Binary files a/gfx/hud/default/weaponminelayer.tga and b/gfx/hud/default/weaponminelayer.tga differ
diff --git a/gfx/hud/default/weaponsniperrifle.tga b/gfx/hud/default/weaponsniperrifle.tga
new file mode 100644 (file)
index 0000000..f5c2e55
Binary files /dev/null and b/gfx/hud/default/weaponsniperrifle.tga differ
diff --git a/gfx/hud/luminos/keepawayball_carrying.tga b/gfx/hud/luminos/keepawayball_carrying.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/luminos/keepawayball_carrying.tga differ
diff --git a/gfx/hud/luminos/notify_balldropped.tga b/gfx/hud/luminos/notify_balldropped.tga
new file mode 100644 (file)
index 0000000..7300a15
Binary files /dev/null and b/gfx/hud/luminos/notify_balldropped.tga differ
diff --git a/gfx/hud/luminos/notify_ballpickedup.tga b/gfx/hud/luminos/notify_ballpickedup.tga
new file mode 100644 (file)
index 0000000..9a63c35
Binary files /dev/null and b/gfx/hud/luminos/notify_ballpickedup.tga differ
diff --git a/gfx/hud/luminos/weaponcampingrifle.tga b/gfx/hud/luminos/weaponcampingrifle.tga
deleted file mode 100644 (file)
index f5c2e55..0000000
Binary files a/gfx/hud/luminos/weaponcampingrifle.tga and /dev/null differ
index 3fbccf9dee9f9d50f81982e9386e2f4dd17fa74e..4e31286157bb35c26cff8eb725df1f82117246fb 100644 (file)
Binary files a/gfx/hud/luminos/weaponminelayer.tga and b/gfx/hud/luminos/weaponminelayer.tga differ
diff --git a/gfx/hud/luminos/weaponsniperrifle.tga b/gfx/hud/luminos/weaponsniperrifle.tga
new file mode 100644 (file)
index 0000000..f5c2e55
Binary files /dev/null and b/gfx/hud/luminos/weaponsniperrifle.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_bullets.tga b/gfx/hud/luminos_xhair/ammo_bullets.tga
new file mode 100644 (file)
index 0000000..8e2783c
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_bullets.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_cells.tga b/gfx/hud/luminos_xhair/ammo_cells.tga
new file mode 100644 (file)
index 0000000..3735acd
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_cells.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_current_bg.tga b/gfx/hud/luminos_xhair/ammo_current_bg.tga
new file mode 100644 (file)
index 0000000..8b41e0f
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_current_bg.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_rockets.tga b/gfx/hud/luminos_xhair/ammo_rockets.tga
new file mode 100644 (file)
index 0000000..de61d5a
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_rockets.tga differ
diff --git a/gfx/hud/luminos_xhair/ammo_shells.tga b/gfx/hud/luminos_xhair/ammo_shells.tga
new file mode 100644 (file)
index 0000000..fd70b43
Binary files /dev/null and b/gfx/hud/luminos_xhair/ammo_shells.tga differ
diff --git a/gfx/hud/luminos_xhair/border_healtharmor.tga b/gfx/hud/luminos_xhair/border_healtharmor.tga
new file mode 100644 (file)
index 0000000..ab30e14
Binary files /dev/null and b/gfx/hud/luminos_xhair/border_healtharmor.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_ammo.tga b/gfx/hud/luminos_xhair/progressbar_ammo.tga
new file mode 100644 (file)
index 0000000..9db210f
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_ammo.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga b/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga
new file mode 100644 (file)
index 0000000..0eb2972
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_armor_vertical.tga differ
diff --git a/gfx/hud/luminos_xhair/progressbar_health_vertical.tga b/gfx/hud/luminos_xhair/progressbar_health_vertical.tga
new file mode 100644 (file)
index 0000000..1bfe49b
Binary files /dev/null and b/gfx/hud/luminos_xhair/progressbar_health_vertical.tga differ
diff --git a/gfx/hud/old/weaponcampingrifle.tga b/gfx/hud/old/weaponcampingrifle.tga
deleted file mode 100644 (file)
index 09da559..0000000
Binary files a/gfx/hud/old/weaponcampingrifle.tga and /dev/null differ
index 444247ffd7ea788493b0b82f6c24bb6eec0f707d..0c82a484158e5b02637e5e25e643bfba32056f37 100644 (file)
Binary files a/gfx/hud/old/weaponminelayer.tga and b/gfx/hud/old/weaponminelayer.tga differ
diff --git a/gfx/hud/old/weaponsniperrifle.tga b/gfx/hud/old/weaponsniperrifle.tga
new file mode 100644 (file)
index 0000000..09da559
Binary files /dev/null and b/gfx/hud/old/weaponsniperrifle.tga differ
index 2b6e22ce76fb1ba1ebfa8009a4cc5abb435f4be1..44ebb5294a7921b0f8e52f86753a6dcc7d0b0dbc 100644 (file)
Binary files a/gfx/loading.tga and b/gfx/loading.tga differ
diff --git a/gfx/menu/default/icon_ipv4.tga b/gfx/menu/default/icon_ipv4.tga
new file mode 100644 (file)
index 0000000..a0484f4
Binary files /dev/null and b/gfx/menu/default/icon_ipv4.tga differ
diff --git a/gfx/menu/default/icon_ipv6.tga b/gfx/menu/default/icon_ipv6.tga
new file mode 100644 (file)
index 0000000..d3fdc03
Binary files /dev/null and b/gfx/menu/default/icon_ipv6.tga differ
index 8e0f548a707932eeb0451686eb765d6917e43d08..b2b0a97008db10893fac7592b3a5132c4d0bae09 100755 (executable)
@@ -174,7 +174,7 @@ COLOR_DIALOG_USERBIND           '1 1 1'
 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'
 
index 4f0b00157df434b9582071b436ffed2ff68b2a96..f94884483987e7133d11eb4bfd06477248720fd0 100644 (file)
Binary files a/gfx/menu/luminos/checkbox_d0.tga and b/gfx/menu/luminos/checkbox_d0.tga differ
index 5f19b3caa0019f45f45856e7ef992f3aaf4a582b..c04496827e11423beeb305a2cbf804eeb3d6a25f 100644 (file)
Binary files a/gfx/menu/luminos/checkbox_f0.tga and b/gfx/menu/luminos/checkbox_f0.tga differ
index c062f31c0e77c0a0b0062b7a5d280d04cb624124..b0efdda8380af4a3917399988459bba8d24e6c5b 100644 (file)
Binary files a/gfx/menu/luminos/checkbox_n0.tga and b/gfx/menu/luminos/checkbox_n0.tga differ
diff --git a/gfx/menu/luminos/icon_ipv4.tga b/gfx/menu/luminos/icon_ipv4.tga
new file mode 100644 (file)
index 0000000..a0484f4
Binary files /dev/null and b/gfx/menu/luminos/icon_ipv4.tga differ
diff --git a/gfx/menu/luminos/icon_ipv6.tga b/gfx/menu/luminos/icon_ipv6.tga
new file mode 100644 (file)
index 0000000..d3fdc03
Binary files /dev/null and b/gfx/menu/luminos/icon_ipv6.tga differ
index 9cb2b59266c4e507d98922d77e21c84c7c6c4b13..21944b67a8c17bb7c818a1c00f38b67e8d250532 100755 (executable)
@@ -174,7 +174,7 @@ COLOR_DIALOG_USERBIND           '1 1 1'
 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'
 
diff --git a/gfx/menu/xaw/colorpicker_selected.tga b/gfx/menu/xaw/colorpicker_selected.tga
new file mode 100644 (file)
index 0000000..605e932
Binary files /dev/null and b/gfx/menu/xaw/colorpicker_selected.tga differ
diff --git a/gfx/menu/xaw/icon_ipv4.tga b/gfx/menu/xaw/icon_ipv4.tga
new file mode 100644 (file)
index 0000000..a0484f4
Binary files /dev/null and b/gfx/menu/xaw/icon_ipv4.tga differ
diff --git a/gfx/menu/xaw/icon_ipv6.tga b/gfx/menu/xaw/icon_ipv6.tga
new file mode 100644 (file)
index 0000000..d3fdc03
Binary files /dev/null and b/gfx/menu/xaw/icon_ipv6.tga differ
index 666b971c23d9d032da0bf6646cdfcc401b2eaba3..eae123ce79fa059b02987416f594302d08d96c63 100644 (file)
@@ -29,7 +29,7 @@ COLOR_DIALOG_USERBIND           '1 1 1'
 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'
 
index ecfc84ec2ca710410a990a73eec1b56d2877d377..b47423748ea6d0358ec0df02e22c212d95aab492 100644 (file)
Binary files a/gfx/net.tga and b/gfx/net.tga differ
index 70bb566cdf82e63e4e37fd3b46c346ff517a3731..c713a85714322ce5b3953e0592baa28f2fbc3dc3 100644 (file)
Binary files a/gfx/winner.tga and b/gfx/winner.tga differ
index e556db70e974071a47a2c3916e6352a631ad5e7c..42d8379c5514dd9c7ee9fa579571936f3200267a 100644 (file)
@@ -13,7 +13,7 @@ seta cl_swapattacks_tuba 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
index 5660da4b77ec091272aa5069b822de6357af7f5b..ca8ea38de05476976feaf3a64b31755697d7cd44 100644 (file)
@@ -45,6 +45,8 @@ 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 "3"
+seta hud_panel_weapons_timeout_effect "1"
 
 seta hud_panel_ammo 1
 seta hud_panel_ammo_pos "0.190000 0.920000"
@@ -57,6 +59,10 @@ 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.660000 0.940000"
@@ -71,6 +77,9 @@ seta hud_panel_powerups_flip "1"
 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"
@@ -81,10 +90,13 @@ 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 ""
-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"
@@ -96,6 +108,7 @@ seta hud_panel_notify_bg_alpha ""
 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
@@ -108,7 +121,7 @@ seta hud_panel_timer_bg_alpha ""
 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 ""
@@ -181,7 +194,7 @@ seta hud_panel_chat_bg_alpha ""
 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"
diff --git a/hud_luminos_minimal.cfg b/hud_luminos_minimal.cfg
new file mode 100644 (file)
index 0000000..fef69f2
--- /dev/null
@@ -0,0 +1,218 @@
+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
diff --git a/hud_luminos_xhair_minimal.cfg b/hud_luminos_xhair_minimal.cfg
new file mode 100644 (file)
index 0000000..80fe445
--- /dev/null
@@ -0,0 +1,217 @@
+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
index 93e8c99591f6ddd6cae1ad6d64b832e35a7e2dfd..cfa50af89acb4dd8add91079c3c9cfcc7a886954 100644 (file)
@@ -45,6 +45,8 @@ 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.160000 0.910000"
@@ -57,6 +59,10 @@ 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.660000 0.910000"
@@ -71,6 +77,9 @@ seta hud_panel_powerups_flip "1"
 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"
@@ -81,10 +90,13 @@ 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 ""
-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"
@@ -96,6 +108,7 @@ seta hud_panel_notify_bg_alpha "0"
 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
@@ -181,7 +194,7 @@ seta hud_panel_chat_bg_alpha ""
 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"
index 028547ac27ac68b76f66c1c3696228247888e659..56ff29d76685d0a2a16f2a11f24d44d477cde172 100644 (file)
 "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"
diff --git a/keybinds.txt.de b/keybinds.txt.de
new file mode 100644 (file)
index 0000000..6f2c78b
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "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"
diff --git a/keybinds.txt.fr b/keybinds.txt.fr
new file mode 100644 (file)
index 0000000..c5cb242
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "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"
diff --git a/keybinds.txt.ru b/keybinds.txt.ru
new file mode 100644 (file)
index 0000000..ed46d02
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "Движение"
+"+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"
diff --git a/languages.txt b/languages.txt
new file mode 100644 (file)
index 0000000..bea59d3
--- /dev/null
@@ -0,0 +1,10 @@
+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"
diff --git a/menu.dat.de.po b/menu.dat.de.po
new file mode 100644 (file)
index 0000000..eab0ff0
--- /dev/null
@@ -0,0 +1,2767 @@
+# 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"
diff --git a/menu.dat.fi.po b/menu.dat.fi.po
new file mode 100644 (file)
index 0000000..3e39c97
--- /dev/null
@@ -0,0 +1,2775 @@
+# 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:"
diff --git a/menu.dat.fr.po b/menu.dat.fr.po
new file mode 100644 (file)
index 0000000..72dd5c7
--- /dev/null
@@ -0,0 +1,2784 @@
+# 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"
diff --git a/menu.dat.hu.po b/menu.dat.hu.po
new file mode 100644 (file)
index 0000000..d604e37
--- /dev/null
@@ -0,0 +1,2775 @@
+# 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"
diff --git a/menu.dat.nl.po b/menu.dat.nl.po
new file mode 100644 (file)
index 0000000..79eb878
--- /dev/null
@@ -0,0 +1,2762 @@
+# 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"
diff --git a/menu.dat.pt.po b/menu.dat.pt.po
new file mode 100644 (file)
index 0000000..d5c1119
--- /dev/null
@@ -0,0 +1,2828 @@
+# 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"
diff --git a/menu.dat.ro.po b/menu.dat.ro.po
new file mode 100644 (file)
index 0000000..0703f79
--- /dev/null
@@ -0,0 +1,2825 @@
+# 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"
diff --git a/menu.dat.ru.po b/menu.dat.ru.po
new file mode 100644 (file)
index 0000000..3c3ef48
--- /dev/null
@@ -0,0 +1,2772 @@
+# 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"
diff --git a/menu.dat.se.po b/menu.dat.se.po
new file mode 100644 (file)
index 0000000..7494655
--- /dev/null
@@ -0,0 +1,2776 @@
+# 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 ""
diff --git a/merge-settings-into-cfg.pl b/merge-settings-into-cfg.pl
deleted file mode 100644 (file)
index 3f2d5fa..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/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;
diff --git a/models/ctf/banner_blue.tga b/models/ctf/banner_blue.tga
new file mode 100644 (file)
index 0000000..8b95589
Binary files /dev/null and b/models/ctf/banner_blue.tga differ
diff --git a/models/ctf/banner_blue_gloss.tga b/models/ctf/banner_blue_gloss.tga
new file mode 100644 (file)
index 0000000..77168a8
Binary files /dev/null and b/models/ctf/banner_blue_gloss.tga differ
diff --git a/models/ctf/banner_red.tga b/models/ctf/banner_red.tga
new file mode 100644 (file)
index 0000000..a64aa36
Binary files /dev/null and b/models/ctf/banner_red.tga differ
diff --git a/models/ctf/banner_red_gloss.tga b/models/ctf/banner_red_gloss.tga
new file mode 100644 (file)
index 0000000..77168a8
Binary files /dev/null and b/models/ctf/banner_red_gloss.tga differ
diff --git a/models/ctf/flag_blue.tga b/models/ctf/flag_blue.tga
new file mode 100644 (file)
index 0000000..63feddd
Binary files /dev/null and b/models/ctf/flag_blue.tga differ
diff --git a/models/ctf/flag_blue_gloss.tga b/models/ctf/flag_blue_gloss.tga
new file mode 100644 (file)
index 0000000..3e92985
Binary files /dev/null and b/models/ctf/flag_blue_gloss.tga differ
diff --git a/models/ctf/flag_blue_glow.tga b/models/ctf/flag_blue_glow.tga
new file mode 100644 (file)
index 0000000..8605da1
Binary files /dev/null and b/models/ctf/flag_blue_glow.tga differ
diff --git a/models/ctf/flag_blue_norm.tga b/models/ctf/flag_blue_norm.tga
new file mode 100644 (file)
index 0000000..07d5e17
Binary files /dev/null and b/models/ctf/flag_blue_norm.tga differ
diff --git a/models/ctf/flag_red.tga b/models/ctf/flag_red.tga
new file mode 100644 (file)
index 0000000..63feddd
Binary files /dev/null and b/models/ctf/flag_red.tga differ
diff --git a/models/ctf/flag_red_gloss.tga b/models/ctf/flag_red_gloss.tga
new file mode 100644 (file)
index 0000000..3e92985
Binary files /dev/null and b/models/ctf/flag_red_gloss.tga differ
diff --git a/models/ctf/flag_red_glow.tga b/models/ctf/flag_red_glow.tga
new file mode 100644 (file)
index 0000000..dfe90a4
Binary files /dev/null and b/models/ctf/flag_red_glow.tga differ
diff --git a/models/ctf/flag_red_norm.tga b/models/ctf/flag_red_norm.tga
new file mode 100644 (file)
index 0000000..07d5e17
Binary files /dev/null and b/models/ctf/flag_red_norm.tga differ
index 5d91c7ad652848fb43c814eca8b5bcdf2d66f7c9..86d232c6c4070531b9fdb8a96f30cc22b2a4b9a6 100644 (file)
Binary files a/models/ctf/flags.md3 and b/models/ctf/flags.md3 differ
diff --git a/models/ctf/flags.md3.framegroups b/models/ctf/flags.md3.framegroups
new file mode 100644 (file)
index 0000000..05a4991
--- /dev/null
@@ -0,0 +1 @@
+0 50 5 1
\ No newline at end of file
index 05a4fe72fc5955dfe55a03b29dd5ce6cc0d44b85..489df22f419006fee5bb41eb28961d01467802d7 100644 (file)
@@ -1,3 +1,3 @@
-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
index 02f217f36abf28de8af0c36f6d5dab9ec9e60360..47c5aeb71f53e85d6ae55a5b2ce35a019e57791f 100644 (file)
@@ -1,3 +1,3 @@
-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
diff --git a/models/ctf/glow_blue.tga b/models/ctf/glow_blue.tga
new file mode 100644 (file)
index 0000000..6968dc2
Binary files /dev/null and b/models/ctf/glow_blue.tga differ
diff --git a/models/ctf/glow_blue_glow.tga b/models/ctf/glow_blue_glow.tga
new file mode 100644 (file)
index 0000000..6968dc2
Binary files /dev/null and b/models/ctf/glow_blue_glow.tga differ
diff --git a/models/ctf/glow_red.tga b/models/ctf/glow_red.tga
new file mode 100644 (file)
index 0000000..9702b0b
Binary files /dev/null and b/models/ctf/glow_red.tga differ
diff --git a/models/ctf/glow_red_glow.tga b/models/ctf/glow_red_glow.tga
new file mode 100644 (file)
index 0000000..9702b0b
Binary files /dev/null and b/models/ctf/glow_red_glow.tga differ
index 02fd59d3a7dd34e6760d5e170317ec435055b526..ce62d46b5deff4be1df1a1c3d0ce77841f47996a 100644 (file)
Binary files a/models/elaser.mdl and b/models/elaser.mdl differ
index 8ae609a06b38c1553bd3b7a209d930d0846b9a37..a1be45958efea2ae93b772f0188f03df5e1d783a 100644 (file)
Binary files a/models/hlac_bullet.md3 and b/models/hlac_bullet.md3 differ
diff --git a/models/ice/ice.md3 b/models/ice/ice.md3
new file mode 100644 (file)
index 0000000..fc5cad6
Binary files /dev/null and b/models/ice/ice.md3 differ
diff --git a/models/ice/ice.tga b/models/ice/ice.tga
new file mode 100644 (file)
index 0000000..87e95b3
Binary files /dev/null and b/models/ice/ice.tga differ
diff --git a/models/ice/ice_gloss.tga b/models/ice/ice_gloss.tga
new file mode 100644 (file)
index 0000000..9841865
Binary files /dev/null and b/models/ice/ice_gloss.tga differ
diff --git a/models/ice/ice_glow.tga b/models/ice/ice_glow.tga
new file mode 100644 (file)
index 0000000..7e4c972
Binary files /dev/null and b/models/ice/ice_glow.tga differ
diff --git a/models/ice/ice_norm.tga b/models/ice/ice_norm.tga
new file mode 100644 (file)
index 0000000..051af66
Binary files /dev/null and b/models/ice/ice_norm.tga differ
diff --git a/models/ice/ice_reflect.tga b/models/ice/ice_reflect.tga
new file mode 100644 (file)
index 0000000..1f82c2a
Binary files /dev/null and b/models/ice/ice_reflect.tga differ
diff --git a/models/ice/iceshard.md3 b/models/ice/iceshard.md3
new file mode 100644 (file)
index 0000000..82728cb
Binary files /dev/null and b/models/ice/iceshard.md3 differ
index c3a5d99e06304e69d71e5a678e046620685ec29a..8809d164557ac8fd8c0a2a4132ed2e0930245eb2 100644 (file)
Binary files a/models/laser.mdl and b/models/laser.mdl differ
index 7758e3e0f3e134e34a90504bc862604a393faf88..0af95286683444390b22ff10826d2d453d1ed700 100644 (file)
Binary files a/models/mine.md3 and b/models/mine.md3 differ
diff --git a/models/orbs/orbblue.md3 b/models/orbs/orbblue.md3
new file mode 100644 (file)
index 0000000..ac412e5
Binary files /dev/null and b/models/orbs/orbblue.md3 differ
diff --git a/models/orbs/orbblue.tga b/models/orbs/orbblue.tga
new file mode 100644 (file)
index 0000000..325577f
Binary files /dev/null and b/models/orbs/orbblue.tga differ
diff --git a/models/orbs/orbblue_glow.tga b/models/orbs/orbblue_glow.tga
new file mode 100644 (file)
index 0000000..d06af31
Binary files /dev/null and b/models/orbs/orbblue_glow.tga differ
diff --git a/models/orbs/orbpink.md3 b/models/orbs/orbpink.md3
new file mode 100644 (file)
index 0000000..c6844d2
Binary files /dev/null and b/models/orbs/orbpink.md3 differ
diff --git a/models/orbs/orbpink.tga b/models/orbs/orbpink.tga
new file mode 100644 (file)
index 0000000..9dad41a
Binary files /dev/null and b/models/orbs/orbpink.tga differ
diff --git a/models/orbs/orbpink_glow.tga b/models/orbs/orbpink_glow.tga
new file mode 100644 (file)
index 0000000..5f90638
Binary files /dev/null and b/models/orbs/orbpink_glow.tga differ
diff --git a/models/orbs/orbred.md3 b/models/orbs/orbred.md3
new file mode 100644 (file)
index 0000000..041973a
Binary files /dev/null and b/models/orbs/orbred.md3 differ
diff --git a/models/orbs/orbred.tga b/models/orbs/orbred.tga
new file mode 100644 (file)
index 0000000..ffb352e
Binary files /dev/null and b/models/orbs/orbred.tga differ
diff --git a/models/orbs/orbred_glow.tga b/models/orbs/orbred_glow.tga
new file mode 100644 (file)
index 0000000..142092f
Binary files /dev/null and b/models/orbs/orbred_glow.tga differ
diff --git a/models/orbs/orbyellow.md3 b/models/orbs/orbyellow.md3
new file mode 100644 (file)
index 0000000..ca63a33
Binary files /dev/null and b/models/orbs/orbyellow.md3 differ
diff --git a/models/orbs/orbyellow.tga b/models/orbs/orbyellow.tga
new file mode 100644 (file)
index 0000000..64b61f7
Binary files /dev/null and b/models/orbs/orbyellow.tga differ
diff --git a/models/orbs/orbyellow_glow.tga b/models/orbs/orbyellow_glow.tga
new file mode 100644 (file)
index 0000000..9e0597b
Binary files /dev/null and b/models/orbs/orbyellow_glow.tga differ
index 59dcdb9cdc5c23a7dce98bc4017fdb131c9b7694..5669bc4cc58d3f218688ab0a708a496af6b46ee6 100644 (file)
Binary files a/models/plasmatrail.mdl and b/models/plasmatrail.mdl differ
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
diff --git a/models/player/erebus.iqm_0.skin b/models/player/erebus.iqm_0.skin
new file mode 100644 (file)
index 0000000..81c4f3b
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebus
+erebus.001,shadowhead
diff --git a/models/player/erebus.iqm_1.skin b/models/player/erebus.iqm_1.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
diff --git a/models/player/erebus.iqm_1.sounds b/models/player/erebus.iqm_1.sounds
new file mode 100644 (file)
index 0000000..a97a073
--- /dev/null
@@ -0,0 +1,32 @@
+//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
diff --git a/models/player/erebus.iqm_1.tga b/models/player/erebus.iqm_1.tga
new file mode 100644 (file)
index 0000000..bf151b5
Binary files /dev/null and b/models/player/erebus.iqm_1.tga differ
diff --git a/models/player/erebus.iqm_1.txt b/models/player/erebus.iqm_1.txt
new file mode 100644 (file)
index 0000000..7b8389b
--- /dev/null
@@ -0,0 +1,7 @@
+name Glowing Erebus
+species human
+sex Male
+weight 106
+age 26
+
+Heavyweight Xonotic Solider with LEDs
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
diff --git a/models/player/erebus_lod1.iqm_0.skin b/models/player/erebus_lod1.iqm_0.skin
new file mode 100644 (file)
index 0000000..81c4f3b
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebus
+erebus.001,shadowhead
diff --git a/models/player/erebus_lod1.iqm_1.skin b/models/player/erebus_lod1.iqm_1.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
diff --git a/models/player/erebus_lod2.iqm_0.skin b/models/player/erebus_lod2.iqm_0.skin
new file mode 100644 (file)
index 0000000..81c4f3b
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebus
+erebus.001,shadowhead
diff --git a/models/player/erebus_lod2.iqm_1.skin b/models/player/erebus_lod2.iqm_1.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index b98d0b9818be941fbe715c5114f0b70cbd23e273..a257a2469eb0f5c7bd5feedf17d76e78848d615a 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index 71128c6c82fd047ec1b0b0a7e854df45dc67fe59..16b3e92c79f591ec88405a7ae46bece049f8c854 100644 (file)
@@ -9,7 +9,7 @@
 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
index b98d0b9818be941fbe715c5114f0b70cbd23e273..a257a2469eb0f5c7bd5feedf17d76e78848d615a 100644 (file)
@@ -9,7 +9,7 @@
 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
diff --git a/models/sprites/freezetag_frozen_frame0.tga b/models/sprites/freezetag_frozen_frame0.tga
new file mode 100644 (file)
index 0000000..ff31747
Binary files /dev/null and b/models/sprites/freezetag_frozen_frame0.tga differ
diff --git a/models/sprites/ka-ball.tga b/models/sprites/ka-ball.tga
new file mode 100644 (file)
index 0000000..17b1e6e
Binary files /dev/null and b/models/sprites/ka-ball.tga differ
diff --git a/models/sprites/ka-ballcarrier.tga b/models/sprites/ka-ballcarrier.tga
new file mode 100644 (file)
index 0000000..ca0c12f
Binary files /dev/null and b/models/sprites/ka-ballcarrier.tga differ
index be359dbde3ee8977ab210d7595b8acf4394633cd..87f24a6d0b49fed6eb041a421f8b080d1e99002e 100644 (file)
@@ -171,6 +171,8 @@ sprite race-checkpoint    "Checkpoint"    ff8000 000000 0.0
 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
@@ -187,6 +189,7 @@ sprite wpn-hookgun        "Hook"          008000 000000 0.0 # dark green
 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
@@ -201,3 +204,5 @@ sprite item-strength      "Strength"      0050ff 000000 0.5 0050ff ffff00 0.5
 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
diff --git a/models/sprites/wpn-minelayer_frame0.tga b/models/sprites/wpn-minelayer_frame0.tga
new file mode 100644 (file)
index 0000000..b2d2905
Binary files /dev/null and b/models/sprites/wpn-minelayer_frame0.tga differ
index 8634feaeb06a6d08e4b1f41af6620b28b69b221c..b325c9c2be28a5cdbafcee989336d78cd0c35900 100644 (file)
Binary files a/models/weapons/g_crylink.md3 and b/models/weapons/g_crylink.md3 differ
index ae76ba7655f5a6181abd5501932a9ad9a2932204..6e76885b395c1a69414531164f21190d313ba9be 100644 (file)
Binary files a/models/weapons/g_hlac.md3 and b/models/weapons/g_hlac.md3 differ
index b31e260343dab616ed8e45f21aea02bb7cd98eee..d1f168a61cfca337a173aaf03d38414cc3d26ce3 100644 (file)
Binary files a/models/weapons/g_laser.md3 and b/models/weapons/g_laser.md3 differ
index 5fce1ef258582d741089a8c8ecbae7d981f83295..898c13233fd918de39091f1c315542bbf647a6c9 100644 (file)
Binary files a/models/weapons/g_minelayer.md3 and b/models/weapons/g_minelayer.md3 differ
index 5594558b852a17822540fb2a5b9c658fa38008e2..6ecb0aaba2d3a9b03d560c4e6bba5b183210d7b0 100644 (file)
Binary files a/models/weapons/g_nex.md3 and b/models/weapons/g_nex.md3 differ
index f0dce9dc42bd18fce9ab34d41555c2695956884f..78163a90326baf5d397d493c09d9c7ec7ccf07ca 100644 (file)
Binary files a/models/weapons/g_porto.md3 and b/models/weapons/g_porto.md3 differ
index af34658d79ee109cc6a2faf3d657316f0265206f..c3b9f3ca833a84a8818bf32df9b6a914fc8a843e 100644 (file)
Binary files a/models/weapons/v_crylink.md3 and b/models/weapons/v_crylink.md3 differ
index 3bbc34d567d126fcf47fca6b40a6b4b02de58251..887c2a796479e1f16ff04ccf1d8d224cfd9387c8 100644 (file)
Binary files a/models/weapons/v_hlac.md3 and b/models/weapons/v_hlac.md3 differ
index 4ca6a130e8d74900063cf18210f3352a0b35167f..8b96df03820f5273bab809efdc257ec167bef932 100644 (file)
Binary files a/models/weapons/v_hookgun.md3 and b/models/weapons/v_hookgun.md3 differ
index 836ad36b39e4cfcd945d4117d406c1a3f8751d5b..dc5e2674505c1f02c3652980c5e130f6ecce69c0 100644 (file)
Binary files a/models/weapons/v_laser.md3 and b/models/weapons/v_laser.md3 differ
index 4c7d4498f645d8752aba0474ccba834442e04449..529f02fcf9ba9f40003854b8ad1551f4416e7944 100644 (file)
Binary files a/models/weapons/v_minelayer.md3 and b/models/weapons/v_minelayer.md3 differ
index 1d45edb7938b320f402ea328a47a8ce1586859e1..4cafdd10ffe3bd9acb4e910b119ba4a17e7418f8 100644 (file)
Binary files a/models/weapons/v_nex.md3 and b/models/weapons/v_nex.md3 differ
index 5d06b3c0667e1fba9319313b19059f211d7e7b25..b72113aa55a516ae87cdf66a9b2428f2791609b0 100644 (file)
Binary files a/models/weapons/v_porto.md3 and b/models/weapons/v_porto.md3 differ
diff --git a/particles/nexbeam.tga b/particles/nexbeam.tga
deleted file mode 100644 (file)
index cb8bd34..0000000
Binary files a/particles/nexbeam.tga and /dev/null differ
diff --git a/physics10.cfg b/physics10.cfg
deleted file mode 100644 (file)
index 6e112b9..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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
diff --git a/physics11.cfg b/physics11.cfg
deleted file mode 100644 (file)
index d4e1f54..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics151.cfg b/physics151.cfg
deleted file mode 100644 (file)
index 6cb19f1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics151b.cfg b/physics151b.cfg
deleted file mode 100644 (file)
index 4796765..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics16rc1.cfg b/physics16rc1.cfg
deleted file mode 100644 (file)
index c4d60c7..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics20.cfg b/physics20.cfg
deleted file mode 100644 (file)
index d317514..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics25.cfg b/physics25.cfg
deleted file mode 100644 (file)
index af5f386..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
diff --git a/physics26.cfg b/physics26.cfg
deleted file mode 100644 (file)
index 8fa5abc..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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
index 5660a33421e5d6d3f65b4651789af40e2dc33334..cbfd802bbe83ac86e6f3c8bbcdd8141e3dee8dbe 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 400
index 82d996f55bcea8600e6e54d8c5227963e8921588..6467afad4c3b13e354e3fc8ad6069c94194cd2a2 100644 (file)
@@ -29,3 +29,4 @@ sv_doublejump 1 // TINY (1.35x normal) doublejumps only, can be disabled if want
 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
index f328f8967b67db1c46b4af61d66c5dd87951e2da..a19617d93f89be9ef474bff4f7820936bb72920e 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
diff --git a/physicsLeeStricklin-ModdedFruit.cfg b/physicsLeeStricklin-ModdedFruit.cfg
new file mode 100644 (file)
index 0000000..c332942
--- /dev/null
@@ -0,0 +1,41 @@
+// "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
index dc82a81f54702c34e8273b6003e42fd25f09b1bb..2f23ae763dbdb30e0da4f093d4fe269dce4e6bcf 100644 (file)
@@ -38,3 +38,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
index 5d9a1280b6ae7d4bb21adef218a4edcc5aada830..bb6133a8b79f8b08fef018af239bc84425235b07 100644 (file)
@@ -33,3 +33,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max 0.38
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 064499002a2981fd266240bbb63bc2467eafc4dd..01e446e8ba32c2219d4f366c94e8b307ce88fcc9 100644 (file)
@@ -31,3 +31,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
diff --git a/physicsNexuiz10.cfg b/physicsNexuiz10.cfg
new file mode 100644 (file)
index 0000000..de2ff25
--- /dev/null
@@ -0,0 +1,34 @@
+// 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
diff --git a/physicsNexuiz11.cfg b/physicsNexuiz11.cfg
new file mode 100644 (file)
index 0000000..64ac7b0
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz151.cfg b/physicsNexuiz151.cfg
new file mode 100644 (file)
index 0000000..c527b29
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz151b.cfg b/physicsNexuiz151b.cfg
new file mode 100644 (file)
index 0000000..aa2f530
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz16rc1.cfg b/physicsNexuiz16rc1.cfg
new file mode 100644 (file)
index 0000000..0622e1a
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz20.cfg b/physicsNexuiz20.cfg
new file mode 100644 (file)
index 0000000..1d15fe1
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz25.cfg b/physicsNexuiz25.cfg
new file mode 100644 (file)
index 0000000..5b6db6b
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
diff --git a/physicsNexuiz26.cfg b/physicsNexuiz26.cfg
new file mode 100644 (file)
index 0000000..f766152
--- /dev/null
@@ -0,0 +1,33 @@
+// 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
index e67832dcb74a97c64ab3562a166b0475a591c37f..2f12a4ebceb3ac7cea0e1ed94f7d7f1aa1ac2bf4 100644 (file)
@@ -39,3 +39,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
diff --git a/physicsNoQWBunny-xpmbased.cfg b/physicsNoQWBunny-xpmbased.cfg
deleted file mode 100644 (file)
index 675c727..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// "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
index 6fb02afe7880a41e02bb26f8242030acb6c9f5ef..509310843b5e31ebbd5c6c18e56bd6291f0448b6 100644 (file)
@@ -31,3 +31,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 927fef3c44edd49d4ddf7eced660035966311204..dc580a51190ead71c541fc9833e70c0e0449ccf0 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 1
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 7828cc608b2303368ab4bb3bfb32f2fc879a1ed8..c5f21116ec9a4bff476338502dace8b7a9937a8b 100644 (file)
@@ -31,3 +31,4 @@ sv_doublejump 1
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 37973aef68f90d59a53e9ec7aaa1793cb6bfb939..a50427155e11414f2d3362960165284e1cb2344b 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 320
index 2f325586e363f133153ffcce967a796807d6c5e5..9725e8cc4a207e12d49789ea413ba09ddcc35707 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 03be62dd43d66b6c586750aef68e42a1fd7140bb..75c70c1818bec4bac9ef7dae8f2e361412a39e63 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 7492b415c56220840633b2aa256913b391931e2f..731b1482e6ddae0e04cc904cdebe671ba55c107f 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 811084dd5f316c3e8e32120cf8f3a8279d5a1be6..068d22ce67c7387e0b4ec3574dd434df246899c7 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 467c4212a02626942b5557f0d86c5a740f1b9d5f..72ca9ffcae73a43a275813ab8865ca882290c7ab 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
index 8a62f3e053c355a24d1f14c519f0e0d6a009e849..051775de9a900680e0ab37949b827f1d798387a7 100644 (file)
@@ -30,3 +30,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
+g_teleport_maxspeed 0
diff --git a/physicsX0.cfg b/physicsX0.cfg
new file mode 100644 (file)
index 0000000..8fec026
--- /dev/null
@@ -0,0 +1,41 @@
+// "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
index 74a20a46840871ead0789d623d930b7e4d5fd740..e4ba14a56234aa12208ac83a5f7901b2eecbb8af 100644 (file)
@@ -9,7 +9,7 @@ sv_accelerate 15
 sv_airaccelerate 1
 sv_friction 8
 edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
 // CPMA: 18
 sv_jumpvelocity 270
 sv_wateraccelerate 4
@@ -34,3 +34,4 @@ sv_doublejump 1
 sv_jumpspeedcap_min 0
 sv_jumpspeedcap_max 0.5
 sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 400
index db9c6179c0b4f8c5a471ff0c3d912761f0b53dc1..3e7ee55570fa21cc92fa488a4aaae9b3a99336a4 100644 (file)
@@ -9,7 +9,7 @@ sv_accelerate 15
 sv_airaccelerate 1
 sv_friction 8
 edgefriction 1
-sv_stepheight 34
+sv_stepheight 26
 // CPMA: 18
 sv_jumpvelocity 270
 sv_wateraccelerate 4
@@ -34,3 +34,4 @@ sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 1
+g_teleport_maxspeed 0
diff --git a/qcsrc/autocvarize-update.sh b/qcsrc/autocvarize-update.sh
new file mode 100755 (executable)
index 0000000..31ecc08
--- /dev/null
@@ -0,0 +1,23 @@
+#!/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
diff --git a/qcsrc/autocvarize.pl b/qcsrc/autocvarize.pl
new file mode 100644 (file)
index 0000000..7ac048a
--- /dev/null
@@ -0,0 +1,281 @@
+#!/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;
+}
index 8e47e6fa5bd880bc815444ae80c154985793ca6a..3d15295942e21b6cefc40c52386f5f7ea3e8d6f0 100644 (file)
@@ -156,7 +156,7 @@ float               scoreboard_showaccuracy;
 // float               coop;
 // float               deathmatch;
 
-// float               dmg_take;
+float          dmg_take;
 // float               dmg_save;
 // vector              dmg_origin;
 
@@ -258,7 +258,7 @@ float w_deathtype, w_issilent, w_random;
 string w_deathtypestring;
 vector w_org, w_backoff;
 
-float campingrifle_scope;
+float sniperrifle_scope;
 float nex_scope;
 
 float cr_maxbullets;
@@ -271,3 +271,5 @@ string weaponorder_bypriority;
 float nex_charge_movingavg;
 
 float serverflags;
+
+float uid2name_dialog;
index d358a59a536db28ea46dd630f8c4e7b941264fe4..8614863318dcac9396237f4d6462dc30cdcf2826 100644 (file)
@@ -27,7 +27,7 @@ void cvar_clientsettemp_restore()
 
 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)
@@ -46,33 +46,34 @@ string cl_announcer_prev;
 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;
@@ -135,16 +136,18 @@ void CSQC_Init(void)
        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();
 
@@ -186,7 +189,7 @@ void CSQC_Shutdown(void)
        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");
@@ -223,7 +226,7 @@ float SetTeam(entity o, float Team)
                        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;
@@ -239,7 +242,7 @@ float SetTeam(entity o, float Team)
                        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;
@@ -249,7 +252,6 @@ float SetTeam(entity o, float Team)
        {
                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;
@@ -260,7 +262,6 @@ float SetTeam(entity o, float Team)
        {
                if not(o.has_team)
                {
-                       //print("(CONNECT) enter team ", ftos(o.team), "\n");
                        o.team = Team;
                        tm = GetTeam(Team, true);
                        tm.team_size += 1;
@@ -269,11 +270,9 @@ float SetTeam(entity o, float Team)
                }
                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;
@@ -293,7 +292,6 @@ void Playerchecker_Think()
                {
                        if(e.sort_prev)
                        {
-                               //print("playerchecker: KILL KILL KILL\n");
                                // player disconnected
                                SetTeam(e, -1);
                                RemovePlayer(e);
@@ -305,7 +303,6 @@ void Playerchecker_Think()
                {
                        if not(e.sort_prev)
                        {
-                               //print("playerchecker: SPAWN SPAWN SPAWN\n");
                                // player connected
                                if not(e)
                                        playerslots[i] = e = spawn();
@@ -327,8 +324,7 @@ void Porto_Init();
 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();
@@ -358,12 +354,12 @@ float CSQC_ConsoleCommand(string strMessage)
        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));
@@ -510,10 +506,10 @@ void GameCommand(string msg)
 
        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;
        }
@@ -608,6 +604,35 @@ void GameCommand(string msg)
                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");
@@ -627,56 +652,6 @@ float CSQC_InputEvent(float bInputType, float nPrimary, float nSecondary)
        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;
 
@@ -739,7 +714,7 @@ void Ent_ReadPlayerScore()
 #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;
@@ -848,11 +823,6 @@ void Ent_ClientData()
        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;
@@ -904,6 +874,32 @@ void Ent_RandomSeed()
        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();
@@ -932,7 +928,7 @@ void(float bIsNewEntity) CSQC_Ent_Update =
        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;
                }
@@ -967,8 +963,9 @@ void(float bIsNewEntity) CSQC_Ent_Update =
                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;
        }
 
@@ -1087,14 +1084,20 @@ void Ent_Init()
 
        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();
 }
@@ -1393,10 +1396,6 @@ float CSQC_Parse_TempEntity()
                        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;
@@ -1438,12 +1437,12 @@ string getcommandkey(string text, string command)
 
        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;
 }
index 1c58d390450f2a57cb59d89e3f766d4894b44713..7270a9cf19e0882a9f41bf26434ff325dcb33f9f 100644 (file)
@@ -102,7 +102,7 @@ void CheckForGamestartChange() {
        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();
@@ -127,17 +127,17 @@ vector GetCurrentFov(float fov)
 {
        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())
        {
@@ -185,11 +185,11 @@ vector GetCurrentFov(float fov)
        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;
@@ -274,7 +274,7 @@ float TrueAimCheck()
                case WEP_MINSTANEX:
                        mv = MOVE_NORMAL;
                        break;
-               case WEP_CAMPINGRIFLE:
+               case WEP_SNIPERRIFLE:
                        ta = trueaim_rifle;
                        mv = MOVE_NORMAL;
                        if(zoomscript_caught)
@@ -306,6 +306,9 @@ float TrueAimCheck()
        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
@@ -350,6 +353,18 @@ vector freeze_pmove_org, freeze_input_angles;
 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)
 {
@@ -385,7 +400,7 @@ 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;
@@ -451,7 +466,7 @@ void CSQC_UpdateView(float w, float h)
        maptimeAnnouncer();
        carrierAnnouncer();
 
-       fov = cvar("fov");
+       fov = autocvar_fov;
        if(button_zoom || fov <= 59.5)
        {
                if(!zoomscript_caught)
@@ -471,9 +486,9 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 
-       ColorTranslateMode = cvar("cl_stripcolorcodes");
+       ColorTranslateMode = autocvar_cl_stripcolorcodes;
        activeweapon = getstati(STAT_SWITCHWEAPON);
-       f = cvar("teamplay");
+       f = (serverflags & SERVERFLAG_TEAMPLAY);
        if(f != teamplay)
        {
                teamplay = f;
@@ -503,16 +518,16 @@ void CSQC_UpdateView(float w, float h)
        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
                {
@@ -522,13 +537,13 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 #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;
@@ -542,8 +557,8 @@ void CSQC_UpdateView(float w, float h)
        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
        /*
@@ -566,7 +581,7 @@ void CSQC_UpdateView(float w, float h)
        // 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
@@ -584,7 +599,7 @@ void CSQC_UpdateView(float w, float h)
                }
 
                // 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;
@@ -596,9 +611,9 @@ void CSQC_UpdateView(float w, float h)
                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
@@ -610,9 +625,9 @@ void CSQC_UpdateView(float w, float h)
                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();
        }
 
@@ -622,14 +637,14 @@ void CSQC_UpdateView(float w, float h)
        // 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;
@@ -647,17 +662,129 @@ void CSQC_UpdateView(float w, float h)
        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
@@ -685,6 +812,19 @@ void CSQC_UpdateView(float w, float h)
 
        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)
@@ -695,21 +835,32 @@ void CSQC_UpdateView(float w, float h)
         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;
 
@@ -719,7 +870,7 @@ void CSQC_UpdateView(float w, float h)
                        // 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;
@@ -732,7 +883,7 @@ void CSQC_UpdateView(float w, float h)
                                        if(vlen(v) > 0.01)
                                                shottype = SHOTTYPE_HITOBSTRUCTION;
                                }
-                               if(!cvar("crosshair_hittest_showimpact"))
+                               if(!autocvar_crosshair_hittest_showimpact)
                                        wcross_origin = wcross_oldorigin;
                        }
                        else
@@ -742,37 +893,78 @@ void CSQC_UpdateView(float w, float h)
                        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;
@@ -782,7 +974,7 @@ void CSQC_UpdateView(float w, float h)
                                wcross_scale = 1;
                        }
 
-                       if(cvar("crosshair_pickup"))
+                       if(autocvar_crosshair_pickup)
                        {
                                if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP))
                                {
@@ -791,19 +983,40 @@ void CSQC_UpdateView(float w, float h)
                                }
 
                                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)
@@ -827,7 +1040,7 @@ void CSQC_UpdateView(float w, float h)
                        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;
@@ -849,40 +1062,51 @@ void CSQC_UpdateView(float w, float h)
                        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);
                        }
 
@@ -923,8 +1147,15 @@ void CSQC_UpdateView(float w, float h)
                        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;
                }
@@ -960,8 +1191,8 @@ void CSQC_UpdateView(float w, float h)
        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');
@@ -1013,9 +1244,9 @@ void CSQC_SPIDER_HUD()
 
     // 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;
@@ -1125,9 +1356,9 @@ void CSQC_RAPTOR_HUD()
 
     // 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;
@@ -1190,9 +1421,9 @@ void CSQC_WAKIZASHI_HUD()
        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;
@@ -1296,18 +1527,22 @@ void CSQC_common_hud(void)
                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
@@ -1324,12 +1559,12 @@ void CSQC_common_hud(void)
                                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();
@@ -1353,7 +1588,7 @@ void CSQC_Demo_Camera()
        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';
@@ -1369,9 +1604,9 @@ void CSQC_Demo_Camera()
 
        // 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;
@@ -1385,7 +1620,7 @@ void CSQC_Demo_Camera()
        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));
@@ -1404,10 +1639,10 @@ void CSQC_Demo_Camera()
        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;
@@ -1425,7 +1660,7 @@ void CSQC_Demo_Camera()
        {
                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;
        }
@@ -1444,10 +1679,10 @@ void CSQC_Demo_Camera()
                ++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)
        {
@@ -1458,7 +1693,7 @@ void CSQC_Demo_Camera()
        current_camera_offset += (camera_offset - current_camera_offset) * attenuation;
 
        // Camera modes
-       if( cvar("camera_free") )
+       if( autocvar_camera_free )
        {
                if ( camera_mode == CAMERA_CHASE )
                {
@@ -1480,7 +1715,7 @@ void CSQC_Demo_Camera()
 
                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;
index ea0fcecedfa8ac2a716fe6c23f9012f07093571d..0cf1e4bf8dc8d5f76652fa0141d269ce66ff358f 100644 (file)
-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;
index c23b425ae9d2e4edd0ace7c0cd77ec703b06b7ed..353c5419abd055c12e626ec34451d2099c7cac54 100644 (file)
@@ -131,7 +131,7 @@ void BGMScript_InitEntity(entity e)
                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 = "";
                }
        }
@@ -172,7 +172,7 @@ float BGMScript(entity e)
        if(e.bgmscript == "")
                return 1;
        
-       if(cvar("bgmvolume") <= 0)
+       if(autocvar_bgmvolume <= 0)
                return -1;
 
        e.just_toggled = FALSE;
@@ -182,7 +182,6 @@ float BGMScript(entity e)
 
        if(bgmtime < e.bgmscripttime)
        {
-               //print("reset ", e.bgmscript, "\n");
                amp = GetCurrentAmplitude(e, e.bgmscripttime - e.bgmscriptstatetime + drawframetime);
 
                e.bgmscriptline = e.bgmscriptline0;
index 348e4a1a6ebefd8b2820168fe2b65a2616a20d81..860e8296f700cb94562b9efb3775895ed1b8fefd 100644 (file)
@@ -88,7 +88,7 @@ void Ent_Casing(float isNew)
        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();
@@ -104,11 +104,11 @@ void Ent_Casing(float isNew)
                {
                        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;
                }
 
@@ -117,7 +117,7 @@ void Ent_Casing(float isNew)
     else
         Casing_Delete();
 
-       RubbleLimit("casing", cvar_or("cl_casings_maxcount",100), Casing_Delete);
+       RubbleLimit("casing", autocvar_cl_casings_maxcount, Casing_Delete);
 }
 
 void Casings_Precache()
index 2b2e674c603a2b938aa0f30984ae861a3806be6c..93051cc4d15f423dbe1883a9fb217444437a4b04 100644 (file)
@@ -63,7 +63,6 @@ const float           STAT_MOVEVARS_TIMESCALE         = 241;
 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;
index 0a5375f51dcf1c22cf278ec4114edfa0c7585100..fd35613a51583e37c5779e0bb45e3ece0c74fc15 100644 (file)
@@ -1,4 +1,5 @@
-//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...
 
@@ -31,10 +32,10 @@ void() order_menu_render =
        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)
@@ -51,7 +52,7 @@ void() order_menu_render =
                                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();
        }
@@ -118,18 +119,18 @@ float(float bInputType, float nPrimary, float nSecondary) order_menu_action =
                        }
                }
                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;
@@ -150,14 +151,14 @@ void() ctf_menu_render =
        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();
        }
@@ -208,9 +209,11 @@ void() ctf_view =
        } 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
index 24c5f0153b35609fc3b455b3bc10013c53c8ac56..13c8e462e3d5d800cdafe161cca952e81bb246d2 100644 (file)
@@ -54,15 +54,11 @@ void Ent_DamageInfo(float isNew)
                        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)
index 2e946fc830d1228515c89ef4110d6417a134396a..b695867ca361995522005d50a69a99ab482ec66a 100644 (file)
@@ -57,19 +57,16 @@ void cl_effetcs_lightningarc(vector from, vector to,float seglength,float drifts
             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);
 
 }
 
@@ -80,7 +77,7 @@ void Net_ReadLightningarc()
     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);
     }
@@ -88,11 +85,11 @@ void Net_ReadLightningarc()
     {
         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);
     }
index 86b970c1a1fa1cf8334b8134383e002d1416450d..1f8af46ca16c4178284485bfa93626b416506968 100644 (file)
@@ -51,7 +51,7 @@ void Gib_setmodel(entity gib, string mdlname, float specnum)
 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);
 }
@@ -125,15 +125,15 @@ void TossGib (string mdlname, vector org, vector vconst, vector vrand, float spe
                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)
@@ -153,28 +153,29 @@ 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)
index a995970b45fbbc4499afc306c512e6970d619913..7ff5adeca46204beaf8e37d040341b84c3ee6854 100644 (file)
@@ -18,13 +18,6 @@ void Draw_CylindricLine(vector from, vector to, float thickness, string texture,
        // 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);
@@ -72,7 +65,7 @@ void Draw_GrapplingHook()
 
        InterpolateOrigin_Do();
 
-       s = cvar("cl_gunalign");
+       s = autocvar_cl_gunalign;
        if(s != 1 && s != 2 && s != 4)
                s = 3; // default value
        --s;
index 9a203c72b54ac738d58346a4ffc2f38861985eae..30a925a4f8d815560f4ba87127ea6ed14e1d5244 100644 (file)
@@ -14,7 +14,12 @@ Misc HUD functions
 //   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);
@@ -146,7 +151,7 @@ void centerprint(string strMessage)
 
        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 == "")
@@ -205,8 +210,8 @@ void centerprint(string 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
 
@@ -264,7 +269,7 @@ void centerprint(string strMessage)
 
        centerprint_num = i;
 
-       centerprint_expire = time + cvar("scr_centertime");
+       centerprint_expire = time + autocvar_scr_centertime;
 }
 
 void HUD_DrawCenterPrint (void)
@@ -284,7 +289,7 @@ 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;
@@ -292,7 +297,6 @@ void HUD_DrawCenterPrint (void)
        {
                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 != "")
                {
@@ -303,7 +307,6 @@ void HUD_DrawCenterPrint (void)
                        // half height for empty lines looks better
                        pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
                drawfontscale = '1 1 0';
-               drawfont = hud_font;
        }
 }
 
@@ -322,13 +325,13 @@ void drawstringcenter(vector position, string text, vector scale, vector rgb, fl
 // 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
@@ -360,12 +363,12 @@ string MakeRaceString(float cp, float mytime, float histime, float lapdelta, str
 
                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";
                }
        }
@@ -381,20 +384,20 @@ string MakeRaceString(float cp, float mytime, float histime, float lapdelta, str
                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)
@@ -412,48 +415,55 @@ HUD panels
 ==================
 */
 
+#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;
@@ -461,66 +471,79 @@ void HUD_Panel_ExportCfg(string cfgname)
                {
                        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;
@@ -544,31 +567,37 @@ if(highlightedPanel_prev == active_panel && autocvar__hud_configure)\
        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)
@@ -656,8 +685,8 @@ vector HUD_Panel_CheckMove(vector myPos, vector mySize)
                        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;
@@ -669,8 +698,8 @@ void HUD_Panel_SetPos(vector pos)
        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)
        {
@@ -795,8 +824,8 @@ vector HUD_Panel_CheckResize(vector mySize, vector resizeorigin) {
                        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;
@@ -815,8 +844,8 @@ void HUD_Panel_SetPosSize(vector 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|
@@ -849,8 +878,8 @@ void HUD_Panel_SetPosSize(vector mySize)
        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)
@@ -881,8 +910,8 @@ void HUD_Panel_SetPosSize(vector mySize)
                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;
@@ -904,7 +933,7 @@ void HUD_Panel_Arrow_Action(float nPrimary)
        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)
@@ -1321,7 +1350,7 @@ void HUD_Panel_Mouse()
        /*
        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
@@ -1337,7 +1366,7 @@ void HUD_Panel_Mouse()
        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);
@@ -1414,13 +1443,13 @@ void HUD_Panel_Mouse()
        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;
 }
@@ -1477,7 +1506,7 @@ float GetAmmoTypeForWep(float i)
                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;
@@ -1495,9 +1524,9 @@ void HUD_Weapons(void)
        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;
@@ -1520,12 +1549,12 @@ void HUD_Weapons(void)
        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;
@@ -1551,12 +1580,12 @@ void HUD_Weapons(void)
        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;
@@ -1580,7 +1609,7 @@ void HUD_Weapons(void)
                }
        }
 
-       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)
        {
@@ -1590,14 +1619,14 @@ void HUD_Weapons(void)
        }
 
        // 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, " ");
 
@@ -1623,28 +1652,20 @@ void HUD_Weapons(void)
                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;
@@ -1658,103 +1679,119 @@ void HUD_Weapons(void)
        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();
                                }
                        }
@@ -1786,19 +1823,20 @@ void HUD_Weapons(void)
 
                        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;
@@ -1843,9 +1881,13 @@ string GetAmmoPicture(float i)
 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)
@@ -1859,49 +1901,35 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
        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)
@@ -1911,8 +1939,6 @@ 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;
@@ -1924,34 +1950,68 @@ void HUD_Ammo(void)
                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;
+               }
        }
 }
 
@@ -2004,9 +2064,7 @@ void DrawNumIcon(float iconalign, vector myPos, vector mySize, float x, string i
                }
        }
 
-       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);
 }
 
@@ -2024,21 +2082,17 @@ void HUD_Powerups(void) {
        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;
@@ -2067,128 +2121,149 @@ void HUD_Powerups(void) {
        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
@@ -2196,29 +2271,31 @@ void HUD_Powerups(void) {
                                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
@@ -2226,19 +2303,21 @@ void HUD_Powerups(void) {
                                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)
@@ -2268,9 +2347,9 @@ void HUD_HealthArmor(void)
 
        if(autocvar__hud_configure)
        {
-               armor = 150;
-               health = 100;
-               fuel = 70;
+               armor = 75;
+               health = 150;
+               fuel = 20;
        }
 
        if(health <= 0)
@@ -2280,7 +2359,12 @@ void HUD_HealthArmor(void)
        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;
@@ -2289,198 +2373,197 @@ void HUD_HealthArmor(void)
                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
@@ -2488,26 +2571,28 @@ void HUD_HealthArmor(void)
                                        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
@@ -2515,30 +2600,27 @@ void HUD_HealthArmor(void)
                                        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)
@@ -2558,34 +2640,27 @@ string Weapon_KillMessage(float deathtype)
        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
@@ -2607,162 +2682,161 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                } 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)
@@ -2774,54 +2848,54 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                } 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) {
@@ -2829,49 +2903,49 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                        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)
@@ -2883,51 +2957,51 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                } 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) {
@@ -2942,6 +3016,17 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                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));
+               }
        }
 }
 
@@ -2953,84 +3038,84 @@ void HUD_Centerprint(string s1, string s2, float type, float msg)
        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!")));
        }
 }
 
@@ -3053,11 +3138,12 @@ void HUD_Notify (void)
        }
 
        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;
@@ -3072,42 +3158,63 @@ void HUD_Notify (void)
        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";
@@ -3200,36 +3307,29 @@ void HUD_Notify (void)
                                        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";
                        }
@@ -3298,7 +3398,16 @@ void HUD_Notify (void)
                        {
                                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);
@@ -3317,11 +3426,7 @@ string seconds_tostring(float sec)
        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)
@@ -3372,9 +3477,7 @@ 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)
@@ -3447,7 +3550,7 @@ void HUD_Radar(void)
        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
        {
@@ -3475,7 +3578,7 @@ void HUD_Radar(void)
                  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);
@@ -3563,9 +3666,7 @@ void HUD_Score(void)
                // 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;
@@ -3597,9 +3698,7 @@ void HUD_Score(void)
                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;
@@ -3621,9 +3720,7 @@ void HUD_Score(void)
                                        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;
@@ -3673,7 +3770,6 @@ void HUD_RaceTimer (void) {
        }
        mySize = newSize;
 
-       drawfont = hud_bigfont;
        float a, t;
        string s, forcetime;
 
@@ -3681,9 +3777,9 @@ void HUD_RaceTimer (void) {
        {
                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)
@@ -3725,7 +3821,7 @@ void HUD_RaceTimer (void) {
                        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);
                        }
                }
@@ -3766,15 +3862,13 @@ void HUD_RaceTimer (void) {
                        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)
@@ -3791,26 +3885,17 @@ float vote_change; // "time" when vote_active changed
 
 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;
@@ -3844,9 +3929,24 @@ void HUD_VoteWindow(void)
        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;
@@ -3871,23 +3971,19 @@ void HUD_VoteWindow(void)
        }
        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
@@ -3936,7 +4032,6 @@ void HUD_Mod_CA(vector pos, vector mySize)
        redalive = getstati(STAT_REDALIVE);
        bluealive = getstati(STAT_BLUEALIVE);
 
-       drawfont = hud_bigfont;
        vector redpos, bluepos;
        if(mySize_x > mySize_y)
        {
@@ -3956,7 +4051,6 @@ void HUD_Mod_CA(vector pos, vector mySize)
                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
@@ -4255,6 +4349,52 @@ void HUD_Mod_KH(vector pos, vector mySize)
        }
 }
 
+// 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)
 {
@@ -4278,20 +4418,17 @@ 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)
@@ -4319,8 +4456,6 @@ void HUD_Mod_Race(vector pos, vector mySize)
        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)
@@ -4331,9 +4466,9 @@ void HUD_Mod_Race(vector pos, vector mySize)
 
        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!
                }
@@ -4361,12 +4496,12 @@ void HUD_Mod_Race(vector pos, vector mySize)
        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);
        }
 
@@ -4379,12 +4514,12 @@ void HUD_Mod_Race(vector pos, vector mySize)
        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);
        }
 
@@ -4443,7 +4578,6 @@ void HUD_Mod_Race(vector pos, vector mySize)
                        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
@@ -4455,7 +4589,7 @@ void HUD_ModIcons(void)
        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;
@@ -4492,8 +4626,10 @@ void HUD_ModIcons(void)
                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)
@@ -4520,19 +4656,20 @@ void HUD_DrawPressedKeys(void)
        }
 
        // 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;
@@ -4600,21 +4737,21 @@ void HUD_Chat(void)
        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);
                }
        }
 }
@@ -4667,7 +4804,7 @@ void HUD_EngineInfo(void)
        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;
@@ -4677,9 +4814,7 @@ void HUD_EngineInfo(void)
 
        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)
@@ -4744,41 +4879,41 @@ void HUD_InfoMessages(void)
                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:
@@ -4786,14 +4921,14 @@ void HUD_InfoMessages(void)
                                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)
                }
 
@@ -4808,22 +4943,22 @@ void HUD_InfoMessages(void)
                        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)
                }
 
@@ -4844,12 +4979,12 @@ void HUD_InfoMessages(void)
                                }
                                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)
                                }
                        }
@@ -4857,13 +4992,13 @@ void HUD_InfoMessages(void)
        }
        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)
        }
 }
@@ -4880,7 +5015,7 @@ void HUD_ShowSpeed(void)
        float pos, conversion_factor;
        string speed, zspeed, unit;
 
-       switch(cvar("cl_showspeed_unit"))
+       switch(autocvar_cl_showspeed_unit)
        {
                default:
                case 0:
@@ -4888,41 +5023,38 @@ void HUD_ShowSpeed(void)
                        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;
@@ -4937,7 +5069,7 @@ void HUD_ShowAcceleration(void)
        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);
@@ -4950,13 +5082,13 @@ void HUD_ShowAcceleration(void)
        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);
@@ -4965,9 +5097,9 @@ void HUD_ShowAcceleration(void)
        }
 
        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)
@@ -5016,9 +5148,6 @@ switch (id) {\
 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;
@@ -5039,6 +5168,12 @@ void HUD_Main (void)
                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)
@@ -5055,28 +5190,35 @@ void HUD_Main (void)
                }
        }
 
+    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);
@@ -5110,9 +5252,9 @@ void HUD_Main (void)
                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)
index 7a61b515c80eb6ce87ad35efd1a449d2a73ded30..21e3746b560811ee3d89c7b422b8c28f5f55a1bc 100644 (file)
@@ -15,12 +15,11 @@ float highlightedAction; // 0 = nothing, 1 = move, 2 = resize
 
 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;
 
@@ -81,6 +80,8 @@ var string panel_bg_border_str;
 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
@@ -88,7 +89,7 @@ var string panel_bg_padding_str;
 // 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;\
@@ -126,7 +127,7 @@ if(!autocvar__hud_configure && panel_bg_str == "0") {\
 // 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 {\
@@ -134,9 +135,9 @@ if((teamplay) && panel_bg_color_team) {\
                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);\
                }\
@@ -251,14 +252,14 @@ else\
 // 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()\
@@ -286,14 +287,14 @@ switch(id) { \
 }
 
 #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
index 2294ffd1557b080e7ac8d03f1d54d0613cea1254..970a1aa0b73d8fc223884e19518ff8a12ced06c6 100644 (file)
@@ -20,8 +20,10 @@ var float(float bInputType, float nPrimary, float nSecondary) menu_action;
 // --------------------------------------------------------------------------
 // CTF
 
+#ifdef CTF_EXAMPLE
 void() ctf_menu_show;
 string ctf_temp_1;
+#endif
 
 // --------------------------------------------------------------------------
 // Onslaught
@@ -80,9 +82,6 @@ float hud_size[MAX_HUD_FIELDS + 1];
 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];
@@ -161,5 +160,8 @@ float calledhooks;
 
 .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;
index 40fcfda11cda44efbbf29b787f599be41c069489..e94d6a68aa786786f9babdf009e71deeb5b64259 100644 (file)
@@ -12,6 +12,8 @@ float mv_ownvote;
 float mv_detail;
 float mv_timeout;
 float mv_maps_mask;
+float mv_top2_time;
+float mv_top2_alpha;
 
 vector mv_mousepos;
 float mv_selection;
@@ -19,13 +21,13 @@ 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 = "";
@@ -34,8 +36,10 @@ string MapVote_FormatMapItem(float id, string map, float count, float maxwidth,
        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)
@@ -53,20 +57,25 @@ void MapVote_DrawMapItem(vector pos, float isize, float tsize, string map, strin
        
        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;
@@ -75,19 +84,19 @@ void MapVote_DrawMapItem(vector pos, float isize, float tsize, string map, strin
        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);
 }
 
@@ -97,12 +106,11 @@ void MapVote_DrawAbstain(vector pos, float isize, float tsize, float count, floa
        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);
        
@@ -172,32 +180,29 @@ void MapVote_Draw()
        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)
@@ -222,11 +227,12 @@ void MapVote_Draw()
        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);
@@ -244,7 +250,7 @@ void MapVote_Draw()
                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)
@@ -254,7 +260,7 @@ 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;
        }
        
@@ -264,19 +270,16 @@ void Cmd_MapVote_MapDownload(float argc)
                        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"));
        }
 }
@@ -375,7 +378,6 @@ void MapVote_Init()
 
                        mv_preview[i] = false;
 
-                       //print(strcat("RECV: ", map, " in ", pk3, "\n"));
                        MapVote_CheckPic(map, pk3, i);
                }
                else
@@ -440,6 +442,8 @@ void MapVote_UpdateMask()
        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()
index b37e209a569bbd74faa991ea2b75b35f21bc334a..d38b7c9ba0d4837de902f2b86a4d5bb6e2111d92 100644 (file)
@@ -8,7 +8,7 @@ void serverAnnouncer()
        // 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 = "";
        }
@@ -20,9 +20,9 @@ void restartAnnouncer_Think() {
        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;
 
@@ -31,10 +31,10 @@ void restartAnnouncer_Think() {
        }
        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);
@@ -53,14 +53,14 @@ void maptimeAnnouncer() {
        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)
                {
@@ -71,13 +71,12 @@ void maptimeAnnouncer() {
                        //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))
@@ -87,7 +86,7 @@ void maptimeAnnouncer() {
                        //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);
                        }
        }
 }
@@ -102,7 +101,7 @@ void carrierAnnouncer() {
        float pickup;
        string item;
 
-       if not(cvar("cl_notify_carried_items"))
+       if not(autocvar_cl_notify_carried_items)
                return;
 
        stat_items = getstati(STAT_ITEMS);
@@ -111,24 +110,24 @@ void carrierAnnouncer() {
        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));
                }
        }
 
@@ -141,50 +140,50 @@ void carrierAnnouncer() {
  * 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()
@@ -281,7 +280,7 @@ void RemoveTeam(entity Team)
 
        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;
@@ -306,12 +305,6 @@ entity GetTeam(float Team, float add)
        return tm;
 }
 
-void CSQC_CheckEngine()
-{
-       hud_font = FONT_USER+1;
-       hud_bigfont = FONT_USER+2;
-}
-
 vector HUD_GetFontsize(string cvarname)
 {
        vector v;
@@ -329,7 +322,7 @@ float PreviewExists(string name)
        float f;
        string file;
 
-       if(cvar("cl_readpicture_force"))
+       if(autocvar_cl_readpicture_force)
                return false;
 
        file = strcat(name, ".tga");
index e9a02631f2e572c43c954b3a7c202201e1d0b316..b33b81a018ca982638304afd5edcc3e5adf753d3 100644 (file)
@@ -296,7 +296,7 @@ void Net_ReadNexgunBeamParticle()
        //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);
index 1fae8abe0db94bbeb1cf165a969a83d9c983ff29..1132d06a325278b6d238e0a97ffece43d647fd79 100644 (file)
@@ -9,7 +9,7 @@ float prandom()
        prandom_seed = c;
 
 #ifdef USE_PRANDOM_DEBUG
-       print("RANDOM -> ", ftos(c), "\n");
+       dprint("RANDOM -> ", ftos(c), "\n");
 #endif
 
        return c / 65536; // in [0..1[
@@ -34,14 +34,14 @@ void psrandom(float seed)
 {
        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
index fb07b21b8fd18473dfdb9168d5b56b4342b5873d..cede03c5a082c3e756cb9378b09885212d843781 100644 (file)
@@ -274,7 +274,7 @@ void Ent_Projectile()
                        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;
@@ -315,6 +315,8 @@ void Ent_Projectile()
                                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);
@@ -330,8 +332,8 @@ void Ent_Projectile()
                                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';
index b61568a2aeeb9c18ae9f2a16fd14d1892c4be305..517065ac5dd02fade24a500103bdb580dc09e26e 100644 (file)
@@ -11,6 +11,47 @@ void drawstringcenter(vector, string, vector, vector, float, float);
 
 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()
 {
@@ -195,65 +236,67 @@ void HUD_UpdateTeamPos(entity Team)
 
 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");
 }
 
@@ -266,7 +309,7 @@ void Cmd_HUD_SetFields(float argc)
 
        // 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()), " ");
@@ -296,7 +339,6 @@ void Cmd_HUD_SetFields(float argc)
 
        hud_num_fields = 0;
 
-       drawfont = hud_font;
        hud_fontsize = HUD_GetFontsize("hud_fontsize"); 
 
        for(i = 0; i < argc - 1; ++i)
@@ -317,12 +359,12 @@ void Cmd_HUD_SetFields(float argc)
                        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);
 
@@ -350,7 +392,7 @@ void Cmd_HUD_SetFields(float argc)
                        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
@@ -384,10 +426,10 @@ void Cmd_HUD_SetFields(float argc)
                                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)
                        {
@@ -402,7 +444,7 @@ void Cmd_HUD_SetFields(float argc)
                                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)
@@ -412,25 +454,25 @@ void Cmd_HUD_SetFields(float argc)
                        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]));
                }
        }
 
@@ -466,18 +508,18 @@ string HUD_GetField(entity pl, float field)
        {
                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)
@@ -518,16 +560,12 @@ string HUD_GetField(entity pl, float field)
 
                        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:
@@ -624,9 +662,9 @@ void HUD_PrintScoreboardItem(vector pos, entity pl, float is_self, float pl_numb
        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;
@@ -883,7 +921,11 @@ float HUD_WouldDrawScoreboard() {
                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;
@@ -895,10 +937,9 @@ float average_accuracy;
 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;
@@ -907,7 +948,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        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;
@@ -932,7 +973,6 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                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;
@@ -942,8 +982,13 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        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)
        {
@@ -952,13 +997,10 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                        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;
@@ -966,23 +1008,16 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                // 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
@@ -994,8 +1029,8 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                                // 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);
@@ -1006,7 +1041,6 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                        pos_y += height;
                }
        }
-       drawfont = hud_font;
 
        if(weapons_with_stats)
                average_accuracy = floor(average_accuracy / weapons_with_stats);
@@ -1034,12 +1068,12 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl,  vector rgb, vector bg_
        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;
@@ -1086,14 +1120,14 @@ void HUD_DrawScoreboard()
        }
 
        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
@@ -1105,21 +1139,21 @@ void HUD_DrawScoreboard()
 
        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;
@@ -1130,18 +1164,15 @@ void HUD_DrawScoreboard()
        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)
        {
@@ -1161,9 +1192,9 @@ void HUD_DrawScoreboard()
        }
        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)
                {
@@ -1176,16 +1207,16 @@ void HUD_DrawScoreboard()
 
        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
@@ -1207,74 +1238,62 @@ void HUD_DrawScoreboard()
 
        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])));
                        }
                }
        }
@@ -1285,183 +1304,3 @@ void HUD_DrawScoreboard()
 
        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;
-                       }
-               }
-       }
-}
index b1957038eb4eb9b7c1a97574713ceed3e42bf2e4..b50d5a862a92c4da7f21a807d325736681a4e52e 100644 (file)
@@ -39,7 +39,7 @@ void TargetMusic_Advance()
                        else
                                e.state = 0;
                }
-               vol = e.state * e.volume * cvar("bgmvolume");
+               vol = e.state * e.volume * autocvar_bgmvolume;
                if(vol != vol0)
                {
                        if(vol0 < 0)
@@ -90,7 +90,7 @@ void Net_TargetMusic()
                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;
                }
@@ -178,7 +178,7 @@ void Ent_ReadTriggerMusic()
                        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;
                        }
index 02c40ba26e6464bfcb245dd09ee1266d3d85da8d..7d5031fb87321beb771bf4f72390a7fd6464e0ed 100644 (file)
@@ -52,10 +52,10 @@ string GetTeamName(float color)
 {
        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");
        }
 }
index a486af68edbbe1c16bf7962b02ed14b91f35dc3f..cccce7680b4c352eb5af05e821ac62f04cf31fd8 100644 (file)
@@ -176,11 +176,11 @@ float hud_panel_radar_zoommode;
 
 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!
index cf33b0183136745cc332ce033c22b93a46235c0a..5f1228557f37f2974a8e3efe4434b3241555acd1 100644 (file)
@@ -5,7 +5,7 @@
 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
@@ -17,14 +17,14 @@ void Ent_TubaNote_Think()
                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()
index f53c60f0c3e1a89fdd1b000956f4e53eaa2ef8ee..0a0bfa9ec143208ed3f2f286f6cf776f181fbb12 100644 (file)
@@ -17,7 +17,7 @@ void Ent_Wall_Draw()
 
        if(self.lodmodelindex1)
        {
-               d = cvar("loddebug");
+               d = autocvar_loddebug;
                if(d > 0)
                {
                        if(d == 1)
index 07e9127827dc0131c43a9874c4e4bfca87f23e2c..8ecadaeb857f72f4745a33b2cd3d2748e774a388 100644 (file)
@@ -119,11 +119,11 @@ void Draw_WaypointSprite()
        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();
@@ -198,7 +198,7 @@ void Draw_WaypointSprite()
                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;
                */
 
@@ -336,7 +336,6 @@ void Ent_WaypointSprite()
                        else
                                self.build_starthealth = 0;
                        self.build_finished = servertime + t / 32;
-                       //print("build: ", ftos(self.build_finished - self.build_started), "\n");
                }
        }
        else
@@ -409,23 +408,23 @@ void Ent_WaypointSprite()
 
 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)
        {
@@ -461,6 +460,6 @@ void WaypointSprite_Load()
                        db_put(tempdb, sname, ftos(max(f, stof(db_get(tempdb, sname)))));
                }
                search_end(dh);
+               waypointsprite_initialized = true;
        }
-       waypointsprite_initialized = 1;
 }
index 4acf797b7dddfc7974315f23c4f5e506d2a7e500..60633f57472b111687223018d3491f9488a28fbf 100644 (file)
@@ -39,6 +39,8 @@ const float GAME_RACE = 11;
 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;
@@ -59,7 +61,6 @@ const float TE_CSQC_ANNOUNCE = 110;
 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;
 
@@ -111,6 +112,7 @@ const float ENT_CLIENT_TRIGGER_MUSIC = 26;
 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;
 
@@ -300,8 +302,6 @@ const float STAT_SWITCHWEAPON = 36;
 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;
@@ -310,12 +310,16 @@ const float STAT_SHOTORG = 46; // compressShotOrigin
 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;
@@ -341,6 +345,12 @@ const float STAT_VEHICLESTAT_RELOAD2 = 66;
 // 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
@@ -565,7 +575,7 @@ float MSG_SPREE = 2;
 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;
@@ -593,6 +603,9 @@ float INFO_LOSTFLAG = 10321;
 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;
@@ -648,3 +661,4 @@ string HUD_PANELNAME_INFOMESSAGES   = "infomessages";
 float HUD_MENU_ENABLE          = 0;
 
 #define SERVERFLAG_ALLOW_FULLBRIGHT 1
+#define SERVERFLAG_TEAMPLAY 2
index f6b54f155b842e6ff683ad236bfb7463f8d785ae..60c7199a65c0e4a00a4711190f5d3a1243a73c37 100644 (file)
@@ -312,7 +312,7 @@ float GameCommand_Generic(string command)
 
                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)));
index 37ffb25e7c3cff3b49e3581dc69a179048483212..3ddf8099f51c0736471859939a61b79b97e21df6 100644 (file)
@@ -1,5 +1,5 @@
 // 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)
@@ -19,6 +19,18 @@ void register_weapon(float id, float(float) func, float ammotype, float i, float
        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)
 {
@@ -43,7 +55,7 @@ void register_weapons_done()
 
        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));
index 64d7abd644b5f9de2240e4d1779596c19ccd15e0..ebee8aaaa48d28d345081541421c440804c495f3 100644 (file)
@@ -60,6 +60,14 @@ string W_FixWeaponOrder(string order, float complete);
 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_...
@@ -73,8 +81,7 @@ string W_NumberWeaponOrder(string order);
 .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);
index 5192b75ac24ea37fd4a67cc72bc885b80dd3ea60..58f0cc852a6e07383df3dadd8ce1d4e466c5a15a 100644 (file)
@@ -347,9 +347,11 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
                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)
@@ -406,6 +408,11 @@ string _MapInfo_GetDefault(float t)
                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 "";
        }
 }
@@ -462,6 +469,16 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType, fl
                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)
        {
@@ -526,6 +543,8 @@ string _MapInfo_GetDefaultEx(float t)
                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 "";
        }
 }
@@ -650,6 +669,8 @@ float MapInfo_Type_FromString(string t)
        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;
 }
@@ -670,6 +691,8 @@ string MapInfo_Type_ToString(float t)
        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 "";
 }
@@ -927,6 +950,7 @@ float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametype
                {
                        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
@@ -1134,6 +1158,10 @@ float MapInfo_CurrentGametype()
                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;
 }
@@ -1174,7 +1202,9 @@ string MapInfo_GetGameTypeCvar(float t)
                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 "";
        }
 }
@@ -1196,6 +1226,8 @@ void MapInfo_SwitchGameType(float t)
        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)
index 1fcc0dc662783ebd056281a5732a9d75ca98a31f..12026689b8b3195e21ef40db0079c70fe50dacaf 100644 (file)
@@ -12,7 +12,9 @@ float MAPINFO_TYPE_KEYHUNT            = 1024;
 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
 
index e7d67392ae01c4e6eeb53b569540694b36fa4e9c..bc086e4a9af392358db52715af04de0ae882f6bc 100644 (file)
@@ -1,8 +1,2 @@
 #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 */
-
index 42be955f0c48d0b851c56077442b4c3cfecb9f59..fc86c3a842d07704be28ccc1445fcfeccfe782d6 100644 (file)
@@ -1,43 +1,3 @@
-// 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)
@@ -400,7 +360,10 @@ float buf_load(string pFilename)
                return -1;
        fh = fopen(pFilename, FILE_READ);
        if(fh < 0)
-               return buf;
+       {
+               buf_del(buf);
+               return -1;
+       }
        i = 0;
        while((l = fgets(fh)))
        {
@@ -439,6 +402,8 @@ string GametypeNameFromType(float g)
        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";
 }
 
@@ -1402,18 +1367,22 @@ string textShortenToLength(string theText, float maxWidth, textLengthUpToLength_
                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) == "-")
        {
@@ -1422,7 +1391,9 @@ float isGametypeInFilter(float gt, float tp, string pattern)
                        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
@@ -1431,7 +1402,8 @@ float isGametypeInFilter(float gt, float tp, string pattern)
                        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;
@@ -1875,7 +1847,13 @@ float get_model_parameters(string m, float sk)
        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;
@@ -1940,3 +1918,98 @@ vector NearestPointOnBox(entity box, vector org)
        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);
+}
index 2de439ff2732a7775d9670b98e4ce3bd49d11fb2..a15855753217765d2396f6ab38f89e127a5060dc 100644 (file)
@@ -142,7 +142,7 @@ string getWrappedLine_remaining;
 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)
@@ -245,3 +245,13 @@ vector vec2(vector v);
 #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))
diff --git a/qcsrc/i18n-badwords.txt b/qcsrc/i18n-badwords.txt
new file mode 100644 (file)
index 0000000..828fe0a
--- /dev/null
@@ -0,0 +1,34 @@
+# 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:
diff --git a/qcsrc/i18n-guide.txt b/qcsrc/i18n-guide.txt
new file mode 100644 (file)
index 0000000..f2677fe
--- /dev/null
@@ -0,0 +1,31 @@
+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
index fc345e44588a1fba5f8c77714524b310101ae28b..48a45bda8465795e8883373ab088918783c4c0d3 100644 (file)
@@ -65,6 +65,7 @@ void AnimHost_removeAnim(entity me, entity other)
                n.prevSibling = p;
        else
                me.lastChild = p;
+       remove(other);
 }
 
 void AnimHost_removeAllAnim(entity me)
@@ -141,7 +142,6 @@ void AnimHost_finishAllAnim(entity me)
        {
                tmp = e;
                e = tmp.prevSibling;
-               me.removeAnim(me, tmp);
                tmp.finishAnim(tmp);
        }
 }
@@ -155,7 +155,6 @@ void AnimHost_finishObjAnim(entity me, entity obj)
                {
                        tmp = e;
                        e = tmp.prevSibling;
-                       me.removeAnim(me, tmp);
                        tmp.finishAnim(tmp);
                }
        }
@@ -167,15 +166,11 @@ void AnimHost_tickAll(entity me)
        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);
                }
        }
 }
index 9ebcbb8f5b170af8ce7a63e1472205c3fbf0b26b..b85546569a862e7c6d163d98833bd9a168ee53be 100644 (file)
@@ -27,6 +27,7 @@
 #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"
index a33cac91633ea8016b622d148b6840f6a1673a86..12b56d8dae8f2632ef8bbb84c847a2fde28863dd 100644 (file)
@@ -282,14 +282,14 @@ void draw_Text(vector theOrigin, string theText, vector theSize, vector theColor
 }
 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;
index 4b2b9cf0c921345dd48d4032b745a9971b2600b3..f3d780b6f55fe7edf13e8e18129b44199b110a6a 100644 (file)
@@ -31,6 +31,30 @@ void _dumptree_close(entity pass, entity me)
        }
 }
 
+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;
@@ -38,9 +62,9 @@ void GameCommand(string theCommand)
 
        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;
        }
@@ -51,6 +75,7 @@ void GameCommand(string theCommand)
        if(argv(0) == "sync")
        {
                loadAllCvars(main);
+               updateCompression();
                return;
        }
 
@@ -75,6 +100,12 @@ void GameCommand(string theCommand)
                return;
        }
 
+       if(argv(0) == "languageselect")
+       {
+               m_goto_language_selector();
+               return;
+       }
+
        if(argv(0) == "videosettings")
        {
                m_goto_video_settings();
@@ -100,6 +131,72 @@ void GameCommand(string theCommand)
                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")
        {
@@ -139,5 +236,5 @@ void GameCommand(string theCommand)
        }
 #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"));
 }
index 497d1cf661699974a640bcf86e28a22b8d840e57..52b960e456c5893fb2bebcc6c1e146169fa44c3d 100644 (file)
@@ -42,7 +42,6 @@ void Item_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOr
 {
        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)
index 236b2352221259a98b0e5604b4e3e2b06180b5c9..b23078bae061a91509793dc2dd415e542993a0cd 100644 (file)
@@ -57,8 +57,6 @@ void BorderImage_configureBorderImage(entity me, string theTitle, float sz, vect
 }
 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)
index 3d91229ec6669dcd6f3af7c1b56858db72708b2f..71ca11c7c3a439327f888e8edc605b7d6fa36e35 100644 (file)
@@ -8,6 +8,7 @@ CLASS(Button) EXTENDS(Label)
        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)
@@ -69,8 +70,6 @@ float Button_mouseDrag(entity me, vector pos)
 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)
@@ -79,7 +78,11 @@ 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;
@@ -88,7 +91,12 @@ void Button_showNotify(entity me)
 {
        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;
@@ -159,14 +167,5 @@ void Button_draw(entity me)
                        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
index 3d537bfb92f3bc74f735a00a3031100d335e6118..800a12681e4eb3d8b95ba4c0206baf1691cf5f3a 100644 (file)
@@ -78,7 +78,6 @@ void Dialog_fill(entity me)
 
 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);
@@ -156,7 +155,7 @@ void Dialog_configureDialog(entity me)
        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
index 139e87e1a03903baa96650e607b8347cb780d93f..dd752e6e54797aaac05e1bf5542621328810b097 100644 (file)
@@ -46,7 +46,7 @@ void Gecko_draw(entity me)
                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 );
        }
 }
 
index 2d64590306139cc97f1b860ac56c5e7a72de836a..5b07afd4eef2997d11b9ec5057379fd5ec89d478 100644 (file)
@@ -25,7 +25,7 @@ CLASS(InputBox) EXTENDS(Label)
        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
@@ -79,8 +79,16 @@ void InputBox_enterText(entity me, string ch)
        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);
 }
@@ -264,35 +272,6 @@ void InputBox_draw(entity me)
                                                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);
index 7ed6e4f68ef82daf3b33821aba270e691eba3a18..e3a6bee409897fb494704607e93db32da15af739 100644 (file)
@@ -5,6 +5,7 @@ CLASS(Label) EXTENDS(Item)
        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)
@@ -23,6 +24,7 @@ CLASS(Label) EXTENDS(Item)
        ATTRIB(Label, textEntity, entity, NULL)
        ATTRIB(Label, allowWrap, float, 0)
        ATTRIB(Label, recalcPos, float, 0)
+       ATTRIB(Label, condenseFactor, float, 1)
 ENDCLASS(Label)
 #endif
 
@@ -36,6 +38,32 @@ void Label_setText(entity me, string txt)
        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);
@@ -46,9 +74,42 @@ void Label_resizeNotify(entity me, vector relOrigin, vector relSize, vector absO
                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)
 {
@@ -72,17 +133,23 @@ void Label_draw(entity me)
                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;
@@ -90,15 +157,17 @@ void Label_draw(entity me)
                                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
index ba3fa6a9f28ca8c3dbbb31f11b85982ba8bede03..9664e93765575014aab68a8198ee3fc22bb3ca14 100644 (file)
@@ -277,6 +277,7 @@ void ListBox_draw(entity me)
        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;
@@ -284,7 +285,6 @@ void ListBox_draw(entity me)
                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();
@@ -297,6 +297,6 @@ void ListBox_clickListBoxItem(entity me, float i, vector where)
 
 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
index 2369a41077db5334d6ea9ac63348fe3fb47c2b56..304bf1dd241c053fa707c13a39898f4a0377fcbf 100644 (file)
@@ -149,8 +149,6 @@ void Nexposee_draw(entity me)
                me.animationState = 0;
        }
 
-       //print(ftos(me.animationState), "\n");
-
        f = min(1, frametime * 5);
        switch(me.animationState)
        {
index c8bab9bf80cda0314036564df6633b276d4da7d7..8861357b7700590438a82362ea8a7ece71a7a1fb 100644 (file)
@@ -10,6 +10,7 @@ CLASS(Slider) EXTENDS(Label)
        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))
@@ -47,7 +48,6 @@ ENDCLASS(Slider)
 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 {
@@ -61,7 +61,7 @@ void Slider_setSliderValue(entity me, float val)
 }
 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)
 {
@@ -156,7 +156,7 @@ float Slider_mouseDrag(entity me, vector pos)
        if(me.disabled)
                return 0;
 
-       anim.finishObjAnim(anim, me);
+       anim.removeObjAnim(anim, me);
        animed = me.animated;
        me.animated = false;
 
@@ -235,8 +235,6 @@ float Slider_mousePress(entity me, vector pos)
                        //me.mouseDrag(me, pos);
                }
        }
-       if(cvar("menu_sounds"))
-               localsound("sound/misc/menu2.wav");
        return 1;
 }
 float Slider_mouseRelease(entity me, vector pos)
@@ -244,12 +242,20 @@ 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;
index c4a7af7a890e6a5d84ae4cf727e7cde8d5c5151f..028a1603a16c35ef50e43577c587f2127e59b8d8 100644 (file)
@@ -26,9 +26,9 @@ string TextSlider_valueToIdentifier(entity me, float val)
 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)
index e325915c95e3791626f6c548f6b2383bbb9b0fee..e5d366eb7049cd92ea883e24444c0dcc5c441230 100644 (file)
@@ -3,9 +3,6 @@
 //////////////////////////////////////////////////
 // AK FIXME: Create perhaps a special builtin file for the common cmds
 
-//#define PROFILESTRZONE
-//#define FIXEDFOPEN
-
 float  checkextension(string ext) = #1;
 
 // error cmds
@@ -100,11 +97,7 @@ float       bound(float min,float value, float max)  = #45;
 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;
@@ -116,23 +109,8 @@ string     substring(string s, float start, float length)  = #54;
 
 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;
@@ -315,31 +293,34 @@ float CVAR_TYPEFLAG_READONLY = 32;
 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;
@@ -358,4 +339,5 @@ string(string format, ...) sprintf = #627;
 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:
index 7bec34ea0b0a1ff91aad1c9ed91d051f34ca7fc9..0894856f1f9e27f0b72334a23940dcd86e88252c 100644 (file)
@@ -21,11 +21,12 @@ void SUB_Null() { };
 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)
@@ -38,7 +39,7 @@ void() m_init =
                        s = getgamedirinfo(i, GETGAMEDIRINFO_NAME);
                        if not(s)
                                break;
-                       print(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
+                       dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
                }
        }
 }
@@ -115,18 +116,18 @@ void() m_init_delayed =
        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)))
@@ -183,7 +184,7 @@ void(float key, float ascii) m_keyup =
                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);
@@ -221,7 +222,7 @@ void(float key, float ascii) m_keydown =
                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;
@@ -341,11 +342,6 @@ float m_testtooltipbox(vector tooltippos)
                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;
 }
@@ -354,12 +350,12 @@ float m_allocatetooltipbox(vector pos)
        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
@@ -565,9 +561,11 @@ void() m_draw =
                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();
@@ -839,7 +837,9 @@ void(string itemname) m_goto =
        }
        else
        {
-               e = findstring(NULL, name, itemname);
+               for(e = NULL; (e = findstring(e, name, itemname)); )
+                       if(e.classname != "vtbl")
+                               break;
                if(e)
                {
                        m_hide();
@@ -858,10 +858,18 @@ void() m_goto_skin_selector =
        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");
 }
index 903700d5d54d5529e174a07feb4fc9a797569c6d..e42595e58265e8ba3553a2a3fd698931f2b6a2c6 100644 (file)
@@ -27,6 +27,7 @@ void m_hide();
 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;
 
index afea3e752fd871c079df07fd8cc013995297894c..ca8f4cf8e959ee7d2a5755e74e82def02d543c0b 100644 (file)
@@ -6,7 +6,7 @@ print "\n";
 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;
        }
@@ -51,6 +51,7 @@ SKINBEGIN
        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');
@@ -62,7 +63,7 @@ SKINBEGIN
        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');
 
@@ -101,6 +102,7 @@ SKINBEGIN
        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);
index 20da37d24e5d02f8204fefca6d61733dc59b3489..437c49bf72c3327f3b17b4ef70903fce63c47b4e 100644 (file)
@@ -17,7 +17,7 @@
 //#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
index 5522905bc2a54cdf1baa07371e6972895c5a846a..cbc7c47c40acbb84a88f39c154b7299428559531 100644 (file)
@@ -10,6 +10,8 @@ CLASS(XonoticButton) EXTENDS(Button)
        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
index e7667f69cfd64ceae7fd3bd7fd65b5397d5c18c6..04f7a083c2d32a035ac9bb5d15e6c2e1c127b72e 100644 (file)
@@ -281,8 +281,8 @@ void XonoticCampaignList_drawListBoxItem(entity me, float i, vector absSize, flo
        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)
index b888358c3748fe6919a39da1a3f038f90702bc84..66f292a0369588ae675b237fc0580d1d8cf34a04 100644 (file)
@@ -51,6 +51,25 @@ vector hslimage_color(vector v, vector margin)
         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;
index 3633553044c314c4fbc7c846ad6ea7e0e53079ec..f57c768a5fcb3d80ce4da5bc16d65845fcb5164a 100644 (file)
@@ -1,6 +1,6 @@
 #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))
@@ -12,23 +12,26 @@ CLASS(XonoticColorpickerString) EXTENDS(Image)
        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)
@@ -48,7 +51,6 @@ float XonoticColorpickerString_mouseDrag(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;
        }
 
@@ -74,10 +76,11 @@ void XonoticColorpickerString_draw(entity me)
        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
index 86609a659865c963c6485813867eaa53e0dd33ed..daf4d22f9c8dd95b221fdaf7c4134b628c4ccfc2 100644 (file)
@@ -30,7 +30,9 @@ void XonoticCreditsList_configureXonoticCreditsList(entity me)
 {
        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)
index 645b9320750fcedced0f2c6b7f0ec5947a7af888..434a7bc87fabe63b7ac17a9846f44a6772d4a3e3 100644 (file)
@@ -33,11 +33,15 @@ void XonoticCrosshairButton_configureXonoticCrosshairButton(entity me, float the
        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;
@@ -65,27 +69,45 @@ void XonoticCrosshairButton_draw(entity me)
        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
index d1116a70db870bcd7fbc9bb88ece64d9740d4dd4..03898a3f8b90ef48b11e74de917d8939a1dfe4dc 100644 (file)
@@ -15,7 +15,9 @@ CLASS(XonoticCvarList) EXTENDS(XonoticListBox)
        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)
@@ -33,6 +35,7 @@ entity makeXonoticCvarList();
 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
@@ -79,15 +82,15 @@ void XonoticCvarList_setSelected(entity me, float i)
        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);
@@ -162,6 +165,8 @@ float XonoticCvarList_keyDown(entity me, float scan, float ascii, float shift)
                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)
@@ -170,6 +175,13 @@ float XonoticCvarList_keyDown(entity me, float scan, float ascii, float shift)
                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);
@@ -180,4 +192,10 @@ void CvarList_Revert_Click(entity btn, entity me)
        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
index 7087d83cb9707987437edd588a45f71119ec8b14..f18658c7154197e1f1f7d535d0e8801d619d6631 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticDialog) EXTENDS(Dialog)
        // 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)
index 07c2fc4f293bca09b22c1089263c274e66324bc2..e90ae4b42590d08435472ea66b76c31e5a317fe4 100644 (file)
@@ -2,7 +2,7 @@
 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)
@@ -18,7 +18,7 @@ void XonoticCreditsDialog_fill(entity me)
        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;
 }
diff --git a/qcsrc/menu/xonotic/dialog_firstrun.c b/qcsrc/menu/xonotic/dialog_firstrun.c
new file mode 100644 (file)
index 0000000..6568a71
--- /dev/null
@@ -0,0 +1,72 @@
+#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
index 1e0d4bf92d6a9d9b64d9d3816d5bc4c4a71b6da3..299ea09fd7dc690b49584b108e570824cabfdff7 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,71 +15,18 @@ void XonoticHUDAmmoDialog_fill(entity me)
 {
        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
index 74fabe0518ac16fd7720e7f358001733555952b2..331b0ee9ae265e0fe29b67f27f316f00f9cedce2 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,74 +15,21 @@ void XonoticHUDChatDialog_fill(entity me)
 {
        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
index 8d359e9cf686e765750b03e5af9a437aaecc4443..b69a5869e79993603011a0646df5bb17cfa92b7c 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,66 +15,13 @@ void XonoticHUDEngineInfoDialog_fill(entity me)
 {
        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
index b276045b63183c6ba9412599affe4cbc970cf6ef..91da57cdfae8da55427c3dd189f5aed28b731505 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,86 +15,33 @@ void XonoticHUDHealthArmorDialog_fill(entity me)
 {
        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
index 56d4bf463649496243cf14c28cbfbb06150efffc..44b20294b7cc801eac215b0fd9421ab85702319c 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,66 +15,13 @@ void XonoticHUDInfoMessagesDialog_fill(entity me)
 {
        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
index ebd5f240bedf0603edcaa2689c23200cf935cf03..fd5d233dcf63b0acd5229864aaa5fe7e71b719da 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,61 +15,7 @@ void XonoticHUDModIconsDialog_fill(entity me)
 {
        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
index c811cb62832530fd9d5ee71dab5bb0d06767b5bb..1f26ab34aa92e3f909cc71a223dddc462e1d8be8 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,77 +15,24 @@ void XonoticHUDNotificationDialog_fill(entity me)
 {
        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
index 14f4a19268707a3100a0154bd34bb6b1ee3ae01e..e63e785528f0ef10de774a51eb6a364c9d41f2fc 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,86 +15,33 @@ void XonoticHUDPowerupsDialog_fill(entity me)
 {
        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
index 7d32914ddae7b437774f767c0882c7dc59e66179..b01ec1c9807620fd25deffc169c11aa55be765af 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,69 +15,19 @@ void XonoticHUDPressedKeysDialog_fill(entity me)
 {
        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
index febbd544975720e6d295b365176c09e1d2c2fb68..015979b21e72157675fb963f4c19e6208fa7eb9f 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,61 +15,7 @@ void XonoticHUDRaceTimerDialog_fill(entity me)
 {
        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
index 90de04795a9ee59a4f46ae36cc805cfcdaa64843..479c2bb333956c0cfaf275017e27dfd8b690f14e 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,94 +15,44 @@ void XonoticHUDRadarDialog_fill(entity me)
 {
        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
index 8c8561ea79b07aafd9867dbd0017e7ce4b3e226e..ccb8d9528bed1807833c8acaa8f0d2124e34b3d2 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,61 +15,7 @@ void XonoticHUDScoreDialog_fill(entity me)
 {
        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
index 748d2911ec71de5f631d062c4f6dc10f85ad1dca..5f2fc5dd747b63cf8d73589ecc90b377c59fae7f 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,66 +15,13 @@ void XonoticHUDTimerDialog_fill(entity me)
 {
        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
index 6c935d9e7f105d3131b3e8e344d9c0b9e51ec970..d3d35c22a45b19a2cd975509e43f74f5f8ee470e 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,64 +15,11 @@ void XonoticHUDVoteDialog_fill(entity me)
 {
        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
index 538723bce1c945462614af9926f080266df22007..394ec332385df0807d9b86146209cbffa8ec293e 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -17,98 +17,46 @@ void XonoticHUDWeaponsDialog_fill(entity me)
        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);
 }
index 3f8bcebd778877e07fedf9e9653930225876b69e..e449fa5d4814a77b2cd9a933c0779a4ff48b6027 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -18,95 +18,95 @@ void XonoticHUDExitDialog_fill(entity me)
        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)));
@@ -114,6 +114,6 @@ void XonoticHUDExitDialog_fill(entity me)
                        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
index e755710c5b31bb0bb69de0cb5d85be32c85f4380..2492581d0603178b2b43dd9b372b38e57c7f667f 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,14 +15,10 @@ void XonoticMultiplayerDialog_fill(entity me)
        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);
index 3aea0e4858615ec2b5f2e8c72d4a49426daf16f5..2d9689f64422e5d527692b91b753a30afb6268a8 100644 (file)
@@ -2,7 +2,7 @@
 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)
@@ -32,146 +32,92 @@ void XonoticServerCreateTab_fill(entity me)
        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;
@@ -206,17 +152,17 @@ void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
        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);
 }
index a49e3529c0cbcc099a78094f1e68e690fc01ce86..226f346b643ae55e715a7b5e5cf87eea887412cf 100644 (file)
@@ -3,10 +3,10 @@ CLASS(XonoticAdvancedDialog) EXTENDS(XonoticDialog)
        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)
@@ -22,45 +22,64 @@ void XonoticAdvancedDialog_fill(entity me)
 {
        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;
 }
index bd54aa219400ad57f61fe675d8666e8c31e5062a..677161b637077ff6aab7d7b57f329e4cc965c9f5 100644 (file)
@@ -2,10 +2,10 @@
 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)
@@ -14,20 +14,7 @@ CLASS(XonoticMapInfoDialog) EXTENDS(XonoticDialog)
        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)
@@ -59,7 +46,7 @@ void XonoticMapInfoDialog_loadMapInfo(entity me, float i, entity mlb)
        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);
@@ -69,85 +56,57 @@ void XonoticMapInfoDialog_loadMapInfo(entity me, float i, entity mlb)
        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, ""));
@@ -157,10 +116,10 @@ void XonoticMapInfoDialog_fill(entity me)
        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
 }
index 37a4669c512e0174adf448a4e1c222bc3e3fbc20..640c28a348242e28290883f6246a8bec7b01e042 100644 (file)
@@ -4,10 +4,10 @@ CLASS(XonoticMutatorsDialog) EXTENDS(XonoticDialog)
        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)
@@ -30,9 +30,9 @@ string WeaponArenaString()
        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)
@@ -53,7 +53,7 @@ string 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);
 
@@ -65,39 +65,37 @@ string XonoticMutatorsDialog_toString(entity me)
        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);
 }
@@ -163,23 +161,23 @@ void XonoticMutatorsDialog_fill(entity me)
        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);
@@ -188,39 +186,36 @@ void XonoticMutatorsDialog_fill(entity me)
                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);
@@ -241,7 +236,7 @@ void XonoticMutatorsDialog_fill(entity me)
        }
        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;
@@ -249,29 +244,29 @@ void XonoticMutatorsDialog_fill(entity me)
                        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;
 }
index ec57b7fca809ec5e917f1bceafc6d82e59bf07c5..85171e094099818a2fc3f93b5fc359368dad932f 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -25,12 +25,12 @@ void XonoticDemoBrowserTab_fill(entity me)
        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;
@@ -40,10 +40,10 @@ void XonoticDemoBrowserTab_fill(entity me)
        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;
 }
index 799d33455f19f0015025c141d4e84612c01089ab..ee451744fb8899942380f76248d7ff8bfa638f51 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -25,23 +25,23 @@ void XonoticServerListTab_fill(entity me)
        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'));
@@ -53,21 +53,23 @@ void XonoticServerListTab_fill(entity me)
                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;
index 5f6262cf45e5bdb508f69dd32f7117cd4b9c673e..d396e7bbcc747a449a2cd482c743ca5564b0d582 100644 (file)
@@ -2,9 +2,9 @@
 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)
 
@@ -56,8 +56,8 @@ void Join_Click(entity btn, entity me);
 #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);
@@ -112,8 +112,8 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
        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);
@@ -123,6 +123,7 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
                typestr = argv(0);
                versionstr = argv(1);
        }
+       freeslots = -1;
        for(j = 2; j < m; ++j)
        {
                if(argv(j) == "")
@@ -131,6 +132,8 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
                v = substring(argv(j), 1, -1);
                if(k == "P")
                        pure = stof(v);
+               else if(k == "S")
+                       freeslots = stof(v);
        }
 
        me.currentServerType = strzone(typestr);
@@ -145,14 +148,17 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
        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);
 
@@ -163,7 +169,7 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
        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);
 
@@ -174,13 +180,13 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
 
        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);
 
@@ -188,35 +194,35 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
        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);
@@ -237,7 +243,7 @@ void XonoticServerInfoDialog_fill(entity me)
                        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;
@@ -245,70 +251,70 @@ void XonoticServerInfoDialog_fill(entity me)
        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;
 }
index 2a075f4c921e943a796e2483eedeace3b48d6e1e..2b7b9a38464ab62cfe8c4285a6464ee2e3ceec6f 100644 (file)
@@ -2,7 +2,7 @@
 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)
@@ -37,7 +37,7 @@ void XonoticPlayerSettingsTab_fill(entity me)
        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;
@@ -46,7 +46,8 @@ void XonoticPlayerSettingsTab_fill(entity me)
        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));
@@ -59,7 +60,7 @@ void XonoticPlayerSettingsTab_fill(entity me)
        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;
@@ -84,117 +85,113 @@ void XonoticPlayerSettingsTab_fill(entity me)
                }
 
        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)
 {
index dcc6a64f3681652d777d6fcf090ccf9779b60059..5805d2ea11de914382ad11beb108db1f71f60a55 100644 (file)
@@ -1,56 +1,45 @@
 #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
index ca6d705c6fd68df9a85226533dd8573c9601faa5..d20a6483bb425e4f9735c6fbf8dc7d24b317221e 100644 (file)
@@ -3,11 +3,11 @@ CLASS(XonoticWeaponsDialog) EXTENDS(XonoticDialog)
        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
@@ -26,33 +26,33 @@ void XonoticWeaponsDialog_fill(entity me)
        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;
 }
index cfe91afceece6fe5e7ca8c57dc7fe2877203ece5..f638c770d1365cb9037a7c5d02669ae9779fd260 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,6 +15,6 @@ void XonoticNewsDialog_fill(entity me)
        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
index 0229e026766d4037daa76339c003a3e910f4a80f..6d9dde47b30d80dd2be57c1b396dde04e13f192f 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -14,11 +14,11 @@ void XonoticQuitDialog_fill(entity me)
 {
        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;
 }
index 1f19bf656531e1bc26d27d9f49e487ec5395515e..1f084a16cc0e9600cc4743626a9b8789a8c4d157 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -15,12 +15,12 @@ void XonoticSettingsDialog_fill(entity me)
        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);
index ddde45d2b8706199d98841aa3a5c336d9774c98e..e38a87be66211eb41366ed773f891aca3d12b668 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -24,155 +24,157 @@ void XonoticAudioSettingsTab_fill(entity me)
 
        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
index 19b232f8ca504f2abffc9e454be90f6b72292e0f..53903aac7a8e5f172a5b1568676448389e390a71 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -30,80 +30,52 @@ float someShadowCvarIsEnabled(entity box)
        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);
@@ -116,108 +88,109 @@ void XonoticEffectsSettingsTab_fill(entity me)
                                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
index df3bd084a5ec4633be91cd4a651b598c9f092974..ee244931d6a440d3d14679b76827c3311a511d57 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -23,55 +23,46 @@ void XonoticInputSettingsTab_fill(entity me)
        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
index 3cdfa95b739c957670fc42ff5d17a36e2c3098f4..aaf182fcd80e93a92e15ca4ca5af48ae27481534 100644 (file)
@@ -2,7 +2,7 @@
 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)
@@ -36,19 +36,19 @@ void XonoticUserbindEditDialog_fill(entity me)
 {
        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;
 }
index 89c8471ca7229651062577bf6dbc506a8be09fa1..7fa3dc66b329ce71fe66889df08def1fa20fcae7 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -23,54 +23,65 @@ void XonoticMiscSettingsTab_fill(entity me)
        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;
 }
index 0d846caf2ae5f60643f4b8b376bd7a0c89e86278..be2b64259cf15bf615835df26f44833247873dae 100644 (file)
@@ -1,9 +1,8 @@
 #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)
@@ -16,17 +15,13 @@ void XonoticCvarsDialog_showNotify(entity me)
 {
        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;
@@ -36,19 +31,21 @@ void XonoticCvarsDialog_fill(entity me)
        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;
@@ -56,12 +53,12 @@ void XonoticCvarsDialog_fill(entity me)
                        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;
 }
index 6e0c472afb4dc07a92a6a175f457d584353323a5..9b6b7c33037fffef60d3f07564eb06f7405f8105 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -23,38 +23,38 @@ void XonoticNetworkSettingsTab_fill(entity me)
        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
index 0aa5e68cc3a6e8391d04428b74f4984546d71aba..38b236b62ba30cd6dff8df14b4cca9c4619647c2 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -23,86 +23,85 @@ void XonoticVideoSettingsTab_fill(entity me)
        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
index 560192ff1d6edfdb6021f796b8de44e7b74c1938..81eb68e39232bd09e078bcf9d9bb7d1990be6290 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -56,14 +56,14 @@ void XonoticSingleplayerDialog_fill(entity me)
 
        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());
@@ -77,7 +77,7 @@ void XonoticSingleplayerDialog_fill(entity me)
                        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;
 }
index 5d377e6d0a1747d0884fa1f235fef802cc413e17..8e584b8a8a259866636932eccce69630a840747a 100644 (file)
@@ -1,7 +1,7 @@
 #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)
@@ -18,7 +18,7 @@ void XonoticWinnerDialog_fill(entity me)
                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;
 }
index e0908ee364d76d3b4666adfb3dbe1ad981cfcb36..7fb154c8a29ba3d4193e375626ec9ee57edfbe89 100644 (file)
@@ -2,7 +2,7 @@
 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)
@@ -38,17 +38,17 @@ void XonoticTeamSelectDialog_fill(entity me)
 {
        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
 
diff --git a/qcsrc/menu/xonotic/gametypelist.c b/qcsrc/menu/xonotic/gametypelist.c
new file mode 100644 (file)
index 0000000..ec21c65
--- /dev/null
@@ -0,0 +1,85 @@
+#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
index e457414b4a4ed411b422a7c0404925cab92c7603..2a9c094b8eb07a74ac6752562b3eecfb87cd200a 100644 (file)
@@ -20,6 +20,8 @@ CLASS(XonoticInputBox) EXTENDS(InputBox)
        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
@@ -54,6 +56,8 @@ void XonoticInputBox_setText(entity me, string new)
        {
                SUPER(XonoticInputBox).setText(me, new);
                me.onChange(me, me.onChangeEntity);
+               if(me.saveImmediately)
+                       me.saveCvars(me);
        }
        else
                SUPER(XonoticInputBox).setText(me, new);
index 01ed3a55375d9ca6503790c3707eb0f1cede091d..f4a6c5a3e3dc40adbefdaf5d4eb1f7a75b94be4a 100644 (file)
@@ -33,6 +33,8 @@ void KeyBinder_Bind_Edit(entity btn, entity me);
 
 #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];
@@ -45,7 +47,7 @@ void Xonotic_KeyBinds_Read()
        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)))
@@ -130,10 +132,12 @@ void XonoticKeyBinder_keyGrabbed(entity me, float key, float ascii)
                {
                        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)
 {
@@ -191,9 +195,10 @@ void KeyBinder_Bind_Clear(entity btn, entity me)
        {
                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)
 {
diff --git a/qcsrc/menu/xonotic/languagelist.c b/qcsrc/menu/xonotic/languagelist.c
new file mode 100644 (file)
index 0000000..0ea54db
--- /dev/null
@@ -0,0 +1,184 @@
+#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
index 72e5faac36fa62d140a0d52b95e55853b2b24252..bd15150a8cfb59ac1ec45e390a5b9c4a831cf801 100644 (file)
@@ -1,6 +1,8 @@
 #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)
@@ -12,23 +14,38 @@ CLASS(MainWindow) EXTENDS(ModalController)
        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);
@@ -173,6 +190,9 @@ void MainWindow_configureMainWindow(entity me)
        me.moveItemAfter(me, n, NULL);
 
        me.initializeDialog(me, n);
+
+       if(cvar_string("_cl_name") == "Player")
+               me.dialogToShow = me.firstRunDialog;
 }
 #endif
 
index 8b5ce6d6a7b46a3a9c58f0e1b090b47ee71c52c0..69757126b4c2a83fdd945f8eba0fd1b041544e0c 100644 (file)
@@ -275,26 +275,30 @@ void MapList_LoadMap(entity btn, entity me)
        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
index bbef3a6b1c2d6acdeb245a401e18f3d4b1afa00c..ef02224dfaf8bc332b45d4947b78f131fcb33e83 100644 (file)
@@ -47,7 +47,7 @@ void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
        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;
 
@@ -77,11 +77,11 @@ void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
                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);
@@ -171,7 +171,7 @@ void XonoticPlayerModelSelector_draw(entity me)
 
        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;
        }
 
index efc00822d8f72456979fd721890afcfe4798e3af..e8c9db364e9d3caaa31f4ee904b82ebc08c33523 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticRootDialog) EXTENDS(XonoticDialog)
        // 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)
index ce9676f3781dbafaf81d8f267917d4ebcbfdbbfa..0e4760e3ff3522af46781e235cc1a8cbfdcd1190 100644 (file)
@@ -8,6 +8,8 @@ CLASS(XonoticServerList) EXTENDS(XonoticListBox)
        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)
@@ -50,6 +52,9 @@ CLASS(XonoticServerList) EXTENDS(XonoticListBox)
        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);
@@ -58,6 +63,7 @@ void ServerList_ShowFull_Click(entity box, 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
@@ -102,6 +108,8 @@ float IsFavorite(string srv)
        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)
@@ -171,6 +179,14 @@ void ToggleFavorite(string srv)
        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;
@@ -242,7 +258,10 @@ void XonoticServerList_refreshServerList(entity me, float mode)
                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 != "")
@@ -306,6 +325,7 @@ void XonoticServerList_draw(entity me)
 
        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)
@@ -345,12 +365,7 @@ void XonoticServerList_draw(entity me)
        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;
        }
 
@@ -493,11 +508,11 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
        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;
@@ -505,11 +520,11 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
        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;
@@ -557,14 +572,17 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        // 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
@@ -596,6 +614,19 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        }
 
        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))
        {
@@ -628,21 +659,35 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        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);
@@ -674,8 +719,11 @@ float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
        }
        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)
        {
index 864b3054a5bb85dccbabb3b538ecf76bc0b8fb82..bb01f974cbf1d0c6312b57cd8ec40c1f0107edca 100644 (file)
@@ -102,10 +102,10 @@ void XonoticSkinList_getSkins(entity me)
        {
                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");
@@ -160,7 +160,7 @@ void XonoticSkinList_drawListBoxItem(entity me, float i, vector absSize, float i
        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);
 
index 0e4b4e3720e8c0bece5fe57d26cf79620c6428ce..24edb4cb91b6deef418b7d17053411e4912a578b 100644 (file)
@@ -47,10 +47,10 @@ void XonoticDecibelsSlider_saveCvars(entity me)
 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
index e906242fe44fc90c3cdcc80bad6afa213e8c9317..ddedc4bab2901e2cd077a60c475aef525f223e80 100644 (file)
@@ -3,6 +3,7 @@ CLASS(XonoticPicmipSlider) EXTENDS(XonoticTextSlider)
        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
@@ -19,23 +20,26 @@ void XonoticPicmipSlider_configureXonoticPicmipSlider(entity me)
 {
        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!
index de34a410d9fb2ef9722efb6b9e28382f11b563dd..d5d013048e9c67b874487f84a7d2f15bacee8192 100644 (file)
@@ -62,7 +62,7 @@ entity makeXonoticResolutionSlider()
 }
 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)
@@ -83,11 +83,24 @@ 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)
index 9a40ba25be82174cce4fe4c25c1f01393aeafe15..1d21ba4910a7a391b8d3a87b40bc27f988fe5353 100644 (file)
@@ -1,11 +1,22 @@
+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)
@@ -13,14 +24,20 @@ 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;
 }
@@ -229,66 +246,81 @@ void setDependentWeird(entity e, float(entity) func)
        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()
 {
@@ -302,7 +334,7 @@ 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;
@@ -341,26 +373,64 @@ void preMenuDraw()
 
        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
@@ -401,3 +471,164 @@ string HUD_Panel_GetSettingName(float theSetting)
                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);
+}
index 78eb7c1c43caa7cea3019c50652e7ab4173497db..0d31f0150a6208b0ec1a3e33e8e67b36297b753d 100644 (file)
@@ -1,3 +1,6 @@
+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);
@@ -20,3 +23,28 @@ string getZonedTooltipForIdentifier(string s);
 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()
diff --git a/qcsrc/server/accuracy.qc b/qcsrc/server/accuracy.qc
new file mode 100644 (file)
index 0000000..4d63fd8
--- /dev/null
@@ -0,0 +1,125 @@
+.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;
+}
diff --git a/qcsrc/server/accuracy.qh b/qcsrc/server/accuracy.qh
new file mode 100644 (file)
index 0000000..84488fc
--- /dev/null
@@ -0,0 +1,16 @@
+.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);
index 5e7eb707565c6ed0d54eaf9bee4442afb74632b6..d00c60b09d8b47134f9f0a18c94ac7d007bfa08d 100644 (file)
@@ -1,3 +1,5 @@
+.float anticheat_jointime;
+
 void mean_accumulate(entity e, .float a, .float c, float mean, float value, float weight)
 {
        if(weight == 0)
@@ -67,14 +69,14 @@ void anticheat_physics()
        {
                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
@@ -88,7 +90,7 @@ void anticheat_physics()
                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;
        }
 
@@ -151,14 +153,26 @@ void anticheat_prethink()
        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()
@@ -169,6 +183,7 @@ void anticheat_serverframe()
 void anticheat_init()
 {
        self.anticheat_speedhack_offset = 0;
+       self.anticheat_jointime = servertime;
 }
 
 void anticheat_shutdown()
index 046743151dbc02fd27dbd706a77d8065418397b6..5110d373b8a682e657e1a5f10201c2c91303dbba 100644 (file)
@@ -24,6 +24,14 @@ void func_breakable_reset();
 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.
@@ -33,12 +41,16 @@ void reset_map(float dorespawn)
        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;
@@ -46,7 +58,7 @@ void reset_map(float dorespawn)
        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)
                {
@@ -92,6 +104,11 @@ void reset_map(float dorespawn)
                                self.classname = "player";
                                PutClientInServer();
                        }
+                       else if(g_freezetag)
+                       {
+                               if(self.classname == "player")
+                                       PutClientInServer();
+                       }
                        else
                        {
                                /*
@@ -120,7 +137,7 @@ void reset_map(float dorespawn)
        }
 
        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)
@@ -191,8 +208,9 @@ void Arena_Warmup()
 {
        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);
@@ -228,7 +246,8 @@ void Arena_Warmup()
                        else if(f == 1)
                                Announce("1");
 
-                       centerprint(self, msg);
+            FOR_EACH_PLAYER(e)
+                centerprint(e, msg);
                }
 
                if (g_arena) {
@@ -251,19 +270,104 @@ void Arena_Warmup()
                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
@@ -273,34 +377,16 @@ float redalive, bluealive;
  */
 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);
@@ -318,7 +404,7 @@ void Spawnqueue_Check()
                                        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;
                        }
@@ -348,6 +434,12 @@ void Spawnqueue_Check()
                        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)
index d7ea87d33211d9799b9fbef9ed45bf1139676a15..05b2cc750232e5fbc65a5136decf6d524c864fee 100644 (file)
@@ -71,7 +71,11 @@ void assault_objective_decrease_use() {
        }
 
        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!
 
@@ -92,6 +96,17 @@ void assault_objective_decrease_use() {
 
                        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();
@@ -137,7 +152,11 @@ void target_objective_decrease_activate()
        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;
@@ -145,7 +164,12 @@ void target_objective_decrease_activate()
                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');
@@ -251,31 +275,30 @@ void assault_roundstart_use() {
        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
-*/
+
 
 }
 
index 36334b27127b218ece882fbbc6ea47da559fdad9..7c3bcf89773028335cd3541289953e1712d30cd2 100644 (file)
-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;
index d1c9a5a402fb4d684984795e8a019793744dc66c..9ef109e2b585e3c76053c7b183fbc49da22543ff 100644 (file)
@@ -109,6 +109,10 @@ float bot_shouldattack(entity e)
                        return FALSE;
        }
 
+       if(g_freezetag)
+               if(e.freezetag_frozen)
+                       return FALSE;
+
        if(teams_matter)
        {
                if(e.team==0)
@@ -172,7 +176,7 @@ float bot_aimdir(vector v, float maxfiredeviation)
        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));
@@ -202,25 +206,25 @@ float bot_aimdir(vector v, float maxfiredeviation)
        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
@@ -244,7 +248,7 @@ float bot_aimdir(vector v, float maxfiredeviation)
        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;
@@ -260,12 +264,12 @@ float bot_aimdir(vector v, float maxfiredeviation)
 
        // 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;
@@ -335,10 +339,10 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a
        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))
@@ -349,18 +353,19 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a
        {
                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;
 };
index 945600a886b208e6af45bb58aba71cd5d304a4ce..581e3f0c758050dae69b33c9c983a98a4ba735c4 100644 (file)
@@ -33,17 +33,17 @@ void bot_think()
                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;
@@ -112,21 +112,21 @@ void bot_setnameandstuff()
        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();
@@ -177,7 +177,7 @@ void bot_setnameandstuff()
 
        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
@@ -204,7 +204,7 @@ void bot_setnameandstuff()
        self.bot_preferredcolors = self.clientcolors;
 
        // pick the name
-       if (cvar("bot_usemodelnames"))
+       if (autocvar_bot_usemodelnames)
                name = bot_model;
        else
                name = bot_name;
@@ -241,15 +241,15 @@ void bot_custom_weapon_priority_setup()
 
        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;
@@ -268,7 +268,7 @@ void bot_custom_weapon_priority_setup()
        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){
@@ -282,7 +282,7 @@ void bot_custom_weapon_priority_setup()
                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){
@@ -296,7 +296,7 @@ void bot_custom_weapon_priority_setup()
                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){
@@ -498,20 +498,20 @@ void autoskill(float factor)
        }
        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
@@ -536,13 +536,13 @@ void bot_serverframe()
        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;
@@ -563,16 +563,16 @@ void bot_serverframe()
        // 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);
@@ -585,7 +585,7 @@ void bot_serverframe()
                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)
@@ -606,11 +606,11 @@ void bot_serverframe()
 
        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)
@@ -651,15 +651,15 @@ void bot_serverframe()
                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)
index 0550431e968bd8b31b49a7c7546a89faed272bd5..9e6d447e6a8d22ef3b9e857e32f00efe67b282d1 100644 (file)
@@ -108,8 +108,6 @@ void bot_serverframe();
  * Imports
  */
 
-float sv_maxspeed;
-
 void() havocbot_setupbot;
 
 float c1, c2, c3, c4;
index 934aba87ddc6fd2f175fcbde18459dc3de57f694..fde9a26db2751c9dba3a4262081624dd0fccf792 100644 (file)
@@ -21,7 +21,8 @@ void havocbot_ai()
                }
                else
                {
-                       self.havocbot_role();
+                       if not(self.jumppadcount)
+                               self.havocbot_role();
                }
 
                // TODO: tracewalk() should take care of this job (better path finding under water)
@@ -80,7 +81,7 @@ void havocbot_ai()
        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();
@@ -93,7 +94,7 @@ void havocbot_ai()
                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;
@@ -128,7 +129,7 @@ void havocbot_ai()
                        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);
@@ -154,7 +155,7 @@ void havocbot_keyboard_movement(vector destorg)
 
        sk = skill + self.bot_moveskill;
 
-       maxspeed = cvar("sv_maxspeed");
+       maxspeed = autocvar_sv_maxspeed;
 
        if (time < self.havocbot_keyboardtime)
                return;
@@ -169,7 +170,7 @@ void havocbot_keyboard_movement(vector destorg)
 
        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
@@ -216,7 +217,7 @@ void havocbot_keyboard_movement(vector destorg)
        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;
 };
@@ -227,18 +228,20 @@ void havocbot_bunnyhop(vector dir)
        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)
        {
@@ -274,7 +277,7 @@ void havocbot_bunnyhop(vector dir)
                        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;
@@ -282,7 +285,7 @@ void havocbot_bunnyhop(vector dir)
                                        // 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;
@@ -305,7 +308,7 @@ void havocbot_bunnyhop(vector dir)
                                                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;
@@ -316,7 +319,7 @@ void havocbot_bunnyhop(vector dir)
                                        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
@@ -337,6 +340,7 @@ void havocbot_bunnyhop(vector dir)
        }
 
        // Release jump button
+       if(!cvar("sv_pogostick"))
        if(self.flags & FL_ONGROUND == 0)
        {
                if(self.velocity_z < 0 || vlen(self.velocity)<maxspeed)
@@ -379,7 +383,7 @@ void havocbot_movetogoal()
        //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)
@@ -414,7 +418,7 @@ void havocbot_movetogoal()
                        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)
                        {
@@ -452,14 +456,7 @@ void havocbot_movetogoal()
        // 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)
@@ -491,7 +488,7 @@ void havocbot_movetogoal()
                                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;
@@ -507,11 +504,20 @@ void havocbot_movetogoal()
                                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)
@@ -559,7 +565,7 @@ void havocbot_movetogoal()
 
                        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))
@@ -579,7 +585,7 @@ void havocbot_movetogoal()
                                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;
                        }
                }
@@ -702,7 +708,7 @@ void havocbot_movetogoal()
                                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;
                                }
@@ -726,7 +732,7 @@ void havocbot_movetogoal()
                        // (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
@@ -808,10 +814,10 @@ void havocbot_movetogoal()
        // 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);
 };
@@ -821,7 +827,7 @@ void havocbot_chooseenemy()
        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;
@@ -847,7 +853,7 @@ void havocbot_chooseenemy()
                        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
@@ -858,7 +864,7 @@ void havocbot_chooseenemy()
        }
        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;
@@ -871,7 +877,7 @@ void havocbot_chooseenemy()
                {
                        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))
                        {
@@ -887,7 +893,7 @@ void havocbot_chooseenemy()
 
                // 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;
@@ -941,34 +947,18 @@ void havocbot_chooseweapon()
                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
@@ -976,7 +966,7 @@ void havocbot_chooseweapon()
 
        combo = FALSE;
 
-       if(cvar("bot_ai_weapon_combo"))
+       if(autocvar_bot_ai_weapon_combo)
        if(self.weapon == self.lastfiredweapon)
        if(af > combo_time)
        {
@@ -1026,142 +1016,6 @@ void havocbot_chooseweapon()
                        }
                }
        }
-
-#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()
@@ -1333,7 +1187,7 @@ vector havocbot_dodge()
 {
        // 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;
@@ -1346,7 +1200,7 @@ vector havocbot_dodge()
                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;
@@ -1378,5 +1232,5 @@ vector havocbot_dodge()
                head = head.chain;
        }
        return dodge;
-       */
+#endif
 };
index 1cb91819d551a1c6bfe36acbd2f19ea841bf3060..0ec0abb3ce5c1427d7fb8140928bd65b75cb943a 100644 (file)
@@ -251,7 +251,7 @@ void havocbot_role_ctf_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_ourbase(50000);
@@ -324,7 +324,7 @@ void havocbot_role_ctf_escort()
        // 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);
@@ -404,7 +404,7 @@ void havocbot_role_ctf_offense()
 
        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);
@@ -453,7 +453,7 @@ void havocbot_role_ctf_retriever()
                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);
@@ -502,7 +502,7 @@ void havocbot_role_ctf_middle()
                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);
@@ -554,7 +554,7 @@ void havocbot_role_ctf_defense()
                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
index 7ac4a5fe66383d6d23d39aaeae12bb2075d32d41..8e30b37b5c569ce3f900f9b3e95934a0cef3acd3 100644 (file)
@@ -50,7 +50,7 @@ void havocbot_role_kh_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();
 
                if(kh_Key_AllOwnedByWhichTeam() == self.team)
@@ -88,7 +88,7 @@ void havocbot_role_kh_defense()
        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();
@@ -130,7 +130,7 @@ void havocbot_role_kh_offense()
        {
                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();
@@ -180,7 +180,7 @@ void havocbot_role_kh_freelancer()
        {
                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();
index 3268daefa5a5ae601056dc02a1b6d6142ee3662f..bc84340287ff8938e5e3b60d80d9073f41443095 100644 (file)
@@ -35,7 +35,7 @@ void havocbot_goalrating_ons_offenseitems(float ratingscale, vector org, float s
                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)
@@ -319,7 +319,7 @@ void havocbot_role_ons_offense()
                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;
        }
 };
 
index d2f6b900084fa685cfcf126bc54b2bb656d48d91..514c364ac723963e1617e17ee3bc5ac28287bbf6 100644 (file)
@@ -112,7 +112,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius)
 
                        // 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);
 
                }
@@ -150,7 +150,7 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi
        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
@@ -212,7 +212,7 @@ void havocbot_role_dom()
 
        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);
@@ -231,7 +231,7 @@ void havocbot_role_dm()
 
        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);
@@ -251,7 +251,7 @@ void havocbot_role_race()
        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);
@@ -274,6 +274,24 @@ void havocbot_role_race()
        }
 };
 
+// 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;
@@ -289,10 +307,14 @@ void havocbot_chooserole_dom()
        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();
@@ -304,6 +326,8 @@ void havocbot_chooserole()
                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();
 };
index cb6d16c3fc2d80e9482a54e98793c4831d80a44f..9e1a92a22249465776fba51660cd37bc25d96191 100644 (file)
@@ -653,8 +653,8 @@ void navigation_routerating(entity e, float f, float rangebias)
        // 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;
 
@@ -706,9 +706,9 @@ void navigation_routerating(entity e, float f, float rangebias)
                        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");
 
@@ -719,8 +719,8 @@ void navigation_routerating(entity e, float f, float rangebias)
                                // (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
@@ -897,6 +897,7 @@ void navigation_goalrating_start()
        self.navigation_jetpack_goal = world;
        navigation_bestrating = -1;
        self.navigation_hasgoals = FALSE;
+       navigation_clearroute();
        navigation_bestgoal = world;
        navigation_markroutes(world);
 };
index 196e3d7b6963d5ba34ac2e56b0ca679645360264..ef25a958d21f8908545ad4c51ba32dfb11754818 100644 (file)
@@ -868,14 +868,14 @@ float bot_presskeys()
                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;
@@ -1269,7 +1269,7 @@ float bot_execute_commands_once()
        }
        else
        {
-               if(cvar("g_debug_bot_commands"))
+               if(autocvar_g_debug_bot_commands)
                {
                        local string parms;
 
index 4f3640e26eac35786e17dea56cdb15bdef6c97c7..b39e59f762343fe4d15e2aa7ed5fc7519e41f82a 100644 (file)
@@ -37,7 +37,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
                        }
                        else
                        {
-                               if(cvar("developer"))
+                               if(autocvar_developer)
                                {
                                        print("A generated waypoint is stuck in solid at ", vtos(w.origin), "\n");
                                        backtrace("Waypoint stuck");
@@ -50,7 +50,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        waypoint_clearlinks(w);
        //waypoint_schedulerelink(w);
 
-       if (cvar("g_waypointeditor"))
+       if (autocvar_g_waypointeditor)
        {
                m1 = w.mins;
                m2 = w.maxs;
@@ -154,8 +154,8 @@ void waypoint_think()
        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;
@@ -251,7 +251,7 @@ void waypoint_schedulerelink(entity wp)
        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;
index 300d01a7a56607b031a28e5e0d419c2dbadd42ea..9a36546716d6dc644512e2536a1f449791be55c8 100644 (file)
@@ -64,13 +64,13 @@ void CampaignPreInit()
 {
        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)
@@ -79,7 +79,7 @@ void CampaignPreInit()
                return;
        }
 
-       baseskill = cvar("g_campaign_skill");
+       baseskill = autocvar_g_campaign_skill;
        baseskill = baseskill + campaign_botskill[0];
        if(baseskill < 0)
                baseskill = 0;
@@ -101,7 +101,7 @@ void CampaignPreInit()
 
        // 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;
@@ -188,7 +188,7 @@ void CampaignPreIntermission()
 
        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");
@@ -196,12 +196,12 @@ void CampaignPreIntermission()
                }
                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");
index 8d837b801453091e65b6443b00ea3a1ed4991721..fc54d49148835d9ed584c1632866f22ccaedc1f4 100644 (file)
@@ -14,7 +14,7 @@ void Drag_MoveDrag(entity from, entity to) { }
 #else
 
 .float maycheat;
-float sv_cheats;
+float gamestart_sv_cheats;
 
 #define CHIMPULSE_SPEEDRUN_INIT 30
 #define CHIMPULSE_GIVE_ALL 99
@@ -28,7 +28,7 @@ float sv_cheats;
 
 void CheatInit()
 {
-       sv_cheats = cvar("sv_cheats");
+       gamestart_sv_cheats = autocvar_sv_cheats;
 }
 
 void CheatShutdown()
@@ -61,7 +61,7 @@ float CheatsAllowed(float i, float argc, float fr) // the cheat gets passed as a
                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.
@@ -180,10 +180,10 @@ float CheatImpulse(float i)
                                        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;
                                }
@@ -215,7 +215,7 @@ float CheatImpulse(float i)
                        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;
@@ -303,7 +303,7 @@ float CheatCommand(float argc)
                                // 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();
@@ -318,7 +318,7 @@ float CheatCommand(float argc)
                                // 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)
                                {
@@ -606,7 +606,7 @@ float CheatCommand(float argc)
                        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();
index cb365a3ba46f6363c73bdce67c0c2813cce5aa53..8c276919c51082206169b6050dd44335d7d1fc84 100644 (file)
@@ -1,3 +1,5 @@
+float autocvar_sv_cheats; // must... declare... global
+
 float cheatcount_total;
 .float cheatcount;
 void CheatInit();
index abdd41ebe93649243ea01781dd48505d16b1099f..71584d350379869717ce8e3cd1ca6a2a3ce47f24 100644 (file)
@@ -2,15 +2,8 @@ void race_send_recordtime(float msg);
 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) {
@@ -242,7 +235,7 @@ entity Spawn_FilterOutBadSpots(entity firstspot, entity playerlist, float mindis
        {
                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)
@@ -364,13 +357,13 @@ entity SelectSpawnPoint (float anypoint)
                                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");
 
@@ -383,7 +376,7 @@ entity SelectSpawnPoint (float anypoint)
 
        if (!spot)
        {
-               if(cvar("spawn_debug"))
+               if(autocvar_spawn_debug)
                        GotoNextMap();
                else
                {
@@ -418,7 +411,7 @@ string CheckPlayerModel(string plyermodel) {
                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")
@@ -599,13 +592,20 @@ void PutObserverInServer (void)
        }
 
        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();
@@ -630,6 +630,8 @@ void PutObserverInServer (void)
 
        PlayerScore_Clear(self); // clear scores when needed
 
+       accuracy_resend(self);
+
        self.spectatortime = time;
 
        self.classname = "observer";
@@ -641,7 +643,7 @@ void PutObserverInServer (void)
        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;
@@ -713,17 +715,6 @@ void PutObserverInServer (void)
        }
        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()
@@ -734,7 +725,7 @@ void FixPlayermodel()
 
        defaultmodel = "";
 
-       if(cvar("sv_defaultcharacter") == 1) {
+       if(autocvar_sv_defaultcharacter == 1) {
                defaultskin = 0;
 
                if(teams_matter)
@@ -750,8 +741,8 @@ void FixPlayermodel()
 
                if(defaultmodel == "")
                {
-                       defaultmodel = cvar_string("sv_defaultplayermodel");
-                       defaultskin = cvar("sv_defaultplayerskin");
+                       defaultmodel = autocvar_sv_defaultplayermodel;
+                       defaultskin = autocvar_sv_defaultplayerskin;
                }
        }
 
@@ -787,16 +778,16 @@ void FixPlayermodel()
                }
 
                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)
@@ -854,6 +845,8 @@ void PutClientInServer (void)
                entity spot, oldself;
                float j;
 
+               accuracy_resend(self);
+
                if(self.team < 0)
                        JoinBestTeam(self, FALSE, TRUE);
 
@@ -874,9 +867,9 @@ void PutClientInServer (void)
                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)
@@ -889,8 +882,12 @@ void PutClientInServer (void)
                        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)
                {
@@ -916,18 +913,24 @@ void PutClientInServer (void)
                }
 
                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;
@@ -949,7 +952,7 @@ void PutClientInServer (void)
                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;
 
@@ -1015,16 +1018,16 @@ void PutClientInServer (void)
 
                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
@@ -1033,7 +1036,7 @@ void PutClientInServer (void)
                //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) {
@@ -1061,6 +1064,11 @@ void PutClientInServer (void)
                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 ();
        }
@@ -1069,6 +1077,9 @@ void PutClientInServer (void)
        //      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);
@@ -1093,33 +1104,47 @@ float ClientInit_SendEntity(entity to, float sf)
        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;
        }
 }
@@ -1185,6 +1210,7 @@ Called when a client types 'kill' in the console
 =============
 */
 
+.float clientkill_nexttime;
 void ClientKill_Now_TeamChange()
 {
        if(self.killindicator_teamchange == -1)
@@ -1192,24 +1218,30 @@ void ClientKill_Now_TeamChange()
                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()
 {
@@ -1226,6 +1258,11 @@ 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)
@@ -1238,6 +1275,8 @@ void KillIndicator_Think()
                        {
                                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"));
                        }
@@ -1249,19 +1288,34 @@ void KillIndicator_Think()
        }
 }
 
-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();
@@ -1277,7 +1331,7 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto
                        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; )
                        {
@@ -1297,10 +1351,14 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto
        }
        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);
        }
 }
 
@@ -1310,24 +1368,23 @@ void ClientKill (void)
        {
                // 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)
@@ -1385,29 +1442,50 @@ void FixClientCvars(entity e)
        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
@@ -1451,6 +1529,7 @@ void ClientConnect (void)
 
        PlayerScore_Attach(self);
        ClientData_Attach();
+       accuracy_init(self);
 
        bot_clientconnect();
 
@@ -1463,14 +1542,56 @@ void ClientConnect (void)
        //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;
@@ -1489,7 +1610,7 @@ void ClientConnect (void)
 
        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);
@@ -1528,9 +1649,6 @@ void ClientConnect (void)
        // 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)
        {
@@ -1562,15 +1680,15 @@ void ClientConnect (void)
        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");
        }
 
@@ -1588,7 +1706,7 @@ void ClientConnect (void)
 
        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"));
@@ -1617,12 +1735,12 @@ void ClientConnect (void)
                        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);
 }
 
 /*
@@ -1643,6 +1761,8 @@ void ClientDisconnect (void)
                return;
        }
 
+       PlayerStats_AddGlobalInfo(self);
+
        CheatShutdownClient();
 
        if(self.hitplotfh >= 0)
@@ -1661,7 +1781,7 @@ void ClientDisconnect (void)
        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");
@@ -1675,7 +1795,7 @@ void ClientDisconnect (void)
 
        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.
@@ -1701,6 +1821,7 @@ void ClientDisconnect (void)
                Spawnqueue_Remove(self);
        }
 
+       accuracy_free(self);
        ClientData_Detach();
        PlayerScore_Detach(self);
 
@@ -1832,19 +1953,19 @@ void UpdateTeamBubble()
 .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);
@@ -1872,7 +1993,7 @@ void play_countdown(float finished, string samp)
  * @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;
@@ -1908,9 +2029,12 @@ string getTimeoutText(float addOneSecond) {
 
 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
@@ -1919,7 +2043,7 @@ void player_powerups (void)
                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;
@@ -1956,7 +2080,7 @@ void player_powerups (void)
                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");
@@ -1970,64 +2094,67 @@ void player_powerups (void)
                                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)
@@ -2078,15 +2205,15 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re
 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;
 
@@ -2094,27 +2221,27 @@ void player_regen (void)
        {
                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;
@@ -2129,10 +2256,10 @@ void player_regen (void)
        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)
@@ -2140,7 +2267,7 @@ void player_regen (void)
        }
 
        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;
@@ -2198,33 +2325,13 @@ void GetPressedKeys(void) {
                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;
@@ -2239,6 +2346,7 @@ void SpectateCopy(entity spectatee) {
        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;
@@ -2292,8 +2400,7 @@ float SpectateNext() {
                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();
@@ -2332,24 +2439,22 @@ void ShowRespawnCountdown()
 
 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;
@@ -2371,22 +2476,30 @@ void LeaveSpectatorMode()
  * 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;
 }
 
 /**
@@ -2395,57 +2508,13 @@ float isJoinAllowed() {
  */
 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) {
@@ -2488,14 +2557,12 @@ void SpectatorThink()
                                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())
@@ -2532,8 +2599,8 @@ void() nexball_setstatus;
 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)
        {
@@ -2549,7 +2616,7 @@ void PlayerPreThink (void)
 
        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);
@@ -2563,24 +2630,24 @@ void PlayerPreThink (void)
                        {
                                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"));
                                                }
                                        }
                                }
@@ -2634,18 +2701,18 @@ void PlayerPreThink (void)
 
                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;
                        }
@@ -2671,7 +2738,7 @@ void PlayerPreThink (void)
                                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)
@@ -2719,7 +2786,7 @@ void PlayerPreThink (void)
                        }
                }
 
-               if(g_lms && !self.deadflag && cvar("g_lms_campcheck_interval"))
+               if(g_lms && !self.deadflag && autocvar_g_lms_campcheck_interval)
                {
                        vector dist;
 
@@ -2728,23 +2795,23 @@ void PlayerPreThink (void)
                        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;
                        }
                }
@@ -2806,8 +2873,8 @@ void PlayerPreThink (void)
                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();
@@ -2815,10 +2882,13 @@ void PlayerPreThink (void)
                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) {
@@ -2832,7 +2902,7 @@ void PlayerPreThink (void)
        }
 
        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;
@@ -2888,12 +2958,12 @@ float isInvisibleString(string s)
                        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;
@@ -2930,15 +3000,6 @@ void PlayerPostThink (void)
                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).
@@ -3011,9 +3072,9 @@ void PlayerPostThink (void)
        //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)
                {
@@ -3035,7 +3096,7 @@ void PlayerPostThink (void)
 
        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));
index bce1f51cd2158cbc272597c2ed33d35a0f32c311..ff3903cbad4f9d8e29f5c1c5e55d39c32b2b75a2 100644 (file)
@@ -89,7 +89,7 @@ void ImpulseCommands (void)
                                        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);
@@ -258,7 +258,7 @@ void ImpulseCommands (void)
        }
        else if(imp >= 103 && imp <= 107)
        {
-               if(cvar("g_waypointeditor"))
+               if(autocvar_g_waypointeditor)
                {
                        switch(imp)
                        {
index e211275b0f3eb4f7d1af694562ada31beabe39ae..a2773fedfd5a00ad6b7dfe4cf605aeecd88fd444 100644 (file)
@@ -1,29 +1,6 @@
 .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;
@@ -46,18 +23,21 @@ When you press the jump key
 */
 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)
@@ -70,7 +50,7 @@ void PlayerJump (void)
                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
@@ -78,12 +58,12 @@ void PlayerJump (void)
                        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)
                                {
@@ -130,50 +110,30 @@ void PlayerJump (void)
        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;
@@ -182,12 +142,12 @@ void PlayerJump (void)
 
        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"));
@@ -270,8 +230,8 @@ void RaceCarPhysics()
        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)
        {
@@ -371,7 +331,7 @@ void RaceCarPhysics()
                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
@@ -420,7 +380,7 @@ void RaceCarPhysics()
        }
        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;
        }
@@ -513,7 +473,7 @@ void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
                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;
@@ -523,9 +483,9 @@ void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
 
        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);
        }
 
@@ -559,7 +519,7 @@ void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float acce
        if(speedclamp)
                accelqw = -accelqw;
 
-       if(cvar("sv_gameplayfix_q2airaccelerate"))
+       if(autocvar_sv_gameplayfix_q2airaccelerate)
                wishspeed0 = wishspeed;
 
        vel_straight = self.velocity * wishdir;
@@ -625,26 +585,26 @@ void PM_AirAccelerate(vector wishdir, float wishspeed)
 
        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;
@@ -707,13 +667,39 @@ void SV_PlayerPhysics()
        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())
@@ -770,13 +756,13 @@ void SV_PlayerPhysics()
        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;
@@ -810,8 +796,6 @@ void SV_PlayerPhysics()
                bot_think();
        }
        
-       MUTATOR_CALLHOOK(PlayerPhysics);
-
        self.items &~= IT_USING_JETPACK;
 
        if(self.classname == "player")
@@ -823,7 +807,7 @@ void SV_PlayerPhysics()
                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;
 
@@ -844,32 +828,14 @@ void SV_PlayerPhysics()
        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) {
@@ -878,7 +844,7 @@ void SV_PlayerPhysics()
 
        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)
@@ -899,7 +865,7 @@ void SV_PlayerPhysics()
                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;
@@ -953,7 +919,7 @@ void SV_PlayerPhysics()
        {
                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
@@ -988,17 +954,17 @@ void SV_PlayerPhysics()
                // 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)
        {
@@ -1013,29 +979,36 @@ void SV_PlayerPhysics()
 
                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);
@@ -1059,21 +1032,21 @@ void SV_PlayerPhysics()
                // 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
@@ -1084,9 +1057,9 @@ void SV_PlayerPhysics()
 
                // 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;
@@ -1134,21 +1107,21 @@ void SV_PlayerPhysics()
                //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;
 
@@ -1158,12 +1131,12 @@ void SV_PlayerPhysics()
                {
                        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)
@@ -1178,10 +1151,10 @@ void SV_PlayerPhysics()
 
                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;
@@ -1206,10 +1179,10 @@ void SV_PlayerPhysics()
                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
@@ -1219,12 +1192,12 @@ void SV_PlayerPhysics()
                // 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
        {
@@ -1235,13 +1208,13 @@ void SV_PlayerPhysics()
 
                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');
@@ -1249,8 +1222,8 @@ void SV_PlayerPhysics()
                // 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)
@@ -1267,13 +1240,13 @@ void SV_PlayerPhysics()
                        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;
@@ -1284,20 +1257,20 @@ void SV_PlayerPhysics()
                        // 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);
                }
        }
@@ -1317,7 +1290,7 @@ void SV_PlayerPhysics()
                                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;
@@ -1330,13 +1303,13 @@ void SV_PlayerPhysics()
 
        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)
index a2943a76053e61e6e873e951594bfa7bd1898feb..f1d290a9b0ae40bccc3b03730e34820d14327739 100644 (file)
@@ -2,69 +2,53 @@ float weaponstats_buffer;
 
 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)
@@ -73,18 +57,18 @@ void WeaponStats_LogItem(float awep, float vwep, vector item)
                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
@@ -168,7 +152,7 @@ void CopyBody(float keepvelocity)
 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)
@@ -325,11 +309,14 @@ void SpawnThrownWeapon (vector org, float w)
                {
                        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)
@@ -341,7 +328,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        // 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;
 
@@ -365,13 +352,13 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
                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;
@@ -386,12 +373,17 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
 }
 
 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);
@@ -434,12 +426,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        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;
        }
@@ -455,9 +444,10 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        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))
        {
@@ -481,7 +471,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        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
                        {
@@ -497,7 +487,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                                        }
 
                                        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
                                        {
@@ -537,7 +527,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        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)
        {
@@ -547,19 +537,28 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        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)
@@ -567,8 +566,14 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                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))
@@ -595,17 +600,29 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        }
                }
 
-               // 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;
@@ -620,11 +637,34 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        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;
@@ -636,7 +676,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                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
@@ -646,10 +686,15 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                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
@@ -671,35 +716,19 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                // 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;
                }
        }
@@ -764,7 +793,7 @@ void UpdateSelectedPlayer()
        selected = world;
        selected_score = 0.95; // 18 degrees
 
-       if(!cvar("sv_allow_shownames"))
+       if(!autocvar_sv_allow_shownames)
                return;
 
        if(clienttype(self) != CLIENTTYPE_REAL)
@@ -900,7 +929,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
        }
        */
 
-       if(cvar("g_chat_teamcolors"))
+       if(autocvar_g_chat_teamcolors)
                namestr = playername(source);
        else
                namestr = source.netname;
@@ -913,7 +942,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
                        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");
@@ -948,23 +977,23 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
                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);
@@ -1013,7 +1042,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
 
        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 = "";
@@ -1034,7 +1063,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
        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
        }
 
@@ -1052,7 +1081,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
        }
        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;
@@ -1124,12 +1153,9 @@ float GetVoiceMessageVoiceType(string type)
 }
 
 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;
@@ -1143,7 +1169,6 @@ float GetPlayerSoundSampleField_fixed;
 .string GetPlayerSoundSampleField(string type)
 {
        GetPlayerSoundSampleField_notFound = 0;
-       GetPlayerSoundSampleField_fixed = 0;
        switch(type)
        {
 #define _VOICEMSG(m) case #m: return playersound_##m;
@@ -1205,7 +1230,7 @@ void ClearPlayerSounds()
 #undef _VOICEMSG
 }
 
-void LoadPlayerSounds(string f, float first)
+float LoadPlayerSounds(string f, float first)
 {
        float fh;
        string s;
@@ -1214,7 +1239,7 @@ void LoadPlayerSounds(string f, float first)
        if(fh < 0)
        {
                dprint("Player sound file not found: ", f, "\n");
-               return;
+               return 0;
        }
        while((s = fgets(fh)))
        {
@@ -1225,14 +1250,12 @@ void LoadPlayerSounds(string f, float first)
                        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;
@@ -1246,7 +1269,8 @@ void UpdatePlayerSounds()
        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)
index 477b641ba7e61d21ba7d28989827ccbe20a5ef8a..864dd77fce788cc1696e7bbdee82ac3309748a89 100644 (file)
@@ -1,8 +1,6 @@
 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
@@ -236,6 +234,20 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto
 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;
@@ -265,24 +277,14 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
                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)
@@ -293,13 +295,10 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
        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
@@ -310,7 +309,10 @@ void W_WeaponFrame()
        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)
@@ -340,7 +342,7 @@ void W_WeaponFrame()
                        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)
@@ -353,7 +355,7 @@ void W_WeaponFrame()
                        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
                        }
@@ -386,6 +388,7 @@ void W_WeaponFrame()
                        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)
index 907f1788196e56adc947c9a0180fb00694231790..057c5cb1dc767fde25d85b66a61ca8ee519cbf32 100644 (file)
@@ -19,13 +19,13 @@ float W_WeaponRateFactor()
                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;
                }
        }
 
@@ -132,13 +132,13 @@ vector w_shotend;
 // 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;
@@ -158,15 +158,13 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
        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);
 
@@ -197,7 +195,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
        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)
@@ -213,7 +211,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
                                }
                        }
                }
-               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
@@ -243,16 +241,14 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
                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);
@@ -264,11 +260,11 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
        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()
 {
@@ -611,12 +607,14 @@ void CL_Weaponentity_Think()
        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';
@@ -624,7 +622,7 @@ void CL_Weaponentity_Think()
        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)
                {
@@ -634,7 +632,7 @@ void CL_Weaponentity_Think()
        }
        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)
                {
@@ -855,6 +853,7 @@ void CL_ExteriorWeaponentity_Think()
                self.angles = ang;
        }
 
+       self.glowmod = self.owner.weaponentity_glowmod;
        self.colormap = self.owner.colormap;
 };
 
@@ -960,7 +959,7 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
                        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;
@@ -1019,7 +1018,7 @@ void w_ready()
 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;
@@ -1042,6 +1041,7 @@ void W_SwitchToOtherWeapon(entity pl)
        if(ww)
                W_SwitchWeapon_Force(pl, ww);
 }
+.float prevdryfire;
 float weapon_prepareattack_checkammo(float secondary)
 {
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
@@ -1053,8 +1053,11 @@ float weapon_prepareattack_checkammo(float secondary)
                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;
@@ -1266,7 +1269,7 @@ void weapon_boblayer1(float spd, vector org)
        // 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;
@@ -1279,8 +1282,8 @@ vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity)
        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;
@@ -1316,7 +1319,7 @@ vector W_CalculateProjectileVelocity(vector pvelocity, vector 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)
@@ -1459,7 +1462,7 @@ vector W_CalculateProjectileSpread(vector forward, float spread)
        spread *= g_weaponspreadfactor;
        if(spread <= 0)
                return forward;
-       sstyle = cvar("g_projectiles_spread_style");
+       sstyle = autocvar_g_projectiles_spread_style;
        
        if(sstyle == 0)
        {
@@ -1573,7 +1576,7 @@ float mspercallsum;
 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");
@@ -1584,10 +1587,10 @@ void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float
        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
@@ -1598,13 +1601,13 @@ void W_SetupProjectileVelocityEx(entity missile, vector dir, vector upDir, float
        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)
index df19ab592f4779beb94a38881992e37150a43ae0..226269d41b3605bc87f8e6a9ab417efa0b21621f 100644 (file)
@@ -164,14 +164,13 @@ void SV_ParseClientCommand(string s) {
                } 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");
                }
@@ -210,18 +209,8 @@ void SV_ParseClientCommand(string s) {
                                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)
@@ -229,15 +218,14 @@ void SV_ParseClientCommand(string s) {
                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 {
@@ -249,21 +237,23 @@ void SV_ParseClientCommand(string s) {
                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" ) );
                }
@@ -271,10 +261,10 @@ void SV_ParseClientCommand(string s) {
                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
                                {
@@ -344,7 +334,7 @@ void SV_ParseClientCommand(string s) {
        } 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");
@@ -357,7 +347,7 @@ void SV_ParseClientCommand(string s) {
        } else if(cmd == "timein") {
                if not(self.flags & FL_CLIENT)
                        return;
-               if(cvar("sv_timeout")) {
+               if(autocvar_sv_timeout) {
                        evaluateTimein();
                }
        } else if(cmd == "teamstatus") {
@@ -397,12 +387,12 @@ void SV_ParseClientCommand(string s) {
                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;
@@ -424,8 +414,8 @@ void ReadyRestartForce()
        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));
        }
 
@@ -446,13 +436,13 @@ void ReadyRestartForce()
        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;
@@ -460,17 +450,17 @@ void ReadyRestartForce()
        }
 
        //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");
 }
 
@@ -487,7 +477,7 @@ void ReadyRestart()
        // 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();
 }
 
@@ -552,13 +542,13 @@ void evaluateTimeout() {
                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");
@@ -570,8 +560,8 @@ void evaluateTimeout() {
        //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;
@@ -605,9 +595,9 @@ void evaluateTimein() {
        }
        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
index d250d39def5f523e1a57bb775731128aa04fb7e0..31e5b7788513b7eb180cd929c10d46bae871fc08 100644 (file)
@@ -13,7 +13,7 @@ float CSQCProjectile_SendEntity(entity to, float sf)
        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;
index 8c0844b2246f26107bfccc482bfaed52909f65ce..b31e1429381ca5637966f9dfd8a0bde4c308474c 100644 (file)
@@ -150,7 +150,7 @@ void FakeTimeLimit(entity e, float t)
        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);
 }
@@ -171,11 +171,6 @@ void place_flag()
                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;
@@ -206,7 +201,7 @@ void place_flag()
 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));
@@ -317,7 +312,7 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
        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)
@@ -331,7 +326,7 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
        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);
@@ -339,19 +334,6 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
                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;
@@ -373,8 +355,6 @@ void FlagThink()
                        ctf_captureshield_update(e, 1); // release shield only
        }
 
-       AnimateFlag();
-
        if(self.speedrunning)
        if(self.cnt == FLAG_CARRY)
        {
@@ -426,7 +406,7 @@ void FlagThink()
                return;
        }
 
-       if(cvar("g_ctf_allow_drop"))
+       if(autocvar_g_ctf_allow_drop)
        if(e.BUTTON_USE)
                DropFlag(self, e, world);
 };
@@ -460,7 +440,7 @@ void FlagTouch()
                {
                        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);
@@ -502,7 +482,7 @@ void FlagTouch()
                // 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);
@@ -530,7 +510,7 @@ void FlagTouch()
                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
@@ -610,12 +590,12 @@ void FlagTouch()
                        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
@@ -628,7 +608,7 @@ void FlagTouch()
                        //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;
@@ -747,7 +727,7 @@ void item_flag_postspawn()
 { // 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
@@ -795,9 +775,6 @@ void spawnfunc_item_flag_team1()
                return;
        }
 
-       //if(!cvar("teamplay"))
-       //      cvar_set("teamplay", "3");
-
        // link flag into ctf_worldflaglist
        self.ctf_worldflagnext = ctf_worldflaglist;
        ctf_worldflaglist = self;
@@ -815,11 +792,11 @@ void spawnfunc_item_flag_team1()
        }
        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)
@@ -849,9 +826,9 @@ void spawnfunc_item_flag_team1()
        //      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
@@ -895,8 +872,6 @@ void spawnfunc_item_flag_team2()
                remove(self);
                return;
        }
-       //if(!cvar("teamplay"))
-       //      cvar_set("teamplay", "3");
 
        // link flag into ctf_worldflaglist
        self.ctf_worldflagnext = ctf_worldflaglist;
@@ -915,11 +890,11 @@ void spawnfunc_item_flag_team2()
        }
        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)
@@ -949,9 +924,9 @@ void spawnfunc_item_flag_team2()
        //      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
@@ -1030,9 +1005,14 @@ void ctf_init()
        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)
@@ -1058,42 +1038,40 @@ void ctf_setstatus()
        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);
                }
        }
 };
index 95fce0ade3b7a284ad646a88e56001f55ab4a6b4..32ff5ab9879b081ac040d18da992e4442a3feeb1 100644 (file)
@@ -17,7 +17,7 @@ float require_spawnfunc_prefix; // if this float exists, only functions with spa
 
 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;
@@ -77,14 +77,13 @@ float maxclients;
 //.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
@@ -200,6 +199,7 @@ void setanim(entity e, vector anim, float looping, float override, float restart
 
 .entity weaponentity;
 .entity exteriorweaponentity;
+.vector weaponentity_glowmod;
 .float switchweapon;
 .float autoswitch;
 float weapon_action(float wpn, float wrequest);
@@ -263,20 +263,21 @@ float blockSpectators; //if set, new or existing spectators or observers will be
 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();
@@ -326,6 +327,7 @@ float sv_loddistance2;
 .string weaponorder_byimpulse;
 
 .float cvar_cl_allow_uid2name;
+.float cvar_cl_allow_uidtracking;
 .string stored_netname;
 
 void Announce(string snd);
@@ -398,10 +400,6 @@ float assault_attacker_team;
 .float speedrunning;
 
 // Q3 support
-.float notteam;
-.float notsingle;
-.float notfree;
-.float notq3a;
 float q3acompat_machineshotgunswap;
 
 // database
@@ -426,7 +424,6 @@ float sv_maxidle;
 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;
@@ -499,6 +496,8 @@ void PlayerSound(.string samplefield, float channel, float voicetype);
 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;
@@ -531,6 +530,7 @@ float game_starttime; //point in time when the countdown is over
 .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);
 
@@ -553,8 +553,8 @@ void target_voicescript_clear(entity pl);
 .string target4;
 .float trigger_reverse;
 
-// Nexball
-.entity ballcarried;
+// Nexball 
+.entity ballcarried; // Also used for keepaway
 .float metertime;
 float g_nexball_meter_period;
 
@@ -597,17 +597,10 @@ string matchid;
 .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;
 
@@ -618,7 +611,8 @@ float client_cefc_accumulator;
 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
@@ -654,7 +648,17 @@ string deathmessage;
 .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.
index 3e5bed8b25f23c35247fa2cf1c50c14da053dc3c..891863f97a3a32daa771675391405563ad4675ca 100644 (file)
@@ -17,9 +17,6 @@ Note: The only teams who can use dom control points are identified by spawnfunc_
 
 #define DOMPOINTFRAGS frags
 
-float g_domination_point_amt;
-float g_domination_point_rate;
-
 .float enemy_playerid;
 .entity sprite;
 .float captime;
@@ -29,7 +26,7 @@ void() dom_controlpoint_setup;
 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));
@@ -67,12 +64,12 @@ void dompoint_captured ()
        //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;
 
@@ -95,7 +92,7 @@ void dompoint_captured ()
        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;
@@ -160,11 +157,8 @@ void dompointthink()
        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;
 
@@ -172,8 +166,8 @@ void dompointthink()
        // 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);
@@ -270,7 +264,7 @@ Keys:
 
 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;
@@ -345,8 +339,8 @@ void dom_controlpoint_setup()
        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;
@@ -547,7 +541,7 @@ void spawnfunc_dom_controlpoint()
        //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;
 };
 
@@ -596,10 +590,10 @@ void dom_spawnpoint(vector org)
 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");
@@ -615,7 +609,7 @@ void dom_delayedinit()
        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)
@@ -654,9 +648,5 @@ void dom_init()
        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");
 };
 
index b72a0500013dc8402a8257d8febd4baef1bd6f75..afe67c9b5b83faf675daf74800fa904e9b9ba09f 100644 (file)
@@ -436,6 +436,16 @@ void(entity e, entity tagentity, string tagname) setattachment = #443; // attach
 //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
@@ -572,10 +582,12 @@ float(float a) tan = #475; // returns tangent value (which is simply sin(a)/cos(
 // 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:
@@ -818,7 +830,7 @@ vector(entity e, float s, float n) getsurfacetriangle = #629;
 //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;
@@ -863,6 +875,7 @@ float(float tmr) gettime = #519;
 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
@@ -950,7 +963,8 @@ string(string format, ...) sprintf = #627;
 //  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
@@ -1126,6 +1140,15 @@ string(string in) uri_unescape = #511;
 //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
@@ -1198,6 +1221,56 @@ float(string name, string value) registercvar = #93;
 //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
@@ -1273,6 +1346,14 @@ float(entity clent) clienttype = #455; // returns one of the CLIENTTYPE_* consta
 //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
@@ -1806,14 +1887,14 @@ float Q3SURFACEFLAG_LADDER = 8; // climbable surface
 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)
@@ -2320,4 +2401,7 @@ float JOINTTYPE_HINGE2 = 5; // hinge2; uses origin (anchor), angles (axis1), vel
 .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
index 44605ddeee793899a83ad425d6ed0182a4a856e2..3af433aceb075b966993512f0f42f330906bc487 100644 (file)
@@ -122,6 +122,11 @@ void func_breakable_behave_destroyed()
 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;
@@ -180,9 +185,12 @@ void func_breakable_damage(entity inflictor, entity attacker, float damage, floa
        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)
index 460c608dcf357d944829978620b3e21247f61724..22497c99d978eb9ba4cc74511d5d6c96cc793b7b 100644 (file)
@@ -102,7 +102,7 @@ void UpdateFrags(entity player, float f)
 
 // 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;
 
@@ -131,25 +131,42 @@ void GiveFrags (entity attacker, entity targ, float f)
        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));
        }
@@ -184,6 +201,8 @@ void GiveFrags (entity attacker, entity targ, float f)
                        {
                                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;
                        }
@@ -229,7 +248,7 @@ string AppendItemcodes(string s, entity player)
 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));
@@ -293,12 +312,13 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                {
                        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)
@@ -322,7 +342,7 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                                else
                                        type = KILL_TEAM_BLUE;
 
-                               GiveFrags(attacker, targ, -1);
+                               GiveFrags(attacker, targ, -1, deathtype);
 
                                Send_CSQC_Centerprint(attacker, s, "", type, MSG_KILL);
 
@@ -349,9 +369,11 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                                        // 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 {
@@ -376,10 +398,10 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                                {
                                        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);
@@ -394,36 +416,43 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                                {
                                        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);
                        }
@@ -438,9 +467,10 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                        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);
 
@@ -535,33 +565,56 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                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;
@@ -574,8 +627,8 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                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")
@@ -603,12 +656,11 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        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;
@@ -623,32 +675,42 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        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
@@ -656,8 +718,8 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                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)
@@ -667,31 +729,31 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        {
                                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
@@ -727,13 +789,12 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                {
                                        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;
@@ -753,13 +814,15 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                                                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)
                                                {
@@ -796,28 +859,28 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        // 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);
                        }
                }
@@ -828,35 +891,23 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
        {
                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
@@ -875,25 +926,17 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
        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;
@@ -913,7 +956,6 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
        }
 
        stat_damagedone = 0;
-       stat_maxdamage = 0;
 
        targ = WarpZone_FindRadius (blastorigin, rad, FALSE);
        while (targ)
@@ -990,33 +1032,47 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
                                                // 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)
@@ -1031,14 +1087,8 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
                                                        {
                                                                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))
@@ -1054,7 +1104,8 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
 
        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;
 }
@@ -1157,6 +1208,8 @@ float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
                                        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
@@ -1169,6 +1222,8 @@ float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
                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;
        }
 }
@@ -1190,6 +1245,10 @@ void Fire_ApplyDamage(entity e)
        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;
 
@@ -1203,8 +1262,6 @@ void Fire_ApplyDamage(entity e)
        }
        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)
        {
@@ -1213,8 +1270,8 @@ void Fire_ApplyDamage(entity e)
                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);
                }
        }
index 88e1ced882da3542ae100acae2851010993a6694..dd6d73effd8aae382ae92c4d40bf16807faa9b2b 100644 (file)
@@ -175,24 +175,24 @@ void GrapplingHookThink()
 
        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
 
@@ -200,7 +200,7 @@ void GrapplingHookThink()
                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);
 
@@ -233,7 +233,7 @@ void GrapplingHookThink()
                                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)
                                        {
@@ -241,7 +241,7 @@ void GrapplingHookThink()
                                                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;
                                        }
                                }
 
@@ -315,7 +315,7 @@ void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, floa
                        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);
                }
@@ -332,6 +332,9 @@ void FireGrapplingHook (void)
        if((arena_roundbased && time < warmup) || (time < game_starttime))
                return;
 
+    if(self.freezetag_frozen)
+        return;
+
        makevectors(self.v_angle);
 
        s = self.cvar_cl_gunalign;
@@ -363,18 +366,18 @@ void FireGrapplingHook (void)
 
        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;
index 5d8401df98e934d637822e419582270db3484c14..22c8931bef8813bc43536ab950b281b1a7def223 100644 (file)
@@ -177,10 +177,51 @@ void SUB_CalcMoveDone (void)
                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!");
@@ -206,9 +247,36 @@ void SUB_CalcMove (vector tdest, float tspeed, void() func)
                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)
@@ -364,13 +432,13 @@ void traceline_antilag_force (entity source, vector v1, vector v2, float nomonst
 }
 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);
 }
@@ -380,13 +448,13 @@ void WarpZone_traceline_antilag_force (entity source, vector v1, vector v2, floa
 }
 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);
 }
@@ -609,9 +677,9 @@ float LOD_customize()
 {
        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)
@@ -667,7 +735,7 @@ void LODmodel_attach()
                }
        }
 
-       if(cvar("loddebug") < 0)
+       if(autocvar_loddebug < 0)
        {
                self.lodmodel1 = self.lodmodel2 = ""; // don't even initialize
        }
@@ -698,6 +766,33 @@ void LODmodel_attach()
                        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 != "")
@@ -707,10 +802,7 @@ void SetBrushEntityModel()
                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()
@@ -721,10 +813,7 @@ 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);
 }
 
 /*
@@ -750,9 +839,7 @@ void InitTrigger()
 {
 // 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;
@@ -764,9 +851,7 @@ void InitSolidBSPTrigger()
 {
 // 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
index 4a66f229380ea9c505962ae4e5aa0abe9674d171..6c0921ba9b6ee7317f341dd2e09a623786a3c4d7 100644 (file)
@@ -51,6 +51,9 @@ void SUB_UseTargets()
                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;
        }
 
@@ -186,14 +189,12 @@ void multi_use()
 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')
@@ -410,6 +411,14 @@ void spawnfunc_trigger_counter()
        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()
 {
@@ -428,7 +437,16 @@ 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
@@ -464,6 +482,8 @@ void spawnfunc_trigger_hurt()
        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)
@@ -516,7 +536,7 @@ void trigger_heal_touch()
                        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);
                        }
                }
@@ -656,31 +676,134 @@ void spawnfunc_trigger_gravity()
 
 // 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);
        }
 };
 
@@ -1400,7 +1523,7 @@ void spawnfunc_trigger_impulse()
        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;
@@ -1409,13 +1532,13 @@ void spawnfunc_trigger_impulse()
     {
         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;
         }
     }
@@ -1599,6 +1722,7 @@ void follow_init()
                        attach_sameorigin(dst, src, self.message);
                }
 
+               dst.solid = SOLID_NOT; // solid doesn't work with attachment
                remove(self);
        }
        else
index 688b5e416f881b55b7507d7d62a892bd1adda9a7..84402f0139441e3eda2e1e2945443006a013c67a 100644 (file)
@@ -50,19 +50,19 @@ float() DoNextMapOverride;
 
 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;
@@ -73,7 +73,7 @@ void fteqcc_testbugs()
 {
        float a, b;
 
-       if(!cvar("developer_fteqccbugs"))
+       if(!autocvar_developer_fteqccbugs)
                return;
 
        dprint("*** fteqcc test: checking for bugs...\n");
@@ -139,7 +139,7 @@ void timeoutHandler_Think() {
                                        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;
@@ -178,15 +178,15 @@ void timeoutHandler_Think() {
 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();
@@ -235,7 +235,12 @@ void cvar_changes_init()
                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_");
@@ -254,12 +259,15 @@ void cvar_changes_init()
                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_");
@@ -272,7 +280,21 @@ void cvar_changes_init()
                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_");
@@ -284,47 +306,41 @@ void cvar_changes_init()
                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");
@@ -352,19 +368,33 @@ void cvar_changes_init()
                // 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_");
 
@@ -407,9 +437,11 @@ void cvar_changes_init()
                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");
@@ -421,6 +453,7 @@ void cvar_changes_init()
                BADCVAR("sv_autoscreenshot");
                BADCVAR("sv_curl_defaulturl");
                BADCVAR("sv_defaultcharacter");
+               BADCVAR("sv_defaultplayercolors");
                BADCVAR("sv_defaultplayermodel");
                BADCVAR("sv_defaultplayerskin");
                BADCVAR("sv_maxidle");
@@ -437,6 +470,15 @@ void cvar_changes_init()
                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
 
@@ -600,15 +642,6 @@ void spawnfunc_worldspawn (void)
 
        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");
 
@@ -650,7 +683,7 @@ void spawnfunc_worldspawn (void)
        // 63 testing
        lightstyle(63, "a");
 
-       if(cvar("g_campaign"))
+       if(autocvar_g_campaign)
                CampaignPreInit();
 
        Map_MarkAsRecent(mapname);
@@ -663,13 +696,13 @@ void spawnfunc_worldspawn (void)
        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();
@@ -680,9 +713,9 @@ void spawnfunc_worldspawn (void)
        //      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);
 
@@ -694,31 +727,31 @@ void spawnfunc_worldspawn (void)
                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);
@@ -731,7 +764,7 @@ void spawnfunc_worldspawn (void)
 
        SetDefaultAlpha();
 
-       if(cvar("g_campaign"))
+       if(autocvar_g_campaign)
                CampaignPostInit();
 
        fteqcc_testbugs();
@@ -788,22 +821,32 @@ void spawnfunc_worldspawn (void)
        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);
 
@@ -836,7 +879,7 @@ void spawnfunc_worldspawn (void)
        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)))
@@ -870,7 +913,7 @@ void spawnfunc_worldspawn (void)
        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 = "";
@@ -884,6 +927,8 @@ void spawnfunc_worldspawn (void)
                cvar_set("sv_curl_serverpackages", substring(s, 1, -1));
        }
 
+       PlayerStats_Init();
+
        world_initialized = 1;
 }
 
@@ -927,7 +972,7 @@ float GetMaplistPosition()
        string map;
 
        map = GetMapname();
-       idx = cvar("g_maplist_index");
+       idx = autocvar_g_maplist_index;
 
        if(idx >= 0)
                if(idx < Map_Count)
@@ -945,8 +990,8 @@ float GetMaplistPosition()
 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);
@@ -1009,12 +1054,12 @@ float strhasword(string s, string w)
 
 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)
@@ -1140,7 +1185,7 @@ float(float exponent) MaplistMethod_Shuffle = // more clever shuffling
                        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
@@ -1152,15 +1197,15 @@ float(float exponent) MaplistMethod_Shuffle = // more clever shuffling
 
 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");
@@ -1181,11 +1226,11 @@ string GetNextMap()
        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)
@@ -1205,13 +1250,13 @@ string GetNextMap()
 
 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)
                {
@@ -1220,13 +1265,13 @@ float DoNextMapOverride()
                        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"));
@@ -1236,15 +1281,15 @@ float DoNextMapOverride()
                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");
@@ -1277,7 +1322,7 @@ void GotoNextMap()
                        {
                                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");
                        }
@@ -1306,7 +1351,7 @@ void IntermissionThink()
 {
        FixIntermissionClient(self);
 
-       if(cvar("sv_autoscreenshot"))
+       if(autocvar_sv_autoscreenshot)
        if(self.autoscreenshot > 0)
        if(time > self.autoscreenshot)
        {
@@ -1384,16 +1429,17 @@ RULES
 
 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)
        {
@@ -1402,7 +1448,7 @@ void DumpStats(float 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)
@@ -1417,7 +1463,7 @@ void DumpStats(float 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
@@ -1434,7 +1480,7 @@ void DumpStats(float final)
 
        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)), ":");
@@ -1508,7 +1554,7 @@ void FixIntermissionClient(entity e)
                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;
@@ -1529,15 +1575,13 @@ only called if a time or frag limit has expired
 */
 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;
 
@@ -1554,60 +1598,25 @@ void NextLevel()
 
        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");
@@ -1648,7 +1657,7 @@ float InitiateSuddenDeath()
        // - 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
        }
@@ -1656,7 +1665,7 @@ float InitiateSuddenDeath()
        {
                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();
                }
@@ -1669,11 +1678,11 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
        ++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";
@@ -1681,7 +1690,7 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
        bcenterprint(
                strcat(
                        "^3Now playing ^1OVERTIME^3!\n\n^3Added ^1",
-                       ftos(cvar("timelimit_overtime")),
+                       ftos(autocvar_timelimit_overtime),
                        minutesPlural,
                        " to the game!"
                )
@@ -1690,7 +1699,7 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
 
 float GetWinningCode(float fraglimitreached, float equality)
 {
-       if(cvar("g_campaign") == 1)
+       if(autocvar_g_campaign == 1)
                if(fraglimitreached)
                        return WINNING_YES;
                else
@@ -1779,7 +1788,7 @@ float WinningCondition_Onslaught()
 float LMS_NewPlayerLives()
 {
        float fl;
-       fl = cvar("fraglimit");
+       fl = autocvar_fraglimit;
        if(fl == 0)
                fl = 999;
 
@@ -1787,8 +1796,8 @@ float LMS_NewPlayerLives()
        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);
@@ -1825,7 +1834,7 @@ float WinningCondition_Assault()
 
                        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;
                        }
@@ -1924,7 +1933,7 @@ float WinningCondition_LMS()
 
 void ShuffleMaplist()
 {
-       cvar_set("g_maplist", shufflewords(cvar_string("g_maplist")));
+       cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
 }
 
 float leaderfrags;
@@ -1984,7 +1993,7 @@ float WinningCondition_Scores(float limit, float leadlimit)
        {
                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);
@@ -2141,9 +2150,9 @@ void CheckRules_World()
                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
        {
@@ -2324,14 +2333,14 @@ string MapVote_Suggest(string m)
        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.";
 
@@ -2352,7 +2361,7 @@ string MapVote_Suggest(string m)
        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.");
 }
@@ -2403,17 +2412,17 @@ void MapVote_Init()
        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);
@@ -2431,7 +2440,7 @@ void MapVote_Init()
        {
                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)
@@ -2444,8 +2453,8 @@ void MapVote_Init()
 
        //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!";
@@ -2572,7 +2581,7 @@ float MapVote_Finished(float mappos)
        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]), "::");
@@ -2694,7 +2703,7 @@ float MapVote_CheckRules_2()
                                                }
                                }
                        result = strcat(result, ":didn't vote:", ftos(didntvote));
-                       if(cvar("sv_eventlog"))
+                       if(autocvar_sv_eventlog)
                                GameLogEcho(result);
                }
 
@@ -2749,6 +2758,10 @@ void MapVote_Start()
        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;
@@ -2769,17 +2782,17 @@ void MapVote_Think()
 
        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))
@@ -2792,7 +2805,7 @@ void MapVote_Think()
                mapvote_initialized = TRUE;
                if(DoNextMapOverride())
                        return;
-               if(!cvar("g_maplist_votable") || player_count <= 0)
+               if(!autocvar_g_maplist_votable || player_count <= 0)
                {
                        GotoNextMap();
                        return;
@@ -2829,19 +2842,19 @@ void EndFrame()
                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
@@ -2923,6 +2936,8 @@ void RestoreGame()
 
 void SV_Shutdown()
 {
+       entity e;
+
        if(gameover > 1) // shutting down already?
                return;
 
@@ -2933,16 +2948,22 @@ void SV_Shutdown()
                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");
index 90b06a5a3d92a5950fa42d3213263c4f337db8e3..b15e6988f4d9c0392673e2246ed68a5fca8d4096 100644 (file)
@@ -626,6 +626,47 @@ void make_mapinfo_Think()
        }
 }
 
+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;
@@ -653,6 +694,8 @@ void GameCommand(string command)
                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");
@@ -771,10 +814,10 @@ void GameCommand(string command)
                        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;
        }
 
@@ -801,16 +844,15 @@ void GameCommand(string command)
                        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");
@@ -825,7 +867,7 @@ void GameCommand(string command)
                        return;
                }
 
-                       client = edict_num(entno);
+               client = edict_num(entno);
 
                // player entity is not a client
                if not(client.flags & FL_CLIENT) {
@@ -835,43 +877,52 @@ void GameCommand(string command)
 
                // 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");
@@ -879,6 +930,7 @@ void GameCommand(string command)
                }
                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;
@@ -1370,6 +1422,18 @@ void GameCommand(string command)
                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");
 }
 
index 293a9b4e40497cf4a2302ecf3da74bd1e11c500d..66e5a97e5e817670566c84846573debf29d6dbbe 100644 (file)
@@ -26,12 +26,12 @@ void OnlineBanList_SendBan(string ip, float bantime, string reason)
        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)
@@ -48,10 +48,10 @@ void OnlineBanList_SendUnban(string ip)
        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)
@@ -85,7 +85,7 @@ void OnlineBanList_URI_Get_Callback(float id, float status, string data)
                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, ": ");
@@ -104,7 +104,7 @@ void OnlineBanList_URI_Get_Callback(float id, float status, string data)
                return;
        }
 
-       syncinterval = cvar("g_ban_sync_interval");
+       syncinterval = autocvar_g_ban_sync_interval;
        if(syncinterval == 0)
        {
                print("rejected (syncing disabled)\n");
@@ -155,7 +155,7 @@ void OnlineBanList_URI_Get_Callback(float id, float status, string data)
                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;
 
@@ -170,7 +170,7 @@ void OnlineBanList_URI_Get_Callback(float id, float status, string data)
                                }
                }
 
-               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;
 
@@ -192,11 +192,11 @@ void OnlineBanList_Think()
        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;
 
@@ -207,12 +207,12 @@ void OnlineBanList_Think()
                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)
@@ -226,8 +226,8 @@ void OnlineBanList_Think()
                        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;
@@ -297,7 +297,7 @@ void Ban_LoadBans()
                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;
@@ -419,7 +419,7 @@ float Ban_IsClientBanned(entity client, float idx)
                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;
 }
@@ -607,8 +607,8 @@ float GameCommand_Ban(string command)
                        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);
@@ -623,7 +623,7 @@ float GameCommand_Ban(string command)
                        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);
index 1d373c97327d2271ede7e7b6e184fb881758e5d2..364c925991a893ccb2a75749cb57d9bd8a573104 100644 (file)
@@ -21,8 +21,8 @@ string ColoredTeamName(float t);
 
 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";
 }
@@ -92,16 +92,16 @@ string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information
        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
@@ -110,8 +110,8 @@ string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information
                                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
@@ -135,29 +135,29 @@ void GameLogEcho(string s)
     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");
     }
@@ -189,13 +189,13 @@ vector PL_CROUCH_MAX;
 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');
@@ -213,7 +213,7 @@ void relocate_spawnpoint()
         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");
@@ -237,7 +237,7 @@ void relocate_spawnpoint()
         if (self.team)
             have_team_spawns = 1;
 
-    if (cvar("r_showbboxes"))
+    if (autocvar_r_showbboxes)
     {
         // show where spawnpoints point at too
         makevectors(self.angles);
@@ -468,28 +468,6 @@ string formatmessage(string msg)
                        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);
@@ -625,7 +603,6 @@ void GetCvars(float f)
        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");
 
@@ -638,6 +615,7 @@ void GetCvars(float f)
 #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)
@@ -660,8 +638,8 @@ float fexists(string f)
 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");
@@ -816,6 +794,8 @@ vector randompos(vector m1, vector m2)
     return  v;
 };
 
+//#NO AUTOCVARS START
+
 float g_pickup_shells;
 float g_pickup_shells_max;
 float g_pickup_nails;
@@ -855,6 +835,7 @@ float g_pickup_ammo_anyway;
 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;
@@ -899,8 +880,8 @@ float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
                        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
@@ -934,8 +915,15 @@ void readplayerstartcvars()
 
        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")
        {
@@ -995,21 +983,13 @@ void readplayerstartcvars()
                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)
        {
@@ -1017,24 +997,58 @@ void readplayerstartcvars()
                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
                {
@@ -1044,13 +1058,12 @@ void readplayerstartcvars()
                        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)
@@ -1091,22 +1104,6 @@ void readplayerstartcvars()
                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;
 
@@ -1175,8 +1172,7 @@ float sv_pitch_min;
 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
@@ -1189,7 +1185,6 @@ void readlevelcvars(void)
        if(cvar("g_vampire"))
                MUTATOR_ADD(mutator_vampire);
 
-       serverflags = 0;
        if(cvar("sv_allow_fullbright"))
                serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
 
@@ -1228,6 +1223,8 @@ void readlevelcvars(void)
        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");
@@ -1311,7 +1308,9 @@ void readlevelcvars(void)
 
        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;
@@ -1328,30 +1327,10 @@ void readlevelcvars(void)
        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;
@@ -1380,7 +1359,7 @@ float sound_allowed(float dest, entity e)
         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
@@ -1526,7 +1505,7 @@ void play2team(float t, string filename)
 {
     local entity head;
 
-    if (cvar("bot_sound_monopoly"))
+    if (autocvar_bot_sound_monopoly)
         return;
 
     FOR_EACH_REALPLAYER(head)
@@ -1538,7 +1517,7 @@ void play2team(float t, string filename)
 
 void play2all(string samp)
 {
-    if (cvar("bot_sound_monopoly"))
+    if (autocvar_bot_sound_monopoly)
         return;
 
     sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE);
@@ -1557,8 +1536,12 @@ void precache_playermodel(string m)
        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);
@@ -1603,12 +1586,12 @@ void precache()
     }
 
 #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");
@@ -1618,22 +1601,22 @@ void precache()
         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);
     }
@@ -1655,8 +1638,6 @@ void precache()
     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");
@@ -1693,7 +1674,7 @@ void precache()
         precache_sound ("weapons/hook_impact.wav"); // hook
     }
 
-    if(cvar("sv_precacheweapons"))
+    if(autocvar_sv_precacheweapons)
     {
         //precache weapon models/sounds
         local float wep;
@@ -1784,6 +1765,14 @@ void objerror(string s)
     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);
@@ -1834,6 +1823,11 @@ void InitializeEntitiesRun()
     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;
@@ -1843,6 +1837,7 @@ void InitializeEntitiesRun()
         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;
@@ -1851,9 +1846,16 @@ void InitializeEntitiesRun()
             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;
@@ -2047,11 +2049,12 @@ float WarpZone_Projectile_Touch_ImpactFilter_Callback()
 }
 #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)
 {
@@ -2068,6 +2071,10 @@ 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");
@@ -2544,10 +2551,7 @@ float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, f
 
         // 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;
     }
@@ -2624,7 +2628,6 @@ void zcurveparticles_from_tracetoss(float effectno, vector start, vector end, ve
        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)));
@@ -2683,7 +2686,7 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
        string s;
        vector v;
 
-       if (cvar("g_shootfromeye"))
+       if (autocvar_g_shootfromeye)
        {
                if (visual)
                {
@@ -2695,7 +2698,7 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
                        vecs_z = 0;
                }
        }
-       else if (cvar("g_shootfromcenter"))
+       else if (autocvar_g_shootfromcenter)
        {
                if (visual)
                {
@@ -2707,7 +2710,7 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
                        vecs_z -= 2;
                }
        }
-       else if ((s = cvar_string("g_shootfromfixedorigin")) != "")
+       else if ((s = autocvar_g_shootfromfixedorigin) != "")
        {
                v = stov(s);
                if (y_is_right)
@@ -2717,9 +2720,9 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
                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;
 }
@@ -2857,65 +2860,65 @@ void SoundEntity_Detach(entity pl)
 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;
index b73bdb05fc25c81d336b6dba5fab181d442fc98b..ba1f8accc348c5fe2692f219531c4c6a2af78c50 100644 (file)
@@ -379,8 +379,8 @@ void onslaught_generator_think()
        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.
@@ -809,7 +809,7 @@ void onslaught_controlpoint_updatesprite(entity e)
 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;
@@ -874,7 +874,7 @@ void spawnfunc_onslaught_generator()
        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);
@@ -1127,7 +1127,7 @@ void onslaught_controlpoint_icon_buildthink()
        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");
@@ -1177,8 +1177,8 @@ void onslaught_controlpoint_touch()
        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");
@@ -1191,7 +1191,7 @@ void onslaught_controlpoint_touch()
        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;
index 23330cdfc22a8f24ddf65ee3344655538a44db26..022fde20152fec14ba2b6e223308569b6b146ff8 100644 (file)
@@ -188,6 +188,7 @@ void() monster_spawnwanderpath =
 
 void() monster_checkbossflag =
 {
+//#NO AUTOCVARS START
 #if 0
        local float healthboost;
        local float r;
@@ -222,6 +223,7 @@ void() monster_checkbossflag =
                while (self.colormod_x > 0.6 && self.colormod_y > 0.6 && self.colormod_z > 0.6);
        }
 #endif
+//#NO AUTOCVARS END
 };
 
 
index 1a43fc78ea8d89a026b6b8406fe27318ca0e834b..19821429c3d7b46f4f6aa09a77ce626de9688556 100644 (file)
@@ -40,12 +40,14 @@ float   AS_MISSILE              = 4;
 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;
 
index fa255699f16f22afedf838021338febebfb4d106..dd12e96bcb9471ff27b53a6364e4ff1b64988b5f 100644 (file)
@@ -153,7 +153,7 @@ void() monster_death_use =
 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...
diff --git a/qcsrc/server/monsters/mode_management.qc b/qcsrc/server/monsters/mode_management.qc
deleted file mode 100644 (file)
index 9f3770f..0000000
+++ /dev/null
@@ -1,526 +0,0 @@
-
-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();
-}
index 9b7ad548c4bebfeae4d99d4f2176d1e261f1c62e..2973dee97c01daff3b3cf4739a4396ac9834e817 100644 (file)
@@ -77,10 +77,10 @@ float zombie_scoretarget(entity trg)
                 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;
         }
     }
 
@@ -153,7 +153,7 @@ void zombie_die(vector dir)
     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;
 }
 
@@ -212,7 +212,7 @@ void zombie_move()
     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;
 
@@ -235,14 +235,14 @@ void zombie_move()
 
     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;
@@ -311,8 +311,8 @@ float zombie_verb_idle(float eval)
     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);
@@ -340,7 +340,7 @@ float zombie_verb_attack_findtarget(float eval)
         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);
@@ -371,13 +371,13 @@ void zombie_runattack_damage()
     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;
@@ -395,7 +395,7 @@ float zombie_verb_attack_run(float eval)
         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)
@@ -408,7 +408,7 @@ float zombie_verb_attack_run(float eval)
         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);
@@ -426,7 +426,7 @@ void zombie_standattack_damage()
     //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)
 
 
@@ -446,7 +446,7 @@ float zombie_verb_attack_stand(float eval)
         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)
@@ -459,7 +459,7 @@ float zombie_verb_attack_stand(float eval)
         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);
@@ -507,7 +507,7 @@ void zombie_spawn()
     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;
@@ -520,7 +520,7 @@ void zombie_spawn()
 
 void spawnfunc_monster_zombie()
 {
-    if not(cvar("g_monsters"))
+    if not(autocvar_g_monsters)
     {
         remove(self);
         return;
index dd3f43f9fe6549ce4dbe1ed8344603746e192c8c..89feff9a49e3bbdf77de224226fd569adf8cfb9f 100644 (file)
@@ -89,10 +89,10 @@ void movelib_move(vector force,float max_velocity,float drag,float theMass,float
     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);
 
@@ -137,7 +137,7 @@ void movelib_update(vector dir,float force)
     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;
index 0b1bea45edc46983f5f555db12eb3c9d0c56e043..6978496802d1d61585b46ea45bb3d937e32db1f8 100644 (file)
@@ -87,19 +87,48 @@ float CallbackChain_Call(entity cb)
        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
index fdfbdfb1223d2c3bfc9111b584c85ce2decc368d..05a5187e508709528c16cee43e7938027fb64d5b 100644 (file)
@@ -16,11 +16,12 @@ float CallbackChain_Call(entity cb);
 
 #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()
@@ -94,6 +95,10 @@ MUTATOR_HOOKABLE(FilterItem);
        // 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
 
@@ -119,13 +124,30 @@ MUTATOR_HOOKABLE(EditProjectile);
                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 
diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc
new file mode 100644 (file)
index 0000000..4cddbbc
--- /dev/null
@@ -0,0 +1,363 @@
+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;
+}
diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc
new file mode 100644 (file)
index 0000000..60c39d4
--- /dev/null
@@ -0,0 +1,326 @@
+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;
+}
index 2b6f54780e51ff98fea12f6c6527e541eba307e5..e1cb1a85bcfe65e788eb11ce0fb1ada428205ee8 100644 (file)
@@ -2,7 +2,6 @@
 
 // #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';
@@ -181,7 +180,7 @@ void kh_Scores_Event(entity player, entity key, string what, float frags_player,
        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));
@@ -285,8 +284,8 @@ void kh_Key_Detach(entity key) // runs every time a key is dropped or lost. Runs
        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;
@@ -419,7 +418,7 @@ void kh_Key_Collect(entity key, entity player)  //a player picks up a dropped ke
 
        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;
@@ -440,7 +439,7 @@ void kh_Key_Touch()  // runs many, many times when a key has been dropped and ca
        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);
 }
@@ -488,7 +487,7 @@ void kh_FinishRound()  // runs when a team captures the keys
                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
@@ -498,7 +497,7 @@ 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
@@ -567,9 +566,9 @@ void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a fl
        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");
@@ -577,7 +576,7 @@ void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a fl
        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)
@@ -588,13 +587,13 @@ void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a fl
                                ++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)
@@ -648,17 +647,6 @@ void kh_Key_Think()  // runs all the time
        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
@@ -667,7 +655,7 @@ void kh_Key_Think()  // runs all the time
 #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
@@ -677,9 +665,9 @@ void kh_Key_Think()  // runs all the 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;
                }
        }
@@ -702,7 +690,7 @@ void kh_Key_Think()  // runs all the time
                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
@@ -828,9 +816,9 @@ void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
                        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;
                }
@@ -877,7 +865,7 @@ void kh_WaitForPlayers()  // delay start of the round until enough players are p
 
        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);
 }
@@ -934,7 +922,7 @@ void kh_StartRound()  // runs at the start of each round
        }
 
        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
@@ -951,11 +939,11 @@ float kh_HandleFrags(entity attacker, entity targ, float f)  // adds to the play
                        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
                }
@@ -978,9 +966,9 @@ void kh_Initialize()  // sets up th KH environment
        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
index 894bb3ee54d2212f2f6dcfe056b06f5b4d8cc580..1c05a4a091bed2799cd05c1067edf2b1c4562f36 100644 (file)
@@ -78,13 +78,13 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        // 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;
 
@@ -109,9 +109,9 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
 
                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);
@@ -120,7 +120,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        }
 
        // 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;
@@ -134,7 +134,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
 
 // 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;
@@ -190,11 +190,11 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
        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) {
@@ -249,7 +249,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
                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;
index cc3d563607e3582306dcf5982fafafd95e9f62ec..1cc5c9c65b0408f8def27fce190bcc33d5f3236f 100644 (file)
@@ -61,7 +61,7 @@ void NIX_GiveCurrentWeapon()
                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
        }
        
@@ -71,30 +71,30 @@ void NIX_GiveCurrentWeapon()
                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
@@ -110,16 +110,16 @@ void NIX_GiveCurrentWeapon()
        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;
@@ -176,12 +176,12 @@ MUTATOR_HOOKFUNCTION(nix_FilterItem)
                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;
        }
@@ -227,7 +227,7 @@ MUTATOR_DEFINITION(mutator_nix)
 
        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;
index 54b5b9f57028fd44723dd96abd6b8e60513d2dfb..7e253ddf9dafbe3f50f3d247890e8573edb841bf 100644 (file)
@@ -29,7 +29,7 @@ MUTATOR_HOOKFUNCTION(vampire_BuildMutatorsPrettyString)
 
 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);
 
index 542014e8691275dfe11870f8d97118036f5f846e..d9fff4490467b77fd2f146dd68ec4a416882d6bb 100644 (file)
@@ -1,4 +1,6 @@
 MUTATOR_DECLARATION(gamemode_keyhunt);
+MUTATOR_DECLARATION(gamemode_freezetag);
+MUTATOR_DECLARATION(gamemode_keepaway);
 
 MUTATOR_DECLARATION(mutator_nix);
 MUTATOR_DECLARATION(mutator_dodging);
index 099349cae06af861b5ce3a625a778e039dc9202a..13e8eea40a9103424f89eb187af775d0903f247f 100644 (file)
@@ -43,7 +43,7 @@ void nb_init() // Called early (worldspawn stage)
        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);
 }
@@ -62,7 +62,7 @@ void ResetBall();
 void LogNB(string mode, entity actor)
 {
        string s;
-       if(!cvar("sv_eventlog"))
+       if(!autocvar_sv_eventlog)
                return;
        s = strcat(":nexball:", mode);
        if(actor != world)
@@ -80,8 +80,7 @@ void ball_restart (void)
 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))
@@ -202,7 +201,8 @@ void DropBall (entity ball, vector org, vector vel)
        }
 
        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);
 
@@ -256,7 +256,7 @@ void ResetBall (void)
                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;
        }
 }
 
@@ -305,7 +305,7 @@ void basketball_touch (void)
                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);
@@ -395,7 +395,7 @@ void GoalTouch (void)
        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);
 }
 
 //=======================//
@@ -470,13 +470,13 @@ void SpawnBall (void)
 
        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";
@@ -496,7 +496,7 @@ void SpawnBall (void)
 
        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)
@@ -514,8 +514,8 @@ 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();
 }
 
@@ -524,8 +524,8 @@ void spawnfunc_nexball_football (void)
        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();
 }
 
@@ -603,7 +603,7 @@ void W_Nexball_Touch (void)
        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)
                {
@@ -630,7 +630,7 @@ void W_Nexball_Attack (float t)
        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)
        {
@@ -644,15 +644,15 @@ void W_Nexball_Attack (float t)
                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 ??
 }
 
@@ -661,7 +661,7 @@ void W_Nexball_Attack2 (void)
        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 ();
 
@@ -675,11 +675,11 @@ void W_Nexball_Attack2 (void)
        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;
@@ -690,31 +690,31 @@ float w_nexball_weapon(float req)
        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)
@@ -725,6 +725,7 @@ float w_nexball_weapon(float req)
                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);
diff --git a/qcsrc/server/playerstats.qc b/qcsrc/server/playerstats.qc
new file mode 100644 (file)
index 0000000..c5ba3b0
--- /dev/null
@@ -0,0 +1,273 @@
+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);
+               }
+       }
+}
diff --git a/qcsrc/server/playerstats.qh b/qcsrc/server/playerstats.qh
new file mode 100644 (file)
index 0000000..baaddcb
--- /dev/null
@@ -0,0 +1,53 @@
+// 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);
index 4020d5d53f3b9e1a8bbbe24942e18686d6ed960a..0ce3d515a1d537837699d88b825fc9216dad9276 100644 (file)
@@ -179,9 +179,9 @@ float Portal_TeleportPlayer(entity teleporter, entity player)
 
        // 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;
 }
@@ -281,7 +281,7 @@ void Portal_Touch()
                        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;
 
@@ -361,7 +361,7 @@ void Portal_Connect(entity teleporter, entity destination)
        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;
@@ -447,7 +447,7 @@ void Portal_Think()
        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);
 
@@ -614,8 +614,8 @@ entity Portal_Spawn(entity own, vector org, vector ang)
        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;
index c2718d4e8642d69e006bc84400a4ff442d235b39..c76395fdbc27df7bdd26371a491fe1da65064276 100644 (file)
@@ -35,11 +35,13 @@ campaign.qh
 ../common/mapinfo.qh
 ../common/util.qc
 
+accuracy.qh
 csqcprojectile.qh
 csqceffects.qc
 
 anticheat.qh
 cheats.qh
+playerstats.qh
 
 portals.qh
 
@@ -168,15 +170,19 @@ monsters/fight.qc
 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
index 3786edbe5137d25c431da79d37036f9ea7b97361..9817b3b0e1afaa45675b4755f45989da50afe0d6 100644 (file)
@@ -167,6 +167,13 @@ void race_setTime(string map, float t, string myuid, string mynetname, entity e)
 
        // 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);
        
@@ -270,8 +277,8 @@ void race_SendTime(entity e, float cp, float t, float tvalid)
                        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)
@@ -299,9 +306,9 @@ void race_SendTime(entity e, float cp, float t, float tvalid)
                                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)
@@ -735,11 +742,21 @@ void trigger_race_checkpoint_verify()
                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);
                                }
        }
index e2b2134cc628648ae6d0b4b6d1536235cd65617b..8f5e005a425811016052ba7b63882c9cab3f83bb 100644 (file)
@@ -36,7 +36,7 @@ spawn point for runes in runematch
 
 void spawnfunc_runematch_spawn_point()
 {
-       if(!g_runematch || !cvar("g_runematch_fixedspawns"))
+       if(!g_runematch || !autocvar_g_runematch_fixedspawns)
        {
                remove(self);
                return;
@@ -156,7 +156,7 @@ vector RuneColormod(float r)
        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();
@@ -243,7 +243,7 @@ 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
        {
@@ -297,7 +297,7 @@ void DropRune(entity pl, entity e)
        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));
@@ -358,8 +358,8 @@ void DropAllRunes(entity pl)
                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
@@ -452,7 +452,7 @@ void spawn_runes()
        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)
@@ -501,8 +501,8 @@ void spawn_runes()
                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");
@@ -533,7 +533,7 @@ void RuneMatchGivePoints()
 {
        entity rune;
 
-       if(!g_runematch || !cvar("g_runematch_pointamt"))
+       if(!g_runematch || !autocvar_g_runematch_pointamt)
                return;
 
        if(gameover)
@@ -542,7 +542,7 @@ void RuneMatchGivePoints()
        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
@@ -553,7 +553,7 @@ void RuneMatchGivePoints()
 
                if(rune.owner.classname == "player")
                {
-                       UpdateFrags(rune.owner, cvar("g_runematch_pointamt"));
+                       UpdateFrags(rune.owner, autocvar_g_runematch_pointamt);
                }
        }while(rune);
 }
@@ -586,15 +586,15 @@ float RunematchHandleFrags(entity attacker, entity targ, float f)
        }
 
        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;
index fbddca71df4438742f9e125f57bc458e2cf42173..6c7a7dbc3350208546216979e4df167e2a1bf004 100644 (file)
@@ -88,6 +88,7 @@ void TeamScore_Spawn(float t, string name)
        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)
@@ -150,6 +151,11 @@ void ScoreInfo_SetLabel_PlayerScore(float i, string label, float scoreflags)
                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)
@@ -245,6 +251,7 @@ void PlayerScore_Clear(entity player)
 
        if(teamscores_entities_count)
                return;
+
        if(g_lms) return;
        if(g_arena || g_ca) return;
        if(g_race && !g_race_qualifying) return;
@@ -330,6 +337,8 @@ float PlayerScore_Add(entity player, float scorefield, float score)
        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);
 }
 
@@ -366,13 +375,21 @@ void WinningConditionHelper()
        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)
        {
@@ -864,3 +881,30 @@ void Score_NicePrint(entity to)
        }
 }
 
+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]));
+       }
+}
index 3ac0b03b5577dd49cf5dbb5eea7e1ad7e2fd02e6..f94b683323dfb8b57d974c7d2b2dd683ace5d90b 100644 (file)
@@ -2,6 +2,8 @@ entity scores_initialized; // non-world when scores labels/rules have been set
 .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!
index 4db1b4493af571ec3b12f504347a6461a41beba1..2e75fefb9f41402bfa09193dfb313b1e3d452dd1 100644 (file)
@@ -34,7 +34,6 @@ void ScoreRules_basics_end()
 }
 void ScoreRules_generic()
 {
-       CheckAllowedTeams(world);
        if(teams_matter)
        {
                CheckAllowedTeams(world);
@@ -91,7 +90,7 @@ void ScoreRules_dom()
 {
        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;
@@ -187,3 +186,26 @@ void ScoreRules_nexball(float teams)
        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();
+}
index 5b8ca7ff867daae82bfe1f4f9ac5f03fabe2f037..68a86e9c479e7f68a9908fc12230831f2bb50803 100644 (file)
@@ -2,7 +2,7 @@
 void CreatureFrame (void)
 {
        local entity oldself;
-       local float dm, maxspeed;
+       local float dm;
        oldself = self;
        self = findfloat(world, iscreature, TRUE);
        while (self)
@@ -34,7 +34,7 @@ void CreatureFrame (void)
                                }
                                if (self.dmgtime < time)
                                {
-                                       self.dmgtime = time + 0.1;
+                                       self.dmgtime = time + 0.2;
                                        if (self.watertype == CONTENT_LAVA)
                                        {
                                                if (self.watersound_finished < time)
@@ -67,26 +67,26 @@ void CreatureFrame (void)
                                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)
                        {
@@ -175,41 +175,14 @@ void StartFrame (void)
 
        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();
 
@@ -219,7 +192,7 @@ void StartFrame (void)
 
        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;
@@ -227,7 +200,7 @@ void StartFrame (void)
        // 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;
@@ -241,7 +214,7 @@ void StartFrame (void)
        RuneMatchGivePoints();
        bot_serverframe();
 
-       if(cvar("spawn_debugview"))
+       if(autocvar_spawn_debugview)
        {
                RandomSelection_Init();
                for(self = world; (self = find(self, classname, "player")); )
@@ -259,10 +232,11 @@ void StartFrame (void)
 .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;
@@ -377,6 +351,12 @@ void SV_OnEntityPreSpawnFunction()
                }
        }
 
+       if(DoesQ3ARemoveThisEntity())
+       {
+               remove(self);
+               return;
+       }
+
        // support special -1 and -2 angle from radiant
        if (self.angles == '0 -1 0')
                self.angles = '-90 0 0';
index 9f0075afa53756b1f278443e979f7d37bde3c424..5cd714b652a64f832e7c03633e40567596f6111f 100644 (file)
@@ -57,7 +57,7 @@ float Item_Customize()
        {
                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;
@@ -111,7 +111,7 @@ void Item_Show (entity e, float mode)
                // 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;
@@ -123,7 +123,7 @@ void Item_Show (entity e, float mode)
                // 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;
@@ -133,9 +133,9 @@ void Item_Show (entity e, float mode)
 
        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)
@@ -268,8 +268,8 @@ float Item_GiveTo(entity item, entity player)
                        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))
                        {
@@ -298,7 +298,7 @@ float Item_GiveTo(entity item, entity player)
                                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;
                        }
 
@@ -308,7 +308,7 @@ float Item_GiveTo(entity item, entity player)
                                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");
                        }
 
@@ -318,7 +318,7 @@ float Item_GiveTo(entity item, entity player)
                                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
@@ -327,15 +327,7 @@ float Item_GiveTo(entity item, entity player)
                                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;
                        }
                }
        }
@@ -373,32 +365,32 @@ float Item_GiveTo(entity item, entity player)
                        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);
                        }
                }
 
@@ -426,27 +418,27 @@ float Item_GiveTo(entity item, entity player)
                        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);
                        }
                }
        }
@@ -598,7 +590,7 @@ float weapon_pickupevalfunc(entity player, entity item)
        // 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 )
@@ -638,7 +630,7 @@ float commodity_pickupevalfunc(entity player, entity item)
        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);
 
@@ -743,36 +735,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                        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
@@ -787,7 +749,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                }
                */
 
-               if(cvar("spawn_debug") >= 2)
+               if(autocvar_spawn_debug >= 2)
                {
                        entity otheritem;
                        for(otheritem = findradius(self.origin, 3); otheritem; otheritem = otheritem.chain)
@@ -824,7 +786,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                                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);
@@ -1263,10 +1225,10 @@ void spawnfunc_item_health_large (void) {
 }
 
 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) {
@@ -1290,10 +1252,10 @@ void spawnfunc_item_health25() { spawnfunc_item_health_medium(); }
 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) {
@@ -1306,10 +1268,10 @@ void spawnfunc_item_strength (void) {
 }
 
 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) {
@@ -1365,9 +1327,9 @@ void spawnfunc_target_items (void)
 
        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");
@@ -1760,9 +1722,9 @@ float GiveItems(entity e, float beginarg, float endarg)
        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)
        {
index df5788f4c3a0ff251854b2fd9d5235b23b99a073..1e72b765a0a0b548de052f9d31accdfc8e906b0c 100644 (file)
@@ -35,7 +35,7 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
 
        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');
@@ -127,9 +127,9 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
 
 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")
@@ -137,6 +137,7 @@ void trigger_push_touch()
        if (other.classname != "gib")
        if (other.classname != "casing")
        if (other.classname != "droppedweapon")
+       if (other.classname != "keepawayball")
        if (!other.projectiledeathtype || other.classname == "bullet")
                return;
 
@@ -170,7 +171,7 @@ void trigger_push_touch()
                }
                local float ct;
                ct = clienttype(other);
-               if( ct == CLIENTTYPE_REAL)
+               if( ct == CLIENTTYPE_REAL || ct == CLIENTTYPE_BOT)
                {
                        local float i;
                        local float found;
@@ -184,11 +185,14 @@ void trigger_push_touch()
                                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;
 
@@ -285,12 +289,11 @@ void trigger_push_findtarget()
  */
 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;
 
index d92a2539d42487fb436bfa19c0c53999170e1bfc..f90c812d9bd0691ed332e4817bc2dd216c6338aa 100644 (file)
@@ -245,37 +245,43 @@ void spawnfunc_func_plat()
 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);
@@ -536,13 +542,14 @@ void spawnfunc_func_pendulum()
 
        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
@@ -1433,8 +1440,10 @@ void spawnfunc_func_door_rotating()
        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";
 
index 3d3f1d626ec0f43c99ea5839e5d5315f66beaab5..8cc7e479791b6a3fc8bec91c48383355953f2563 100644 (file)
@@ -23,7 +23,7 @@ void spawnfunc_weapon_plasmagun()    { spawnfunc_weapon_hagar();        }
 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
@@ -47,11 +47,13 @@ void target_init_verify()
                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);
                        }
 }
@@ -59,7 +61,7 @@ void target_init_verify()
 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);
 }
@@ -70,25 +72,25 @@ void target_give_init()
        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
@@ -98,7 +100,9 @@ void target_give_init()
                        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();
@@ -126,3 +130,54 @@ void spawnfunc_team_CTF_redspawn()   { spawnfunc_info_player_team1();  }
 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;
+}
index eba0ea0681b3ee22edfcc378e7ca1c23f1027b17..93ced82670b1a36fb15c42a8236419621d52513a 100644 (file)
@@ -33,7 +33,7 @@ float check_tdeath(entity player, vector org, vector telefragmin, vector telefra
        {
                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;
@@ -48,7 +48,7 @@ void tdeath(entity player, entity teleporter, entity telefragger, vector telefra
        {
                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)
@@ -115,7 +115,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
        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
@@ -128,7 +128,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
                if(teleporter.owner)
                {
                        player.pusher = teleporter.owner;
-                       player.pushltime = time + cvar("g_maxpushtime");
+                       player.pushltime = time + autocvar_g_maxpushtime;
                }
                else
                {
@@ -183,7 +183,7 @@ void Teleport_Touch (void)
                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'))
@@ -205,9 +205,9 @@ void Teleport_Touch (void)
        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);
index 13680e68a8a2719c32ad396fbdef8ef692899e68..0363d35a091403521432241e81b531d544f085ae 100644 (file)
@@ -14,11 +14,11 @@ float IsTeamBalanceForced()
                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;
 }
@@ -76,7 +76,7 @@ void entcs_init();
 
 void LogTeamchange(float player_id, float team_number, float type)
 {
-       if(!cvar("sv_eventlog"))
+       if(!autocvar_sv_eventlog)
                return;
 
        if(player_id < 1)
@@ -101,6 +101,8 @@ void WriteGameCvars()
        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()
@@ -110,9 +112,10 @@ 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")));
@@ -127,6 +130,9 @@ void ReadGameCvars()
                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;
@@ -137,13 +143,14 @@ void ReadGameCvars()
        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()
@@ -154,15 +161,7 @@ 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;
 }
 
@@ -174,9 +173,6 @@ void InitGameplayMode()
 
        VoteReset();
 
-       teams_matter = 0;
-       cvar_set("teamplay", "0");
-
        // make sure only ONE type is selected
        ReadGameCvars();
        WriteGameCvars();
@@ -206,9 +202,9 @@ void InitGameplayMode()
        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)
        {
@@ -222,7 +218,7 @@ void InitGameplayMode()
                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
        }
 
@@ -231,8 +227,8 @@ void InitGameplayMode()
                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
        }
@@ -242,20 +238,16 @@ void InitGameplayMode()
                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
@@ -265,10 +257,10 @@ void InitGameplayMode()
        {
                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();
        }
 
@@ -276,7 +268,7 @@ void InitGameplayMode()
        {
                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;
@@ -289,12 +281,12 @@ void InitGameplayMode()
        {
                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)
@@ -302,8 +294,8 @@ void InitGameplayMode()
                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");
        }
@@ -312,11 +304,21 @@ void InitGameplayMode()
                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;
@@ -339,17 +341,17 @@ void InitGameplayMode()
                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
        }
 
@@ -366,13 +368,20 @@ void InitGameplayMode()
        {
                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();
 
@@ -383,7 +392,7 @@ void InitGameplayMode()
        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));
@@ -398,19 +407,19 @@ void InitGameplayMode()
        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;
@@ -430,7 +439,7 @@ void InitGameplayMode()
 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";
@@ -448,14 +457,14 @@ void PrintWelcomeMessage(entity pl)
 
        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;
        }
 
@@ -464,7 +473,7 @@ void PrintWelcomeMessage(entity pl)
                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;
@@ -504,19 +513,19 @@ void PrintWelcomeMessage(entity pl)
                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");
@@ -527,7 +536,7 @@ void PrintWelcomeMessage(entity pl)
        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 != "")
@@ -539,13 +548,13 @@ void PrintWelcomeMessage(entity pl)
        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);
        }
 
@@ -553,7 +562,7 @@ void PrintWelcomeMessage(entity pl)
                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));
        }
@@ -618,11 +627,7 @@ void CheckAllowedTeams (entity for_whom)
        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");
@@ -688,9 +693,9 @@ void CheckAllowedTeams (entity for_whom)
 
        // 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)
@@ -707,6 +712,16 @@ void CheckAllowedTeams (entity for_whom)
                                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)
@@ -728,8 +743,15 @@ void GetTeamCounts(entity ignore)
        // 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);
@@ -737,7 +759,7 @@ void GetTeamCounts(entity ignore)
                                bvalue = value;
                        else
                                bvalue = 0;
-                       if(head.team == COLOR_TEAM1)
+                       if(t == COLOR_TEAM1)
                        {
                                if(c1 >= 0)
                                {
@@ -745,7 +767,7 @@ void GetTeamCounts(entity ignore)
                                        cb1 = cb1 + bvalue;
                                }
                        }
-                       if(head.team == COLOR_TEAM2)
+                       if(t == COLOR_TEAM2)
                        {
                                if(c2 >= 0)
                                {
@@ -753,7 +775,7 @@ void GetTeamCounts(entity ignore)
                                        cb2 = cb2 + bvalue;
                                }
                        }
-                       if(head.team == COLOR_TEAM3)
+                       if(t == COLOR_TEAM3)
                        {
                                if(c3 >= 0)
                                {
@@ -761,7 +783,7 @@ void GetTeamCounts(entity ignore)
                                        cb3 = cb3 + bvalue;
                                }
                        }
-                       if(head.team == COLOR_TEAM4)
+                       if(t == COLOR_TEAM4)
                        {
                                if(c4 >= 0)
                                {
@@ -771,6 +793,18 @@ void GetTeamCounts(entity ignore)
                        }
                }
        }
+
+       // 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)
@@ -793,12 +827,12 @@ float FindSmallestTeam(entity pl, float ignore_pl)
        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");
@@ -806,6 +840,8 @@ float FindSmallestTeam(entity pl, float ignore_pl)
                        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");
        }
@@ -873,33 +909,6 @@ float JoinBestTeam(entity pl, float only_return_best, float forcebestteam)
        // 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)
@@ -1011,12 +1020,12 @@ void SV_ChangeTeam(float _color)
                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
 
@@ -1331,9 +1340,9 @@ void tdm_spawnteams()
 {
        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);
index 99f18c20b0c545ffb42c7eb7f8cc2a240a5058e0..843af3d5ad64fad215932d91c7c25a7300febf92 100644 (file)
@@ -19,15 +19,15 @@ TFL_AIM_GROUND
 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);
@@ -63,7 +63,7 @@ vector turret_stdproc_aim_generic()
                                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;
                                }
                        }
index d3e0553db9800452fd252ca40c877b5900f53822..c7f25a4467825f6b9c6eefbd7ba9f4fc96b73289 100644 (file)
@@ -269,15 +269,15 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
     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;
     }
@@ -287,8 +287,6 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
     // 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;
     }
@@ -296,11 +294,8 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
     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;
index af53db7c62c234f258cfb46919f1dfe29e820960..7d023e99ef199d9049f3954a9779e4847fa61881 100644 (file)
@@ -609,7 +609,7 @@ void turret_think()
     self.nextthink = time + self.ticrate;
 
     // ONS uses somewhat backwards linking.
-    if (teamplay)
+    if (teams_matter)
     {
         if not (g_onslaught)
             if (self.target)
@@ -637,6 +637,10 @@ void turret_think()
     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)
@@ -718,7 +722,7 @@ void turret_think()
 
         // 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?
@@ -729,7 +733,7 @@ void turret_think()
         }
 
         // 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)
@@ -753,7 +757,7 @@ void turret_think()
             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)
@@ -777,7 +781,7 @@ void turret_think()
 
 void turret_fire()
 {
-    if (cvar("g_turrets_nofire") != 0)
+    if (autocvar_g_turrets_nofire != 0)
         return;
 
     self.turret_firefunc();
@@ -836,7 +840,7 @@ void turrets_manager_think()
     self.nextthink = time + 1;
 
     entity e;
-    if (cvar("g_turrets_reloadcvars") == 1)
+    if (autocvar_g_turrets_reloadcvars == 1)
     {
         e = nextent(world);
         while (e)
@@ -864,7 +868,7 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
        entity e, ee;
 
     // Are turrets allowed?
-    if (cvar("g_turrets") == 0)
+    if (autocvar_g_turrets == 0)
         return 0;
 
 
@@ -873,6 +877,7 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     {
         e = spawn();
 
+        /*
         setorigin(e,'0 0 0');
         setmodel(e,"models/turrets/plasma.md3");
         vector v;
@@ -883,6 +888,7 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
             //crash();
         }
         setmodel(e,"");
+        */
 
         e.classname = "turret_manager";
         e.think = turrets_manager_think;
@@ -913,12 +919,12 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     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)
        {
@@ -1129,6 +1135,10 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
 // 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
@@ -1234,7 +1244,7 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         activator = ee;
         self.use();
     }
-
+       
        turret_stdproc_respawn();
     return 1;
 }
index aff4c0aec907ad77cb2a5a9a2ee8d2001ef72f54..02c0ffa6016291288e71014f89b9dd53574f9c57 100644 (file)
@@ -11,10 +11,10 @@ float ewheel_speed_stop;
 
 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()
@@ -216,6 +216,10 @@ void ewheel_respawnhook()
 {
     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;
 
@@ -307,7 +311,7 @@ void turret_ewheel_dinit()
     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())
index 601a934c5b206eaecc2833aedc5af1048a3e7ec1..03b0c40ad91cc49b873ee48344a18c250d6eeb0a 100644 (file)
@@ -2,19 +2,6 @@ void spawnfunc_turret_fusionreactor();
 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;
@@ -22,20 +9,51 @@ void turret_fusionreactor_fire()
     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()
 {
@@ -48,7 +66,7 @@ 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)
     {
index b6408ed4f32b1f3aa936caad9234a1452fc4930e..1e2890f6ea6c9bce6d1653bd1b5989d9c4b5c8b4 100644 (file)
@@ -10,10 +10,10 @@ void turret_hellion_missile_damage (entity inflictor, entity attacker, float dam
 
 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)
@@ -177,10 +177,10 @@ void turret_hellion_dinit()
     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;
index cea4c13bd822bef60c2c2dc6f4109f1d84c95146..2b8e0f6a38089da861aa43ef9c2f1524a0163cd4 100644 (file)
@@ -111,7 +111,7 @@ void turret_hk_attack()
     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
 
@@ -289,7 +289,7 @@ void turret_hk_missile_think()
 
     // 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;
@@ -367,13 +367,13 @@ void turret_hk_missile_explode()
 
 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)
@@ -388,11 +388,11 @@ void turret_hk_dinit()
 {
     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;
 
index c9a37416b6cdd581edff7b5eb317f734368aaec5..f6426fce25efdab96a268ee0f6b1a513db1bd7ae 100644 (file)
@@ -6,7 +6,7 @@ void turret_machinegun_attack();
 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";
@@ -25,7 +25,7 @@ void turret_machinegun_std_init()
     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)
index e454dadfb533b17410e5f83a4fa09ab0ea262764..9c5ca071d8d5ce8489f233986ba62fe6577a2684 100644 (file)
@@ -79,7 +79,7 @@ void turret_phaser_attack()
     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;
@@ -98,7 +98,7 @@ void turret_phaser_attack()
     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");
 
index 9d786f407947244b0f9e66ea2bd889756ae1c709..0f2de3c869ab1a96fe43328c54f7f4627d018248 100644 (file)
@@ -30,7 +30,7 @@ void turret_targettrigger_touch()
 */
 void spawnfunc_turret_targettrigger()
 {
-    if (!cvar("g_turrets"))
+    if (!autocvar_g_turrets)
     {
         remove(self);
         return;
index 59aaf653de3750a80540b616fdd41ca5df20e081..d1d48c46cdb82b4f5d90746ea7ab8c5d42afe041 100644 (file)
@@ -37,21 +37,21 @@ float walker_std_rocket_turnrate;
 
 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;
 
 }
 
@@ -546,7 +546,7 @@ float walker_attack_meele()
 
     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)
@@ -564,10 +564,10 @@ float walker_attack_rockets()
     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;
@@ -578,7 +578,7 @@ float walker_attack_rockets()
     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;
 }
@@ -616,18 +616,18 @@ void walker_postthink()
 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;
 }
 
@@ -637,7 +637,11 @@ void walker_respawnhook()
     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;
@@ -690,7 +694,7 @@ void turret_walker_dinit()
     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;
index 6f40e0b4d05b6ca6aa7a2c4e69ec60f0ffcec4ce..09efab4bfc629ef2d81d50b387f636c168f28f47 100644 (file)
@@ -31,23 +31,23 @@ float  jetfromtag_groundcontact;
 
 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;
 
 }
 
@@ -114,7 +114,7 @@ void racer_align4point()
         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);
@@ -147,7 +147,7 @@ void racer_bolt_explode()
 
     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);
@@ -163,7 +163,7 @@ void racer_rocket_explode()
     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);
 }
@@ -200,7 +200,7 @@ void racer_fire_cannon(string tagname)
     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;
@@ -208,7 +208,7 @@ void racer_fire_cannon(string tagname)
     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);
 }
@@ -300,8 +300,8 @@ void racer_fire_rocket(string tagname)
 
     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;
@@ -309,7 +309,7 @@ void racer_fire_rocket(string tagname)
     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)));
 
     /*
@@ -320,7 +320,7 @@ void racer_fire_rocket(string 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
@@ -329,7 +329,7 @@ void racer_fire_rocket(string tagname)
     {
     */
         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);
@@ -358,7 +358,7 @@ float racer_pplug()
     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");
@@ -443,14 +443,14 @@ float racer_pplug()
     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;
 
@@ -466,10 +466,10 @@ float racer_pplug()
 
     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)
         {
@@ -481,7 +481,7 @@ float racer_pplug()
             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)
@@ -489,7 +489,7 @@ float racer_pplug()
     {
         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;
 
     }
@@ -596,8 +596,8 @@ void racer_enter()
     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;
@@ -681,7 +681,7 @@ void racer_exit(float eject)
         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;
     }
 }
 
@@ -762,7 +762,7 @@ void racer_blowup()
     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;
index ee6d3976f6dbfa43ab9b4d9c7ac8cb3f1afed7fe..38ebad04275078262cfc5d9bbdf3c6613ad50557 100644 (file)
@@ -295,7 +295,7 @@ void raptor_enter()
     if (clienttype(other) != CLIENTTYPE_REAL)
         return;
 
-    if(teamplay)
+    if(teams_matter)
         if(self.team)
             if(self.team != other.team)
                 return;
@@ -409,7 +409,7 @@ void raptor_exit(float eject)
         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;
     }
 }
 
@@ -421,7 +421,7 @@ float raptor_pplug()
     vector df;
 
 
-    if(cvar("g_vehicle_raptor_reload"))
+    if(autocvar_g_vehicle_raptor_reload)
     {
         raptor_loadsettings();
         cvar_set("g_vehicle_raptor_reload","0");
index 056249ed53a6bc5f276da85ecbfc38532ab6ace6..6743f73d2305aeffc3ae4b66c623945bcd5c06e6 100644 (file)
@@ -27,10 +27,10 @@ void spiderbot_rocket_explode()
         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);
 }
@@ -58,8 +58,8 @@ void spiderbot_rocket_unguided()
 
 
     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);
 
@@ -79,8 +79,8 @@ void spiderbot_rocket_guided()
 
     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);
 
@@ -161,15 +161,15 @@ void spiderbot_rocket_do()
 
     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;
@@ -181,9 +181,9 @@ void spiderbot_rocket_do()
 
     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;
 }
@@ -213,8 +213,8 @@ void spiderbot_minigun_fire(entity gun, float trail)
 
     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();
@@ -231,7 +231,7 @@ void spiderbot_miniguns_do()
     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;
@@ -255,32 +255,32 @@ void spiderbot_miniguns_do()
         {
             // 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;
@@ -323,17 +323,17 @@ float spiderbot_pplug()
     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;
@@ -350,7 +350,7 @@ float spiderbot_pplug()
         {
             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
@@ -371,7 +371,7 @@ float spiderbot_pplug()
                         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)
                 {
@@ -385,7 +385,7 @@ float spiderbot_pplug()
                         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);
                 }
 
             }
@@ -417,7 +417,7 @@ float spiderbot_pplug()
 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;
 }
@@ -430,7 +430,7 @@ void spiderbot_enter()
 
     self.colormod = self.tur_head.colormod = '0 0 0';
 
-    if(teamplay)
+    if(teams_matter)
     if(self.team)
     if(self.team != other.team)
         return;
@@ -452,8 +452,8 @@ void spiderbot_enter()
     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;
@@ -533,7 +533,7 @@ void spiderbot_exit(float eject)
        self.colormap            = 1024;
        self.tur_head.colormap   = 1024;
 
-    if not (teamplay)
+    if not (teams_matter)
         self.team                = 0;
     else
     {
@@ -586,7 +586,7 @@ void spiderbot_touch()
 
         //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;
     }
 
@@ -662,7 +662,7 @@ void spiderbot_blowup()
     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;
 
@@ -697,7 +697,7 @@ void vewhicle_spiderbot_dinit()
     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;
index 1fbdecad9fdf6714fff928c760ab9444eb140a35..fbc8032bb1cd6fa3f846d9b37a7c5c84916cd719 100644 (file)
@@ -55,7 +55,7 @@ entity GetKickVoteVictim(string vote, string cmd, entity caller)
                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")
                {
@@ -147,8 +147,8 @@ float GameCommand_Vote(string s, entity e) {
                                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
@@ -171,14 +171,14 @@ float GameCommand_Vote(string s, entity e) {
                                                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();
@@ -215,7 +215,7 @@ float GameCommand_Vote(string s, entity e) {
                                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 {
@@ -223,14 +223,14 @@ float GameCommand_Vote(string s, entity e) {
                                        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();
@@ -248,7 +248,7 @@ float GameCommand_Vote(string s, entity e) {
                                        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 {
@@ -259,7 +259,7 @@ float GameCommand_Vote(string s, entity e) {
                        }
                } 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));
@@ -268,7 +268,7 @@ float GameCommand_Vote(string s, entity e) {
                                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
@@ -282,13 +282,13 @@ float GameCommand_Vote(string s, entity e) {
                        } 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 {
@@ -300,13 +300,13 @@ float GameCommand_Vote(string s, entity e) {
                        } 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 {
@@ -318,13 +318,13 @@ float GameCommand_Vote(string s, entity e) {
                        } 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 {
@@ -341,17 +341,17 @@ float GameCommand_Vote(string s, entity e) {
 
 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)";
        }
 
@@ -367,9 +367,9 @@ void VoteHelp(entity e) {
        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)
@@ -377,10 +377,10 @@ 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;
                }
        }
 }
@@ -393,7 +393,7 @@ string ValidateMap(string m, entity e)
                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.");
@@ -443,17 +443,17 @@ float VoteCommandInList(string votecommand, string list)
 }
 
 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;
        }
 
@@ -512,12 +512,12 @@ void VoteTimeout() {
 
 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();
@@ -542,7 +542,7 @@ void VoteSpam(float yescount, float nocount, float abstaincount, float notvoters
                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));
@@ -603,7 +603,7 @@ void VoteCount() {
        }
 
        //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;
@@ -612,8 +612,8 @@ void VoteCount() {
        }
 
        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);
index 5730744037ea4908168572f68da0afb4bc9fded6..930a413d58c487dbd4be050e2994c0ccd662f4dc 100644 (file)
@@ -16,6 +16,6 @@
 #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"
diff --git a/qcsrc/server/w_campingrifle.qc b/qcsrc/server/w_campingrifle.qc
deleted file mode 100644 (file)
index 07268a7..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-#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
index 0b405ba77e8043dc2d73e7edf7a1155aa8f7554a..2d9ecfd8b31085d0fb0ea2eb2d4294d56d3826a0 100644 (file)
@@ -23,11 +23,13 @@ void W_GiveWeapon (entity e, float wep, string name)
 }
 
 .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;
@@ -35,8 +37,6 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        entity pseudoprojectile;
        float f, ffs;
 
-       float hit;
-
        railgun_start = start;
        railgun_end = end;
 
@@ -47,6 +47,8 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        // 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
@@ -66,6 +68,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
                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)
@@ -121,21 +124,15 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
                // 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);
@@ -151,16 +148,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        }
 
        // 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;
@@ -170,11 +158,13 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
 .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);
@@ -185,14 +175,16 @@ void W_BallisticBullet_Hit (void)
 
                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");
@@ -201,13 +193,12 @@ void W_BallisticBullet_Hit (void)
                }
 
                // 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);
                }
        }
 
@@ -260,7 +251,7 @@ float W_BallisticBullet_LeaveSolid(entity e, vector vel, float constant)
        // 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);
@@ -270,7 +261,7 @@ float W_BallisticBullet_LeaveSolid(entity e, vector vel, float constant)
 
        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)
@@ -310,6 +301,26 @@ void W_BallisticBullet_Touch (void)
        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;
@@ -341,6 +352,9 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
 {
        float lag, dt, savetime, density;
        entity pl, oldself;
+       float antilagging;
+
+       antilagging = (autocvar_g_antilag_bullets && (pSpeed >= autocvar_g_antilag_bullets));
 
        entity proj;
        proj = spawn();
@@ -356,9 +370,9 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                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;
@@ -373,13 +387,14 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
 
        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");
 
@@ -389,7 +404,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                        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)
@@ -402,13 +417,6 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                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
@@ -447,6 +455,23 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                                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;
@@ -469,13 +494,6 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                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)
index 566563487b768b7e82fe761df97b9b3f3cbf3b68..93a110dad8d2e44273c06ef6318e74021e528167 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -9,12 +9,38 @@ REGISTER_WEAPON(CRYLINK, w_crylink, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLA
 .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)
@@ -31,7 +57,10 @@ void W_Crylink_LinkExplode (entity e, entity e2)
        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);
@@ -44,14 +73,19 @@ void W_Crylink_LinkExplode (entity e, entity 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;
@@ -59,8 +93,8 @@ vector W_Crylink_LinkJoin(entity e, float joinspeed)
        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);
@@ -72,51 +106,61 @@ vector W_Crylink_LinkJoin(entity e, float joinspeed)
        // 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;
 }
 
@@ -138,14 +182,38 @@ void W_Crylink_LinkJoinEffect_Think()
                }
                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)
 {
@@ -170,11 +238,13 @@ 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;
@@ -212,17 +282,19 @@ void W_Crylink_Touch2 (void)
        }
 
        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;
@@ -255,16 +327,22 @@ void W_Crylink_Attack (void)
        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)
@@ -273,8 +351,12 @@ void W_Crylink_Attack (void)
                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
@@ -308,24 +390,25 @@ void W_Crylink_Attack (void)
                        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);
@@ -341,19 +424,26 @@ void W_Crylink_Attack (void)
                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)
@@ -362,8 +452,12 @@ void W_Crylink_Attack2 (void)
                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
@@ -387,22 +481,23 @@ void W_Crylink_Attack2 (void)
                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);
@@ -429,56 +524,58 @@ float w_crylink(float req)
 {
        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);
@@ -509,14 +606,14 @@ float w_crylink(float req)
                // 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;
 };
@@ -548,16 +645,16 @@ float w_crylink(float req)
        }
        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;
 }
index 6634837db6131f9da80daf588a54b53ceae2c008..f5491f39aa1054b2c112e70581731437f631d0f0 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -20,7 +20,7 @@ void W_Plasma_TriggerCombo(vector org, float rad, entity own)
                        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;
        }
@@ -39,12 +39,12 @@ void W_Plasma_Explode (void)
        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);
@@ -52,19 +52,22 @@ void W_Plasma_Explode (void)
 
 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;
        }
@@ -92,7 +95,7 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea
                        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
@@ -107,7 +110,7 @@ void W_Electro_Attack()
 {
        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);
 
@@ -115,16 +118,16 @@ void W_Electro_Attack()
        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);
@@ -144,7 +147,8 @@ void W_Electro_Attack2()
 {
        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);
@@ -155,14 +159,14 @@ void W_Electro_Attack2()
        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;
@@ -170,11 +174,14 @@ void W_Electro_Attack2()
        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();
@@ -186,7 +193,7 @@ void W_Electro_Attack2()
        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)
@@ -199,7 +206,7 @@ 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)
        {
@@ -225,7 +232,7 @@ void lgbeam_think()
                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;
@@ -241,28 +248,29 @@ void lgbeam_think()
        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)
@@ -282,20 +290,19 @@ void W_Electro_Attack3 (void)
 {
        // 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;
@@ -326,7 +333,7 @@ void w_electro_checkattack()
        {
                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;
        }
 
@@ -345,7 +352,14 @@ float w_electro(float req)
                        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;
@@ -353,7 +367,7 @@ float w_electro(float req)
                }
                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;
@@ -364,28 +378,42 @@ float w_electro(float req)
        {
                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;
                        }
@@ -393,12 +421,12 @@ float w_electro(float req)
 
                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)
@@ -411,7 +439,7 @@ float w_electro(float req)
                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");
                }
@@ -420,13 +448,13 @@ float w_electro(float req)
                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;
@@ -472,27 +500,27 @@ float w_electro(float req)
        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;
index e78bb2bbc3b1c03ace99f72afcf8f9b280b8430c..73ff1595a79752e395cbd8b3e9c8737b3d58fea0 100644 (file)
@@ -1,5 +1,5 @@
 #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
@@ -19,15 +19,15 @@ void W_Fireball_Explode (void)
 
        // 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?
@@ -40,14 +40,16 @@ void W_Fireball_Explode (void)
                        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);
                }
        }
 
@@ -104,7 +106,7 @@ void W_Fireball_Think()
                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;
 }
@@ -125,7 +127,7 @@ void W_Fireball_Attack1()
 {
        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);
 
@@ -133,16 +135,16 @@ void W_Fireball_Attack1()
        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);
@@ -161,7 +163,7 @@ void W_Fireball_Attack1()
 
 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);
 }
@@ -169,35 +171,35 @@ void W_Fireball_AttackEffect(float i, vector f_diff)
 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()
@@ -211,7 +213,7 @@ 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)
@@ -221,7 +223,7 @@ void W_Firemine_Think()
                        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;
 }
@@ -230,7 +232,7 @@ void W_Firemine_Touch (void)
 {
        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;
@@ -245,7 +247,7 @@ void W_Fireball_Attack2()
        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)
@@ -264,7 +266,7 @@ void W_Fireball_Attack2()
                        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;
 
@@ -274,7 +276,7 @@ void W_Fireball_Attack2()
        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;
@@ -283,8 +285,8 @@ void W_Fireball_Attack2()
        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);
@@ -308,7 +310,7 @@ float w_fireball(float req)
                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;
@@ -316,7 +318,7 @@ float w_fireball(float req)
                }
                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;
@@ -327,16 +329,16 @@ float w_fireball(float req)
        {
                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)
@@ -352,9 +354,9 @@ float w_fireball(float req)
        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;
@@ -387,32 +389,32 @@ float w_fireball(float req)
        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;
index 75d3d7e7bb8925c55d36ce8f114e26e25cda6dba..d5f6c5d6827f13f213330b5012a74bdbf2fd9344 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -20,7 +20,7 @@ void W_Grenade_Explode (void)
        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);
 }
@@ -39,7 +39,7 @@ void W_Grenade_Explode2 (void)
        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);
 }
@@ -65,18 +65,18 @@ void W_Grenade_Think1 (void)
                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;
@@ -95,7 +95,7 @@ void W_Grenade_Touch1 (void)
                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);
 
@@ -109,18 +109,18 @@ void W_Grenade_Touch1 (void)
                // 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;
@@ -139,7 +139,7 @@ void W_Grenade_Touch2 (void)
                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);
 
@@ -153,7 +153,7 @@ void W_Grenade_Touch2 (void)
                // 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);
        }
 }
 
@@ -162,8 +162,8 @@ void W_Grenade_Attack (void)
        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);
@@ -172,31 +172,31 @@ void W_Grenade_Attack (void)
        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);
@@ -209,8 +209,8 @@ void W_Grenade_Attack2 (void)
        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);
@@ -219,30 +219,30 @@ void W_Grenade_Attack2 (void)
        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);
@@ -267,7 +267,7 @@ float w_glauncher(float req)
                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;
@@ -275,7 +275,7 @@ float w_glauncher(float req)
                }
                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;
@@ -285,10 +285,10 @@ float w_glauncher(float req)
        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)
                {
@@ -306,10 +306,10 @@ float w_glauncher(float req)
                                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);
                        }
                }
        }
@@ -330,9 +330,9 @@ float w_glauncher(float req)
        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
@@ -354,19 +354,19 @@ float w_glauncher(float req)
        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;
 }
index 587c9fccc04b4a2de5528d23aa394f63dda06ec0..5fb25642e2fa41383515d11085393ac64c74707f 100644 (file)
@@ -1,12 +1,12 @@
 #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);
 }
@@ -14,7 +14,7 @@ void W_Hagar_Explode (void)
 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);
 }
@@ -45,8 +45,8 @@ void W_Hagar_Attack (void)
        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);
 
@@ -54,11 +54,11 @@ void W_Hagar_Attack (void)
        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);
@@ -80,9 +80,8 @@ void W_Hagar_Attack2 (void)
        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);
 
@@ -90,12 +89,12 @@ void W_Hagar_Attack2 (void)
        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);
@@ -121,25 +120,25 @@ float w_hagar(float req)
 {
        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)
@@ -152,9 +151,9 @@ float w_hagar(float req)
        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
@@ -183,13 +182,13 @@ float w_hagar(float req)
                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;
 }
index 6aaf174147142b1f70212fd276274cbec9c5c053..4bba3b8051b8d4d504caf0047c9b3d1579e53062 100644 (file)
@@ -1,26 +1,18 @@
 #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);
 }
@@ -32,15 +24,15 @@ void W_HLAC_Attack (void)
 
     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)
        {
@@ -51,10 +43,9 @@ void W_HLAC_Attack (void)
        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);
@@ -62,13 +53,13 @@ void W_HLAC_Attack (void)
        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;
@@ -83,22 +74,21 @@ void W_HLAC_Attack2f (void)
        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);
@@ -106,13 +96,13 @@ void W_HLAC_Attack2f (void)
        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;
@@ -128,10 +118,10 @@ void W_HLAC_Attack2 (void)
 
     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)
@@ -159,14 +149,14 @@ void HLAC_fire1_02()
                        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);
        }
 };
 
@@ -178,22 +168,22 @@ void spawnfunc_weapon_hlac (void)
 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);
                }
 
        }
@@ -208,9 +198,9 @@ float w_hlac(float req)
        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
@@ -230,9 +220,9 @@ float w_hlac(float req)
                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
index 334e434c8afa9526774aab288d2ad2dfcbfa6dd5..da5e3f9423d086f6bdb236a2f744ed091fa4649d 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -41,12 +41,12 @@ void W_Hook_Explode2 (void)
 
        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;
@@ -63,30 +63,30 @@ void W_Hook_Attack2()
        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';
@@ -127,41 +127,41 @@ float w_hook(float req)
                        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 )
@@ -187,7 +187,7 @@ float w_hook(float req)
                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)
@@ -235,11 +235,11 @@ float w_hook(float req)
                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)
        {
@@ -264,9 +264,9 @@ float w_hook(float req)
                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
index db11eb395c3a370dce30aa21749e6a4199662702..4ce1331931628366bfaf35037c429edfbbe7f3b4 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -10,9 +10,9 @@ void W_Laser_Touch (void)
 
        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);
 }
@@ -22,9 +22,9 @@ void W_Laser_Think()
        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);
 }
 
@@ -40,15 +40,15 @@ void W_Laser_Attack (float issecondary)
        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 ();
@@ -58,7 +58,7 @@ void W_Laser_Attack (float issecondary)
        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);
@@ -76,7 +76,7 @@ void W_Laser_Attack (float issecondary)
        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);
 
@@ -121,9 +121,9 @@ float gauntletbeam_send(entity to, float sf)
 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)
@@ -139,7 +139,7 @@ void gauntletbeam_think()
        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
@@ -147,8 +147,9 @@ void gauntletbeam_think()
        {
                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
@@ -182,7 +183,7 @@ void W_Laser_Attack2 ()
        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;
@@ -211,34 +212,34 @@ float w_laser(float req)
        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
@@ -281,13 +282,13 @@ float w_laser(float req)
                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;
 }
index aeefbcd0b7dac1a6162726367a65fe2a52b4bf48..7e4749cd543a7eb0736c9800ee8eb53fa21b3d27 100644 (file)
@@ -1,5 +1,5 @@
 #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);
@@ -34,6 +34,7 @@ void W_Mine_Stick ()
        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;
@@ -61,11 +62,11 @@ void W_Mine_Explode ()
        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;
@@ -80,11 +81,11 @@ void W_Mine_DoRemoteExplode ()
        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;
@@ -99,7 +100,7 @@ void W_Mine_RemoteExplode ()
        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();
@@ -109,10 +110,10 @@ void W_Mine_RemoteExplode ()
 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))
@@ -130,16 +131,19 @@ void W_Mine_Think (void)
        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;
@@ -149,7 +153,7 @@ void W_Mine_Think (void)
        }
 
        // 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)
@@ -157,14 +161,17 @@ void W_Mine_Think (void)
                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)
@@ -198,40 +205,40 @@ void W_Mine_Attack (void)
        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;
@@ -240,13 +247,13 @@ void W_Mine_Attack (void)
        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);
@@ -272,16 +279,16 @@ float w_minelayer(float req)
        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;
@@ -313,9 +320,9 @@ float w_minelayer(float req)
                        }
                        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");
@@ -368,10 +375,10 @@ float w_minelayer(float req)
        {
                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);
                        }
                }
 
@@ -410,7 +417,7 @@ float w_minelayer(float req)
        {
                // 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)
@@ -434,15 +441,15 @@ float w_minelayer(float req)
                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;
 }
index 352aa2b25c6edfee928e7b3541eb51f9b9a58ad5..89f209937a83f0cd58f6d335489761e89bdb41f2 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -9,7 +9,7 @@ void W_MinstaNex_Attack (void)
        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;
@@ -28,7 +28,6 @@ void W_MinstaNex_Attack (void)
                if(headshot)
                {
                        AnnounceTo(self, "headshot");
-                       print("h\n");
                }
                if(damage_goodhits && self.minstanex_lasthit)
                {
@@ -44,7 +43,7 @@ void W_MinstaNex_Attack (void)
        // teamcolor / hit beam effect
        vector v;
        v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-       if(teamplay)
+       if(teams_matter)
        {
            switch(self.team)
            {
@@ -86,7 +85,7 @@ void W_MinstaNex_Attack (void)
                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;
        }
 }
 
@@ -179,23 +178,23 @@ float w_minstanex(float req)
                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;
@@ -228,7 +227,7 @@ float w_minstanex(float req)
                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;
@@ -255,9 +254,9 @@ float w_minstanex(float req)
                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
index 493fd005bea62bfd546c6b66949c7b0bd5a3ed94..e05698851fafd38020af629886c1221ee6a72168 100644 (file)
@@ -1,5 +1,5 @@
 #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) {
@@ -21,40 +21,45 @@ void W_Nex_Attack (float issecondary)
        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);
@@ -64,7 +69,7 @@ void W_Nex_Attack (float issecondary)
 
        //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);
@@ -75,6 +80,7 @@ void W_Nex_Attack (float issecondary)
 
 void spawnfunc_weapon_nex (void); // defined in t_items.qc
 
+.float nex_chargepool_pauseregen_finished;
 float w_nex(float req)
 {
        float dt;
@@ -85,49 +91,98 @@ float w_nex(float req)
        }
        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)
        {
@@ -136,6 +191,7 @@ float w_nex(float req)
                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");
@@ -143,13 +199,9 @@ float w_nex(float req)
        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
@@ -169,9 +221,9 @@ float w_nex(float req)
                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
index 65442b21b957caa3b667202c422d9add5497e82b..4e9a2cd706d91b359c60f37dd0e92f079add2162 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -160,7 +160,7 @@ void W_Porto_Attack (void)
 
        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;
@@ -180,13 +180,13 @@ void W_Porto_Attack (void)
        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;
@@ -219,7 +219,7 @@ float w_porto(float req)
        {
                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)
@@ -250,10 +250,10 @@ float w_porto(float req)
                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)
@@ -290,9 +290,9 @@ float w_porto(float req)
                // 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
index c29fda3a2af78575b5d18b9acfbe5db1ce57a425..21874b79053a00f3dafe378d763c82931a3edc6e 100644 (file)
@@ -1,5 +1,5 @@
 #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;
@@ -27,11 +27,11 @@ void W_Rocket_Explode ()
        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;
@@ -48,11 +48,11 @@ void W_Rocket_DoRemoteExplode ()
        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;
@@ -121,7 +121,7 @@ void W_Rocket_RemoteExplode()
        {
                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();
@@ -169,9 +169,9 @@ void W_Rocket_Think (void)
 
        // 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)
@@ -179,11 +179,11 @@ void W_Rocket_Think (void)
                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
@@ -196,21 +196,10 @@ void W_Rocket_Think (void)
                        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);
@@ -260,26 +249,26 @@ void W_Rocket_Attack (void)
        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;
@@ -288,16 +277,16 @@ void W_Rocket_Attack (void)
        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 ();
@@ -319,16 +308,16 @@ float w_rlauncher(float req)
        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;
@@ -360,9 +349,9 @@ float w_rlauncher(float req)
                        }
                        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");
@@ -415,11 +404,11 @@ float w_rlauncher(float req)
        {
                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;
                        }
                }
@@ -460,7 +449,7 @@ float w_rlauncher(float req)
        {
                // 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)
@@ -488,15 +477,15 @@ float w_rlauncher(float req)
                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;
 }
index b74f60e00e28437bb33ab7f016443640bfb134dc..81d55a2265e62387359c843f37636462fd7afac6 100644 (file)
@@ -1,15 +1,14 @@
 #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);
 }
@@ -27,6 +26,7 @@ void Seeker_Missile_Think()
        vector desireddir, olddir, newdir, eorg;
        float turnrate;
        float dist;
+       float spd;
 
        if (time > self.cnt)
        {
@@ -34,14 +34,12 @@ void Seeker_Missile_Think()
                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)
@@ -51,13 +49,13 @@ void Seeker_Missile_Think()
        {
                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)
@@ -66,24 +64,24 @@ void Seeker_Missile_Think()
                                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
                        {
@@ -146,7 +144,7 @@ void Seeker_Missile_Animate()
                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;
@@ -160,11 +158,11 @@ void Seeker_Fire_Missile(vector f_diff)
 {
        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);
 
@@ -174,19 +172,19 @@ void Seeker_Fire_Missile(vector f_diff)
        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.
 
@@ -197,7 +195,6 @@ void Seeker_Fire_Missile(vector f_diff)
        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);
@@ -211,13 +208,13 @@ void Seeker_Vollycontroler_Think()
        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;
@@ -283,7 +280,7 @@ void Seeker_Tag_Touch()
        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;
@@ -298,9 +295,9 @@ void Seeker_Fire_Tag()
 {
        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;
@@ -309,15 +306,15 @@ void Seeker_Fire_Tag()
        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');
@@ -338,7 +335,7 @@ void Seeker_Flac_Explode ()
 {
        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);
 }
@@ -357,7 +354,7 @@ void Seeker_Fire_Flac()
        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)
@@ -376,7 +373,7 @@ void Seeker_Fire_Flac()
                        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);
@@ -385,11 +382,11 @@ void Seeker_Fire_Flac()
        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;
@@ -417,22 +414,22 @@ void spawnfunc_weapon_seeker (void)
 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);
                        }
 
        }
@@ -448,9 +445,9 @@ float w_seeker(float req)
        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
@@ -523,13 +520,13 @@ float w_seeker(float req)
                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;
 }
index c5f1ed12c02143b993bb15d92e7c3d27c7c4d5b1..6d0d094eb404c7800de4316a68397d04b7e0cbef 100644 (file)
@@ -1,5 +1,5 @@
 #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)
@@ -14,25 +14,25 @@ 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);
 
@@ -56,11 +56,14 @@ void shotgun_meleethink (void)
        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));
 
@@ -68,12 +71,13 @@ void shotgun_meleethink (void)
        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;
@@ -82,14 +86,14 @@ void shotgun_meleethink (void)
 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
@@ -99,26 +103,26 @@ 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);
@@ -137,7 +141,7 @@ float w_shotgun(float req)
        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;
@@ -172,13 +176,13 @@ float w_shotgun(float req)
                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;
 }
diff --git a/qcsrc/server/w_sniperrifle.qc b/qcsrc/server/w_sniperrifle.qc
new file mode 100644 (file)
index 0000000..a03a9b6
--- /dev/null
@@ -0,0 +1,353 @@
+#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
index 491030fcbcc486cfde1249c03d5d560e09b22bb4..98767516ae33e5611fec209b6db0cd1bb7dbb398 100644 (file)
@@ -1,5 +1,5 @@
 #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")
@@ -102,7 +102,7 @@ void W_Tuba_NoteThink()
                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)
        {
@@ -131,7 +131,7 @@ void W_Tuba_Attack(float hittype)
 {
        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;
@@ -168,10 +168,10 @@ void W_Tuba_Attack(float hittype)
                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)
@@ -192,7 +192,7 @@ float w_tuba(float req)
        {
                // 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;
@@ -203,18 +203,18 @@ float w_tuba(float req)
        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)
                {
@@ -257,11 +257,11 @@ float w_tuba(float req)
        }
        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;
 }
index 788c9880fe7c4f57df428a9ccc17afbbdc2e7138..0e563405a1fa858ebdbd6719868e30859fd89eef 100644 (file)
@@ -1,8 +1,7 @@
 #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() 
@@ -38,21 +37,18 @@ void UziFlash()
        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;
@@ -60,12 +56,12 @@ void W_Uzi_Attack (float deathtype)
        }
 
        // 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);
@@ -74,7 +70,7 @@ void W_Uzi_Attack (float deathtype)
        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);
 }
 
@@ -94,13 +90,94 @@ void uzi_fire1_02()
                        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
 
@@ -115,19 +192,50 @@ float w_uzi(float req)
                }
        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)
@@ -141,9 +249,15 @@ float w_uzi(float req)
        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
@@ -170,13 +284,13 @@ float w_uzi(float req)
                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;
 }
index 3605b3a82f00148dc8053d15b476fccea0e56946..bda0e77b8a972543b558d4051a13aecdf6d7acec 100644 (file)
@@ -81,8 +81,13 @@ void WaypointSprite_UpdateTeamRadar(entity e, float icon, vector col)
        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;
@@ -113,9 +118,9 @@ void WaypointSprite_FadeOutIn(entity e, float t)
 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)
 {
@@ -401,8 +406,8 @@ entity WaypointSprite_AttachCarrier(
        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;
 }
index e76bc0eb96761c5efa52f02a07400b51fa28cdaa..62e74682090c725e544ce7725e57bc8ba2a06294 100644 (file)
@@ -191,6 +191,8 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        entity wz;
        vector vf, vr, vu;
 
+       WarpZone_trace_firstzone = world;
+       WarpZone_trace_lastzone = world;
        WarpZone_Trace_InitTransform();
        if(!warpzone_warpzones_exist)
        {
@@ -234,6 +236,8 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        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.
@@ -281,11 +285,15 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                }
                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);
@@ -322,6 +330,8 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        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)
@@ -345,6 +355,8 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        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.
@@ -381,11 +393,15 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
                        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);
index 1b594d96d73b7c9da95404ad43e73185a1f66ba6..72485f25c4bc91ef64d1af1ab4c81576a407a6da 100644 (file)
@@ -30,6 +30,8 @@ void WarpZone_MakeAllOther();
 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);
index b460a063dbe04c13460e6e2fc6d19f72827285b6..42262102e50b16421ae0a80003ba817bf8c34b58 100644 (file)
@@ -18,7 +18,9 @@ int isinf(float x)
 }
 int isnan(float x)
 {
-       return !(x + x == x + x);
+       float y;
+       y = x;
+       return (x != y);
 }
 int isnormal(float x)
 {
index f71fbe2d985b37fc9279f11f98009f307c5540c5..f4141c8a3df01899ca3754c2bcb20c8a98f24cfe 100644 (file)
@@ -604,8 +604,38 @@ void WarpZone_StartFrame()
                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;
index 1ae46d1d4068f53d9e6362330d7c30064afd9cf1..2c0f409ea23841e6dc4d41c39eda608da611b9cf 100644 (file)
--- a/quake.rc
+++ b/quake.rc
@@ -1,11 +1,12 @@
 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=
diff --git a/scripts/ctf.shader b/scripts/ctf.shader
new file mode 100644 (file)
index 0000000..2eceff3
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/scripts/ice.shader b/scripts/ice.shader
new file mode 100644 (file)
index 0000000..01c810b
--- /dev/null
@@ -0,0 +1,10 @@
+models/ice/ice
+{
+       dpnoshadow
+       dpreflectcube cubemaps/default/sky
+ {
+       map models/ice/ice.tga
+       blendfunc add
+       rgbgen vertex
+ }
+}
diff --git a/scripts/orbs.shader b/scripts/orbs.shader
new file mode 100644 (file)
index 0000000..26d1fdf
--- /dev/null
@@ -0,0 +1,48 @@
+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
diff --git a/scripts/projectiles.shader b/scripts/projectiles.shader
new file mode 100644 (file)
index 0000000..28b1e94
--- /dev/null
@@ -0,0 +1,90 @@
+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
index 2ed0c9ad660eaadc683525ff8d4025d29e1bfc6b..c093eb3334808095149715e2413d7ad8ef68f542 100644 (file)
@@ -102,3 +102,11 @@ seeker
                rgbgen lightingDiffuse
        }
 }
+minelayer
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/minelayer.tga
+               rgbgen lightingDiffuse
+       }
+}
index 50352aaae846931ea54e9aa8c3f32e2b8ae4c884..a2f7c8ac96a93fecaf855d467dfa378c9e299301 100644 (file)
@@ -15,10 +15,9 @@ skill 100
 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
index 74b797ba147b9d558a4d2620c7d6853876d52ab2..d58d62b682c840b96c413092396724bb544662c4 100644 (file)
Binary files a/sound/announcer/default/03kills.ogg and b/sound/announcer/default/03kills.ogg differ
index 24602994332d9325ac7e52d669873fafd75bb138..c6e4a1c57c2f54df8ae28e19b8622a1b1df29d35 100644 (file)
Binary files a/sound/announcer/default/05kills.ogg and b/sound/announcer/default/05kills.ogg differ
index aeb209d2a6ca2d2cc4eafb3326e18d4bccaf6a60..0002a3b1e3ef51dfe70baca021a7fde6100f59c0 100644 (file)
Binary files a/sound/announcer/default/10kills.ogg and b/sound/announcer/default/10kills.ogg differ
index f0f44394461def9561a09afe770347b9f0bdf7c6..a3ed1b2d3b55a026c6fa627a708d41b79a7fe335 100644 (file)
Binary files a/sound/announcer/default/15kills.ogg and b/sound/announcer/default/15kills.ogg differ
index 14d667644af008425939434761c9a5f83cc85959..9e17e91f296efba5fbb0ac7c2883394bf5291bc8 100644 (file)
Binary files a/sound/announcer/default/1fragleft.ogg and b/sound/announcer/default/1fragleft.ogg differ
index 12d5f7c0acfa87daf6e43207066ec9ac3eb3b0d7..f21a1bd818e7ef17323c0028ae0dd44c673b6b08 100644 (file)
Binary files a/sound/announcer/default/1minuteremains.ogg and b/sound/announcer/default/1minuteremains.ogg differ
index 638ec676ed649b95360cc3f7975c6dbc46ff0094..5867d59252b687946925d610b134674909fd9ac5 100644 (file)
Binary files a/sound/announcer/default/20kills.ogg and b/sound/announcer/default/20kills.ogg differ
index 1b700977e26274d7a4a0abd42b2523e4e1b437d5..44d6d8b38ddd36079e894c45ec8ef048f9e4e9bd 100644 (file)
Binary files a/sound/announcer/default/25kills.ogg and b/sound/announcer/default/25kills.ogg differ
index e346570b021160dccca1305a59fbbe56b15a9df5..24ea3c39345acd4ecc2e869290e99bfb902995ee 100644 (file)
Binary files a/sound/announcer/default/2fragsleft.ogg and b/sound/announcer/default/2fragsleft.ogg differ
index 536d5ec5407ed6235632c1afab577aaf078e58c8..e6bb66ef20a3b92b397088a89ba8fd5e8edac8eb 100644 (file)
Binary files a/sound/announcer/default/30kills.ogg and b/sound/announcer/default/30kills.ogg differ
index 9ccceff060053a5275dc436d07fd477c8b07d69a..6a20bfdba208b928d693e77b89357c7131c43ad2 100644 (file)
Binary files a/sound/announcer/default/3fragsleft.ogg and b/sound/announcer/default/3fragsleft.ogg differ
index 1ec462bf3dbaa9a69948f930b1219a0dd4520502..c4572ab35bea9b4751309dbc5a952f648efef51d 100644 (file)
Binary files a/sound/announcer/default/5minutesremain.ogg and b/sound/announcer/default/5minutesremain.ogg differ
index a4e14ba5e8423c3a8fb28d1d71fffb44f0716eb1..39cf68d21c90f59596e65facd94945b9abad7ac3 100644 (file)
Binary files a/sound/announcer/default/airshot.ogg and b/sound/announcer/default/airshot.ogg differ
index 7ce6f3a9ec7ad2769c93319401a8ea70a794f0fe..d28a8ef620771a77dc9c00852245ca32a482ce90 100644 (file)
Binary files a/sound/announcer/default/amazing.ogg and b/sound/announcer/default/amazing.ogg differ
index 962a6bd3024203871919863f840b874db0b2f2bb..004e086e216db44ae4256a5d0ef3a6259993356c 100644 (file)
Binary files a/sound/announcer/default/awesome.ogg and b/sound/announcer/default/awesome.ogg differ
index 500fed8159b7b66656fc53b3ff7ed36ad3c1cf75..bea17ecb63dc5323cabae1f2b3aa736f65d5e507 100644 (file)
Binary files a/sound/announcer/default/blueteamtakeslead.ogg and b/sound/announcer/default/blueteamtakeslead.ogg differ
index 903fb85108944b31541be158ed45d3758380ad1f..133294d9fc2243fb0441a0c587c6273314cdaa55 100644 (file)
Binary files a/sound/announcer/default/headshot.ogg and b/sound/announcer/default/headshot.ogg differ
index 25d01c05651a3abc471d212ce75479435a7c96b4..942bf21567b1326be18976f53c154c31e90ef112 100644 (file)
Binary files a/sound/announcer/default/impressive.ogg and b/sound/announcer/default/impressive.ogg differ
index 81ac853f3475b06520d29187ae39154aa3598310..1ac573fcd9c94641a849a9efcf7a05e34e3f500c 100644 (file)
Binary files a/sound/announcer/default/redteamtakeslead.ogg and b/sound/announcer/default/redteamtakeslead.ogg differ
diff --git a/sound/keepaway/dropped.wav b/sound/keepaway/dropped.wav
new file mode 100644 (file)
index 0000000..6867468
Binary files /dev/null and b/sound/keepaway/dropped.wav differ
diff --git a/sound/keepaway/pickedup.wav b/sound/keepaway/pickedup.wav
new file mode 100644 (file)
index 0000000..55e55a4
Binary files /dev/null and b/sound/keepaway/pickedup.wav differ
diff --git a/sound/keepaway/respawn.wav b/sound/keepaway/respawn.wav
new file mode 100644 (file)
index 0000000..0be02d5
Binary files /dev/null and b/sound/keepaway/respawn.wav differ
diff --git a/sound/keepaway/touch.wav b/sound/keepaway/touch.wav
new file mode 100644 (file)
index 0000000..2ab908b
Binary files /dev/null and b/sound/keepaway/touch.wav differ
index ca16d218875a6228757cfe3b29153c22d0adef89..9aea70caf4bcc70bea3df59d5e145f9927f107a6 100644 (file)
Binary files a/sound/misc/armor25.wav and b/sound/misc/armor25.wav differ
diff --git a/sound/monsters/alien_chant_loop.ogg b/sound/monsters/alien_chant_loop.ogg
new file mode 100644 (file)
index 0000000..527411f
Binary files /dev/null and b/sound/monsters/alien_chant_loop.ogg differ
diff --git a/sound/monsters/giant_snoring_loop.ogg b/sound/monsters/giant_snoring_loop.ogg
new file mode 100644 (file)
index 0000000..aeb9c1c
Binary files /dev/null and b/sound/monsters/giant_snoring_loop.ogg differ
diff --git a/sound/monsters/growl1.wav b/sound/monsters/growl1.wav
new file mode 100644 (file)
index 0000000..bc0f256
Binary files /dev/null and b/sound/monsters/growl1.wav differ
diff --git a/sound/monsters/growl2.wav b/sound/monsters/growl2.wav
new file mode 100644 (file)
index 0000000..58842b8
Binary files /dev/null and b/sound/monsters/growl2.wav differ
diff --git a/sound/monsters/growl3.wav b/sound/monsters/growl3.wav
new file mode 100644 (file)
index 0000000..8b75efd
Binary files /dev/null and b/sound/monsters/growl3.wav differ
index 8d5a28c153849d619e54aa1e8cd08958e7911230..94514e5ac56aaaf138f453d3db5615c07893f7b2 100644 (file)
Binary files a/sound/player/slime.wav and b/sound/player/slime.wav differ
index b935160834e0a811efc4baf748792cf6b6b40bed..bb18f53f11617a23513ff6b86eacc7b2d9356010 100644 (file)
Binary files a/sound/weapons/crylink_fire.ogg and b/sound/weapons/crylink_fire.ogg differ
index 1f8b751151ea9bb0c592c75fc9a9cc87da9bac1b..f10d6dd0c2aa07835aaa0e5a47736fdb3733bb2d 100644 (file)
Binary files a/sound/weapons/crylink_fire2.ogg and b/sound/weapons/crylink_fire2.ogg differ
index 26b0358ed5219856e8a85639f46ef0eceffaef68..18b3e156d1763f81612ea77a1d72e47d5a95ca1d 100644 (file)
Binary files a/sound/weapons/electro_fire.ogg and b/sound/weapons/electro_fire.ogg differ
index f96966d34cb0398fa902d6d90c4197fd709147d0..a7192fa8994a5dc5667d61fe647ece8a9609d422 100644 (file)
Binary files a/sound/weapons/electro_fire2.ogg and b/sound/weapons/electro_fire2.ogg differ
index a6408b387d0658119604509709b766b9f00cb5df..41895ed983dcfb18db177ac634d108d528803238 100644 (file)
Binary files a/sound/weapons/grenade_fire.ogg and b/sound/weapons/grenade_fire.ogg differ
index 8cf78ea1e7eaec1802522a7d7b918d1740858c00..8175cd7aa3afbb1e780564489194593364fee3a1 100644 (file)
Binary files a/sound/weapons/grenade_impact.ogg and b/sound/weapons/grenade_impact.ogg differ
index 2068d4414b63b9c358bc3c5ee991ed1951db7733..fcb68c00ba3c5af7f5745884612ba99dfba8978e 100644 (file)
Binary files a/sound/weapons/hagar_fire.ogg and b/sound/weapons/hagar_fire.ogg differ
index 664c4440a4426d481abc1de7a4301ce2c3675ca5..f7b872e6ea09ebce06ced24316dbae22611a31e5 100644 (file)
Binary files a/sound/weapons/hagexp1.ogg and b/sound/weapons/hagexp1.ogg differ
index b58b3f12cf800fa11e02aded12235f1e146c4156..d0f6e83973d2ee6706d71b5d2b5a7f18f149715d 100644 (file)
Binary files a/sound/weapons/hagexp2.ogg and b/sound/weapons/hagexp2.ogg differ
index 27192c1776d63e5e572e0a19975a1884a310b955..f2fcbb5fd4d4b3c75c2d14e977d4de2048aed646 100644 (file)
Binary files a/sound/weapons/hagexp3.ogg and b/sound/weapons/hagexp3.ogg differ
index 09232de00dca121d8fd735b89e94750fff4b223b..d08710985743ab7de72c67b14c8d58870001c3d1 100644 (file)
Binary files a/sound/weapons/minstanexfire.ogg and b/sound/weapons/minstanexfire.ogg differ
diff --git a/sound/weapons/nexcharge.ogg b/sound/weapons/nexcharge.ogg
new file mode 100644 (file)
index 0000000..6fa152d
Binary files /dev/null and b/sound/weapons/nexcharge.ogg differ
index dc893698154d11f53fe558f722bb8df5ec51967c..5d28b731cee1f6e8d305958728617bb4c84c7f4b 100644 (file)
Binary files a/sound/weapons/nexfire.ogg and b/sound/weapons/nexfire.ogg differ
index 55e4f7610dc7c5549f2c497d3998c738ec8242d4..36f1183daa35e003b8a7d6f774e7cded07e3ae6b 100644 (file)
Binary files a/sound/weapons/nexwhoosh1.ogg and b/sound/weapons/nexwhoosh1.ogg differ
index 6fcaaeaeaeaa0d3338797663d8530d3057a129b0..38ffa22f33090b94b8bb2f3ef3259cd5daa47763 100644 (file)
Binary files a/sound/weapons/nexwhoosh2.ogg and b/sound/weapons/nexwhoosh2.ogg differ
index 4f3eb6cf8d7577a5d43e4218ad1baf2c16a020e9..3db8d4b44605818b3c42508a88bf153e672ca335 100644 (file)
Binary files a/sound/weapons/nexwhoosh3.ogg and b/sound/weapons/nexwhoosh3.ogg differ
index 1d600459fcc1acc532db5b44543c6be012571a3d..56b114e65d37e1900f4380f1cb5b26ecc909c8ab 100644 (file)
Binary files a/sound/weapons/rocket_impact.ogg and b/sound/weapons/rocket_impact.ogg differ
index 81908df8a566cd555d407225b2f0c9e3eeddd95d..8d4f607c742a2b17970129c9d072125bf545f5f1 100644 (file)
Binary files a/sound/weapons/shotgun_fire.ogg and b/sound/weapons/shotgun_fire.ogg differ
index be1159d4fdc344146f10036da22e5558dbd65c9d..8d27e4fde32969d3fce75917edffda68e852f38e 100644 (file)
Binary files a/sound/weapons/strength_fire.ogg and b/sound/weapons/strength_fire.ogg differ
index 6ed281ddb8c5406b4c3c06f3ff2d3875314b1624..24c73a4c05affd2ba71965e79720549b92adeef4 100644 (file)
Binary files a/sound/weapons/uzi_fire.ogg and b/sound/weapons/uzi_fire.ogg differ
diff --git a/textures/erebusfullbright.tga b/textures/erebusfullbright.tga
new file mode 100644 (file)
index 0000000..5a470f6
Binary files /dev/null and b/textures/erebusfullbright.tga differ
diff --git a/textures/erebusfullbright_gloss.tga b/textures/erebusfullbright_gloss.tga
new file mode 100644 (file)
index 0000000..992af75
Binary files /dev/null and b/textures/erebusfullbright_gloss.tga differ
diff --git a/textures/erebusfullbright_glow.tga b/textures/erebusfullbright_glow.tga
new file mode 100644 (file)
index 0000000..a91959d
Binary files /dev/null and b/textures/erebusfullbright_glow.tga differ
diff --git a/textures/erebusfullbright_norm.tga b/textures/erebusfullbright_norm.tga
new file mode 100644 (file)
index 0000000..007228b
Binary files /dev/null and b/textures/erebusfullbright_norm.tga differ
diff --git a/textures/erebusfullbright_shirt.tga b/textures/erebusfullbright_shirt.tga
new file mode 100644 (file)
index 0000000..364bae2
Binary files /dev/null and b/textures/erebusfullbright_shirt.tga differ
diff --git a/textures/flags/flag_blue.tga b/textures/flags/flag_blue.tga
deleted file mode 100644 (file)
index e84fca5..0000000
Binary files a/textures/flags/flag_blue.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_cloth.tga b/textures/flags/flag_blue_cloth.tga
deleted file mode 100644 (file)
index a8ea97f..0000000
Binary files a/textures/flags/flag_blue_cloth.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_gloss.tga b/textures/flags/flag_blue_gloss.tga
deleted file mode 100644 (file)
index 77176c0..0000000
Binary files a/textures/flags/flag_blue_gloss.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_glow.tga b/textures/flags/flag_blue_glow.tga
deleted file mode 100644 (file)
index 88d58c0..0000000
Binary files a/textures/flags/flag_blue_glow.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_laser.tga b/textures/flags/flag_blue_laser.tga
deleted file mode 100644 (file)
index 6901f4f..0000000
Binary files a/textures/flags/flag_blue_laser.tga and /dev/null differ
diff --git a/textures/flags/flag_blue_norm.tga b/textures/flags/flag_blue_norm.tga
deleted file mode 100644 (file)
index fc26022..0000000
Binary files a/textures/flags/flag_blue_norm.tga and /dev/null differ
diff --git a/textures/flags/flag_red.tga b/textures/flags/flag_red.tga
deleted file mode 100644 (file)
index d659d8c..0000000
Binary files a/textures/flags/flag_red.tga and /dev/null differ
diff --git a/textures/flags/flag_red_cloth.tga b/textures/flags/flag_red_cloth.tga
deleted file mode 100644 (file)
index ae451c9..0000000
Binary files a/textures/flags/flag_red_cloth.tga and /dev/null differ
diff --git a/textures/flags/flag_red_gloss.tga b/textures/flags/flag_red_gloss.tga
deleted file mode 100644 (file)
index a499830..0000000
Binary files a/textures/flags/flag_red_gloss.tga and /dev/null differ
diff --git a/textures/flags/flag_red_glow.tga b/textures/flags/flag_red_glow.tga
deleted file mode 100644 (file)
index deae22e..0000000
Binary files a/textures/flags/flag_red_glow.tga and /dev/null differ
diff --git a/textures/flags/flag_red_laser.tga b/textures/flags/flag_red_laser.tga
deleted file mode 100644 (file)
index f4d4de5..0000000
Binary files a/textures/flags/flag_red_laser.tga and /dev/null differ
diff --git a/textures/flags/flag_red_norm.tga b/textures/flags/flag_red_norm.tga
deleted file mode 100644 (file)
index 97480bb..0000000
Binary files a/textures/flags/flag_red_norm.tga and /dev/null differ
diff --git a/textures/hlac_glass.tga b/textures/hlac_glass.tga
new file mode 100644 (file)
index 0000000..e0ed0a7
Binary files /dev/null and b/textures/hlac_glass.tga differ
diff --git a/textures/hlac_plasma.tga b/textures/hlac_plasma.tga
new file mode 100644 (file)
index 0000000..5603b16
Binary files /dev/null and b/textures/hlac_plasma.tga differ
diff --git a/textures/mine.tga b/textures/mine.tga
new file mode 100644 (file)
index 0000000..f50282b
Binary files /dev/null and b/textures/mine.tga differ
diff --git a/textures/mine_gloss.tga b/textures/mine_gloss.tga
new file mode 100644 (file)
index 0000000..2e084c3
Binary files /dev/null and b/textures/mine_gloss.tga differ
diff --git a/textures/mine_glow.tga b/textures/mine_glow.tga
new file mode 100644 (file)
index 0000000..0fc35f9
Binary files /dev/null and b/textures/mine_glow.tga differ
diff --git a/textures/minelayer.tga b/textures/minelayer.tga
new file mode 100644 (file)
index 0000000..e0fa48c
Binary files /dev/null and b/textures/minelayer.tga differ
diff --git a/textures/minelayer_gloss.tga b/textures/minelayer_gloss.tga
new file mode 100644 (file)
index 0000000..2ca8b9a
Binary files /dev/null and b/textures/minelayer_gloss.tga differ
diff --git a/textures/minelayer_glow.tga b/textures/minelayer_glow.tga
new file mode 100644 (file)
index 0000000..163735f
Binary files /dev/null and b/textures/minelayer_glow.tga differ
index 240695f03c7f0b2aede35eb56e8c5cca54d2a6c4..09fb1b224ace0529a9b159baa63341aabdd7a8d8 100644 (file)
Binary files a/textures/nexgun.tga and b/textures/nexgun.tga differ
index c58c009cb814567d8fa656342392b0d4ccea1ba9..e3befff7394c3ff2026092e11f8ff01f3647572e 100644 (file)
Binary files a/textures/nexgun_glow.tga and b/textures/nexgun_glow.tga differ
diff --git a/textures/projectiles/crylink_projectile_core.tga b/textures/projectiles/crylink_projectile_core.tga
new file mode 100644 (file)
index 0000000..a9f686b
Binary files /dev/null and b/textures/projectiles/crylink_projectile_core.tga differ
diff --git a/textures/projectiles/crylink_projectile_core_glow.tga b/textures/projectiles/crylink_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..b53993b
Binary files /dev/null and b/textures/projectiles/crylink_projectile_core_glow.tga differ
diff --git a/textures/projectiles/crylink_projectile_long.tga b/textures/projectiles/crylink_projectile_long.tga
new file mode 100644 (file)
index 0000000..6f78dd0
Binary files /dev/null and b/textures/projectiles/crylink_projectile_long.tga differ
diff --git a/textures/projectiles/crylink_projectile_long_glow.tga b/textures/projectiles/crylink_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..6f78dd0
Binary files /dev/null and b/textures/projectiles/crylink_projectile_long_glow.tga differ
diff --git a/textures/projectiles/electro_projectile_core.tga b/textures/projectiles/electro_projectile_core.tga
new file mode 100644 (file)
index 0000000..b9a1930
Binary files /dev/null and b/textures/projectiles/electro_projectile_core.tga differ
diff --git a/textures/projectiles/electro_projectile_core_glow.tga b/textures/projectiles/electro_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..b9a1930
Binary files /dev/null and b/textures/projectiles/electro_projectile_core_glow.tga differ
diff --git a/textures/projectiles/electro_projectile_long.tga b/textures/projectiles/electro_projectile_long.tga
new file mode 100644 (file)
index 0000000..4672763
Binary files /dev/null and b/textures/projectiles/electro_projectile_long.tga differ
diff --git a/textures/projectiles/electro_projectile_long_glow.tga b/textures/projectiles/electro_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..4672763
Binary files /dev/null and b/textures/projectiles/electro_projectile_long_glow.tga differ
diff --git a/textures/projectiles/hlac_projectile_core.tga b/textures/projectiles/hlac_projectile_core.tga
new file mode 100644 (file)
index 0000000..f5a49e1
Binary files /dev/null and b/textures/projectiles/hlac_projectile_core.tga differ
diff --git a/textures/projectiles/hlac_projectile_core_glow.tga b/textures/projectiles/hlac_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..f5a49e1
Binary files /dev/null and b/textures/projectiles/hlac_projectile_core_glow.tga differ
diff --git a/textures/projectiles/hlac_projectile_long.tga b/textures/projectiles/hlac_projectile_long.tga
new file mode 100644 (file)
index 0000000..a7e68da
Binary files /dev/null and b/textures/projectiles/hlac_projectile_long.tga differ
diff --git a/textures/projectiles/hlac_projectile_long_glow.tga b/textures/projectiles/hlac_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..a7e68da
Binary files /dev/null and b/textures/projectiles/hlac_projectile_long_glow.tga differ
diff --git a/textures/projectiles/laser_projectile_core.tga b/textures/projectiles/laser_projectile_core.tga
new file mode 100644 (file)
index 0000000..1fdec98
Binary files /dev/null and b/textures/projectiles/laser_projectile_core.tga differ
diff --git a/textures/projectiles/laser_projectile_core_glow.tga b/textures/projectiles/laser_projectile_core_glow.tga
new file mode 100644 (file)
index 0000000..1fdec98
Binary files /dev/null and b/textures/projectiles/laser_projectile_core_glow.tga differ
diff --git a/textures/projectiles/laser_projectile_long.tga b/textures/projectiles/laser_projectile_long.tga
new file mode 100644 (file)
index 0000000..361342d
Binary files /dev/null and b/textures/projectiles/laser_projectile_long.tga differ
diff --git a/textures/projectiles/laser_projectile_long_glow.tga b/textures/projectiles/laser_projectile_long_glow.tga
new file mode 100644 (file)
index 0000000..361342d
Binary files /dev/null and b/textures/projectiles/laser_projectile_long_glow.tga differ
index 10ef35f1f899c4fa107b81970df29a6aa70145e7..a0443b70352e8a8477e5570f332925589c782127 100644 (file)
@@ -38,7 +38,6 @@
 \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.
diff --git a/tooltips.db.de b/tooltips.db.de
new file mode 100644 (file)
index 0000000..dbefdef
--- /dev/null
@@ -0,0 +1,221 @@
+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
diff --git a/tooltips.db.fr b/tooltips.db.fr
new file mode 100644 (file)
index 0000000..cf672c3
--- /dev/null
@@ -0,0 +1,221 @@
+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
diff --git a/tooltips.db.ru b/tooltips.db.ru
new file mode 100644 (file)
index 0000000..c5ba916
--- /dev/null
@@ -0,0 +1,221 @@
+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: размывать перекрестье, когда не наведено на стену; Враги: также увеличивать перекрестье, когда наведено на врага
index 101defc6162b63aeb29e6a0e73586c5c1552edeb..876862b1c50a49684ef2afcc5d49212e00d4a2e9 100644 (file)
@@ -51,8 +51,8 @@ exec unit_walker.cfg
 // 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"
index 0bd63e9fb2ad9d57e61582ddf0d691cff8a5f831..b7c87a34a63ff22494dbecbb418dc9fd25cd7d74 100755 (executable)
@@ -14,6 +14,7 @@ for b in balance*.cfg; do
                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
index 368b64b42051a078fce4369497616de234b67eee..4cb860e19c7ab06c46ea43986e14836f97427eaa 100644 (file)
@@ -1,7 +1,7 @@
 **Core Team
 
 Rudolf "divVerent" Polzer
--z-
+Tyler "-z-" Mulligan
 Merlijn Hofstra
 morphed
 mand1nga
@@ -14,14 +14,19 @@ tZork
 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
@@ -37,7 +42,7 @@ FruitieX
 tZork
 
 *Marketing / PR
--z-
+Tyler "-z-" Mulligan
 mand1nga
 
 *Legal
@@ -48,14 +53,40 @@ Merlijn Hofstra
 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
 
@@ -104,7 +135,6 @@ MauveBib
 Mephisto
 michaelb
 Michael "Tenshihan" Quinn
-MirceaKitsune
 Munyul
 Netzwerg
 NoelCower
@@ -117,8 +147,6 @@ Rick "Rat" Kelley
 Robert "ai" Kuroto
 Ronan
 Sajt
-Samual Lenks
-Severin "sev" Meyer
 Shaggy
 Shank
 Simon O'Callaghan
diff --git a/xonotic-credits.txt.fr b/xonotic-credits.txt.fr
new file mode 100644 (file)
index 0000000..2c53d6a
--- /dev/null
@@ -0,0 +1,167 @@
+**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