]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'divVerent/ru'
authorRudolf Polzer <divverent@xonotic.org>
Tue, 6 Mar 2012 16:16:37 +0000 (17:16 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Tue, 6 Mar 2012 16:16:37 +0000 (17:16 +0100)
166 files changed:
balanceXonotic.cfg
csprogs.dat.it.po
defaultXonotic.cfg
effects-high.cfg
effects-low.cfg
effects-med.cfg
effects-normal.cfg
effects-omg.cfg
effects-ultimate.cfg
effects-ultra.cfg
gfx/hud/default/weapon_hlacmod_renameit.tga [deleted file]
gfx/hud/luminos/weapon_hlacmod_renameit.tga [deleted file]
gfx/hud/old/weapon_hlacmod_renameit.tga [deleted file]
gfx/menu/luminos/icon_mod_NewToys.tga [new file with mode: 0644]
gfx/menu/wickedx/icon_mod_NewToys.tga [new file with mode: 0644]
gfx/menu/xaw/icon_mod_NewToys.tga [new file with mode: 0644]
keybinds.txt
keybinds.txt.de
keybinds.txt.es
keybinds.txt.fr
keybinds.txt.hu
keybinds.txt.it
keybinds.txt.ru
keybinds.txt.uk
languages.txt
menu.dat.fi.po
menu.dat.it.po
models/ok_player/okmale1.dpm [new file with mode: 0644]
models/ok_player/okmale1.dpm.framegroups [new file with mode: 0644]
models/ok_player/okmale1.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okmale1.dpm_0.txt [new file with mode: 0644]
models/ok_player/okmale2.dpm [new file with mode: 0644]
models/ok_player/okmale2.dpm.framegroups [new file with mode: 0644]
models/ok_player/okmale2.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okmale2.dpm_0.txt [new file with mode: 0644]
models/ok_player/okmale3.dpm [new file with mode: 0644]
models/ok_player/okmale3.dpm.framegroups [new file with mode: 0644]
models/ok_player/okmale3.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okmale3.dpm_0.txt [new file with mode: 0644]
models/ok_player/okmale4.dpm [new file with mode: 0644]
models/ok_player/okmale4.dpm.framegroups [new file with mode: 0644]
models/ok_player/okmale4.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okmale4.dpm_0.txt [new file with mode: 0644]
models/ok_player/okplayer.tga [new file with mode: 0644]
models/ok_player/okplayer_gloss.tga [new file with mode: 0644]
models/ok_player/okplayer_glow.tga [new file with mode: 0644]
models/ok_player/okplayer_reflect.tga [new file with mode: 0644]
models/ok_player/okplayer_shirt.tga [new file with mode: 0644]
models/ok_player/okrobot1.dpm [new file with mode: 0644]
models/ok_player/okrobot1.dpm.framegroups [new file with mode: 0644]
models/ok_player/okrobot1.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okrobot1.dpm_0.txt [new file with mode: 0644]
models/ok_player/okrobot2.dpm [new file with mode: 0644]
models/ok_player/okrobot2.dpm.framegroups [new file with mode: 0644]
models/ok_player/okrobot2.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okrobot2.dpm_0.txt [new file with mode: 0644]
models/ok_player/okrobot3.dpm [new file with mode: 0644]
models/ok_player/okrobot3.dpm.framegroups [new file with mode: 0644]
models/ok_player/okrobot3.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okrobot3.dpm_0.txt [new file with mode: 0644]
models/ok_player/okrobot4.dpm [new file with mode: 0644]
models/ok_player/okrobot4.dpm.framegroups [new file with mode: 0644]
models/ok_player/okrobot4.dpm_0.sounds [new file with mode: 0644]
models/ok_player/okrobot4.dpm_0.txt [new file with mode: 0644]
models/vehicles/spiderbot.dpm.framegroups
models/weapons/g_ok_hmg.md3 [new file with mode: 0644]
models/weapons/g_ok_mg.md3 [new file with mode: 0644]
models/weapons/g_ok_rl.md3 [new file with mode: 0644]
models/weapons/g_ok_shotgun.md3 [new file with mode: 0644]
models/weapons/g_ok_sniper.md3 [new file with mode: 0644]
models/weapons/h_minstanex.iqm
models/weapons/h_minstanex.iqm.framegroups
models/weapons/h_ok_grenade.iqm [new file with mode: 0644]
models/weapons/h_ok_grenade.iqm.framegroups [new file with mode: 0644]
models/weapons/h_ok_hmg.iqm [new file with mode: 0644]
models/weapons/h_ok_hmg.iqm.framegroups [new file with mode: 0644]
models/weapons/h_ok_mg.iqm [new file with mode: 0644]
models/weapons/h_ok_mg.iqm.framegroups [new file with mode: 0644]
models/weapons/h_ok_rl.iqm [new file with mode: 0644]
models/weapons/h_ok_rl.iqm.framegroups [new file with mode: 0644]
models/weapons/h_ok_shotgun.iqm [new file with mode: 0644]
models/weapons/h_ok_shotgun.iqm.framegroups [new file with mode: 0644]
models/weapons/h_ok_sniper.iqm [new file with mode: 0644]
models/weapons/h_ok_sniper.iqm.framegroups [new file with mode: 0644]
models/weapons/ok_rocket.md3 [new file with mode: 0644]
models/weapons/okrocketthrust.tga [new file with mode: 0644]
models/weapons/okrocketthrust_glow.tga [new file with mode: 0644]
models/weapons/okweapons.tga [new file with mode: 0644]
models/weapons/okweapons_gloss.tga [new file with mode: 0644]
models/weapons/okweapons_glow.tga [new file with mode: 0644]
models/weapons/okweapons_reflect.tga [new file with mode: 0644]
models/weapons/okweapons_shirt.tga [new file with mode: 0644]
models/weapons/overkillbullet.tga [new file with mode: 0644]
models/weapons/overkillbullet_gloss.tga [new file with mode: 0644]
models/weapons/overkillbullet_reflect.tga [new file with mode: 0644]
models/weapons/v_ok_grenade.md3 [new file with mode: 0644]
models/weapons/v_ok_hmg.md3 [new file with mode: 0644]
models/weapons/v_ok_mg.md3 [new file with mode: 0644]
models/weapons/v_ok_rl.md3 [new file with mode: 0644]
models/weapons/v_ok_shotgun.md3 [new file with mode: 0644]
models/weapons/v_ok_sniper.md3 [new file with mode: 0644]
qcsrc/client/autocvars.qh
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/damage.qc
qcsrc/client/scoreboard.qc
qcsrc/client/wall.qc
qcsrc/common/util.qc
qcsrc/menu/skin-customizables.inc
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/mainwindow.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/server/attic/nexball.qc [new file with mode: 0644]
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/command/vote.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/gamemode_nexball.qc [new file with mode: 0644]
qcsrc/server/mutators/gamemode_nexball.qh [new file with mode: 0644]
qcsrc/server/mutators/mutators.qh
qcsrc/server/nexball.qc [deleted file]
qcsrc/server/progs.src
qcsrc/server/teamplay.qc
qcsrc/server/w_minstanex.qc
qcsrc/warpzonelib/server.qc
scripts/ok_player.shader [new file with mode: 0644]
scripts/okweapons.shader [new file with mode: 0644]
scripts/weapons.shader
sound/overkill/grenadebip.ogg [new file with mode: 0644]
sound/player/robot/coms/attack.ogg [new file with mode: 0644]
sound/player/robot/coms/attackinfive.ogg [new file with mode: 0644]
sound/player/robot/coms/coverme.ogg [new file with mode: 0644]
sound/player/robot/coms/defend.ogg [new file with mode: 0644]
sound/player/robot/coms/freelance1.ogg [new file with mode: 0644]
sound/player/robot/coms/freelance2.ogg [new file with mode: 0644]
sound/player/robot/coms/incoming.ogg [new file with mode: 0644]
sound/player/robot/coms/meet.ogg [new file with mode: 0644]
sound/player/robot/coms/needhelp1.ogg [new file with mode: 0644]
sound/player/robot/coms/needhelp2.ogg [new file with mode: 0644]
sound/player/robot/coms/seenflag.ogg [new file with mode: 0644]
sound/player/robot/coms/taunt1.ogg [new file with mode: 0644]
sound/player/robot/coms/taunt2.ogg [new file with mode: 0644]
sound/player/robot/coms/taunt3.ogg [new file with mode: 0644]
sound/player/robot/coms/teamshoot1.ogg [new file with mode: 0644]
sound/player/robot/coms/teamshoot2.ogg [new file with mode: 0644]
sound/player/robot/coms/teamshoot3.ogg [new file with mode: 0644]
sound/player/robot/player/death1.ogg [new file with mode: 0644]
sound/player/robot/player/death2.ogg [new file with mode: 0644]
sound/player/robot/player/death3.ogg [new file with mode: 0644]
sound/player/robot/player/drown.ogg [new file with mode: 0644]
sound/player/robot/player/fall.ogg [new file with mode: 0644]
sound/player/robot/player/falling.ogg [new file with mode: 0644]
sound/player/robot/player/gasp.ogg [new file with mode: 0644]
sound/player/robot/player/jump.ogg [new file with mode: 0644]
sound/player/robot/player/pain100.ogg [new file with mode: 0644]
sound/player/robot/player/pain25.ogg [new file with mode: 0644]
sound/player/robot/player/pain50.ogg [new file with mode: 0644]
sound/player/robot/player/pain75.ogg [new file with mode: 0644]
tooltips.db.it
xonotic-credits.txt.fr
xonotic-credits.txt.hu
xonotic-credits.txt.it
xonotic-credits.txt.uk

index 1de9342ff937f812504a4731550357efdec59fa0..193c7ed2cc6beb915cb2a0aed4bb650ff4f0a1ba 100644 (file)
@@ -579,7 +579,7 @@ set g_balance_hagar_secondary_load_spread_bias 0.5
 set g_balance_hagar_secondary_load_max 4
 set g_balance_hagar_secondary_load_hold 4
 set g_balance_hagar_secondary_load_releasedeath 0
-set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_load_abort 0
 set g_balance_hagar_secondary_load_linkexplode 0
 set g_balance_hagar_secondary_load_animtime 0.2
 set g_balance_hagar_secondary_damage 40
index acc80da4dbe97e972278140238488b3c13720477..42d7f0e48a1cb1207346dd41681330a690828e75 100644 (file)
@@ -6,10 +6,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: 0.1preview\n"
+"Project-Id-Version: 0.6\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2012-01-26 12:24+0100\n"
-"PO-Revision-Date: 2011-09-04 01:40+0100\n"
+"PO-Revision-Date: 2011-02-26 20:40+0100\n"
 "Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
 "Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
 "Language: it\n"
@@ -83,7 +83,7 @@ msgstr "%s (%s)"
 
 #: qcsrc/client/announcer.qc:31
 msgid "^1Begin!"
-msgstr "^1Inizia!"
+msgstr "^1Via!"
 
 #: qcsrc/client/announcer.qc:41
 #, c-format
@@ -1049,23 +1049,23 @@ msgstr "tempo pp"
 
 #: qcsrc/client/scoreboard.qc:21
 msgid "SCO^caps"
-msgstr "SCO^catture"
+msgstr "catture"
 
 #: qcsrc/client/scoreboard.qc:22
 msgid "SCO^deaths"
-msgstr "SCO^morti"
+msgstr "morti"
 
 #: qcsrc/client/scoreboard.qc:23
 msgid "SCO^destroyed"
-msgstr "SCO^distrutte"
+msgstr "distrutte"
 
 #: qcsrc/client/scoreboard.qc:24
 msgid "SCO^drops"
-msgstr "SCO^cadute"
+msgstr "cadute"
 
 #: qcsrc/client/scoreboard.qc:25
 msgid "SCO^faults"
-msgstr "SCO^falli"
+msgstr "falli"
 
 #: qcsrc/client/scoreboard.qc:26
 msgid "SCO^fckills"
@@ -1073,7 +1073,7 @@ msgstr "uccisioni pb"
 
 #: qcsrc/client/scoreboard.qc:27
 msgid "SCO^goals"
-msgstr "SCO^gol"
+msgstr "gol"
 
 #: qcsrc/client/scoreboard.qc:28
 msgid "SCO^kckills"
@@ -1097,27 +1097,27 @@ msgstr "rum"
 
 #: qcsrc/client/scoreboard.qc:33
 msgid "SCO^kills"
-msgstr "SCO^uccisioni"
+msgstr "uccisioni"
 
 #: qcsrc/client/scoreboard.qc:34
 msgid "SCO^laps"
-msgstr "SCO^giri"
+msgstr "giri"
 
 #: qcsrc/client/scoreboard.qc:35
 msgid "SCO^lives"
-msgstr "SCO^vite"
+msgstr "vite"
 
 #: qcsrc/client/scoreboard.qc:36
 msgid "SCO^losses"
-msgstr "SCO^perdute"
+msgstr "perdute"
 
 #: qcsrc/client/scoreboard.qc:37
 msgid "SCO^name"
-msgstr "SCO^nome"
+msgstr "nome"
 
 #: qcsrc/client/scoreboard.qc:38
 msgid "SCO^nick"
-msgstr "SCO^nick"
+msgstr "nick"
 
 #: qcsrc/client/scoreboard.qc:39
 msgid "SCO^objectives"
@@ -1125,27 +1125,27 @@ msgstr "obiettivi"
 
 #: qcsrc/client/scoreboard.qc:40
 msgid "SCO^pickups"
-msgstr "SCO^raccolte"
+msgstr "raccolte"
 
 #: qcsrc/client/scoreboard.qc:41
 msgid "SCO^ping"
-msgstr "SCO^ping"
+msgstr "ping"
 
 #: qcsrc/client/scoreboard.qc:42
 msgid "SCO^pl"
-msgstr "SCO^pl"
+msgstr "pl"
 
 #: qcsrc/client/scoreboard.qc:43
 msgid "SCO^pushes"
-msgstr "SCO^spinte"
+msgstr "spinte"
 
 #: qcsrc/client/scoreboard.qc:44
 msgid "SCO^rank"
-msgstr "SCO^posizione"
+msgstr "posizione"
 
 #: qcsrc/client/scoreboard.qc:45
 msgid "SCO^returns"
-msgstr "SCO^ritorni"
+msgstr "ritorni"
 
 #: qcsrc/client/scoreboard.qc:46
 msgid "SCO^revivals"
@@ -1153,19 +1153,19 @@ msgstr "ravvivamenti"
 
 #: qcsrc/client/scoreboard.qc:47
 msgid "SCO^score"
-msgstr "SCO^punti"
+msgstr "punti"
 
 #: qcsrc/client/scoreboard.qc:48
 msgid "SCO^suicides"
-msgstr "SCO^suicidi"
+msgstr "suicidi"
 
 #: qcsrc/client/scoreboard.qc:49
 msgid "SCO^takes"
-msgstr "SCO^presi"
+msgstr "presi"
 
 #: qcsrc/client/scoreboard.qc:50
 msgid "SCO^ticks"
-msgstr "SCO^tick"
+msgstr "tick"
 
 #: qcsrc/client/scoreboard.qc:239
 msgid ""
@@ -1392,7 +1392,7 @@ msgstr "riparato campo mancante '%s'\n"
 
 #: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
 msgid "N/A"
-msgstr "N/D"
+msgstr "N.D."
 
 #: qcsrc/client/scoreboard.qc:950
 #, c-format
@@ -1456,12 +1456,12 @@ msgstr " fino a ^3%s %s^7"
 #: qcsrc/client/scoreboard.qc:1331 qcsrc/client/scoreboard.qc:1338
 #: qcsrc/client/scoreboard.qc:1350 qcsrc/client/scoreboard.qc:1357
 msgid "SCO^points"
-msgstr "SCO^punti"
+msgstr "punti"
 
 #: qcsrc/client/scoreboard.qc:1332 qcsrc/client/scoreboard.qc:1339
 #: qcsrc/client/scoreboard.qc:1351 qcsrc/client/scoreboard.qc:1358
 msgid "SCO^is beaten"
-msgstr "SCO^è battuto"
+msgstr "è battuto"
 
 #: qcsrc/client/scoreboard.qc:1349 qcsrc/client/scoreboard.qc:1356
 #, c-format
@@ -1524,7 +1524,7 @@ msgstr "Portatore bandiera"
 
 #: qcsrc/client/waypointsprites.qc:260
 msgid "Dropped flag"
-msgstr "Bandiera rilasciata"
+msgstr "Bandiera persa"
 
 #: qcsrc/client/waypointsprites.qc:261
 msgid "Help me!"
@@ -2022,7 +2022,7 @@ msgstr "%s è stato colpito in testa con un rifle da %s"
 #: qcsrc/server/w_rifle.qc:255
 #, c-format
 msgid "%s was sniped with a rifle by %s"
-msgstr "%s è stato fucilato con un rifle da %s"
+msgstr "%s è stato cecchinato con un rifle da %s"
 
 #: qcsrc/server/w_rocketlauncher.qc:466
 #, c-format
@@ -2101,7 +2101,7 @@ msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Fisarmonica"
 #: qcsrc/server/w_uzi.qc:322
 #, c-format
 msgid "%s was sniped by %s's machine gun"
-msgstr "%s è stato fucilato dalla machine gun di %s"
+msgstr "%s è stato cecchinato dalla machine gun di %s"
 
 #: qcsrc/server/w_uzi.qc:324
 #, c-format
index 761ccf075851fbd8b6b4c2c8155af825460c407c..2c17e78a57b761b0886eec1bab209e1168949325 100644 (file)
@@ -475,6 +475,13 @@ seta g_keyhunt_point_leadlimit -1  "Keyhunt point lead limit overriding the mapin
 seta g_race_laps_limit -1      "Race laps limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_nexball_goallimit -1 "Nexball goal limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 seta g_nexball_goalleadlimit -1 "Nexball goal lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
+seta g_nexball_safepass_maxdist 5000    // Max distance to allow save fassping (0 to turn off safe passing)
+seta g_nexball_safepass_turnrate 0.1    // How fast the safe-pass ball can habge direction
+seta g_nexball_safepass_holdtime 0.75   // How long to remeber last teammate you pointed at
+seta g_nexball_viewmodel_scale 0.25     // How large the ball for the carrier
+seta g_nexball_viewmodel_offset "8 8 0" // Where the ball is located on carrier "forward right up"
+seta g_nexball_tackling 1               // Allow ball theft?
+
 
 seta g_ctf_ignore_frags 0      "1: regular frags give no points"
 
@@ -514,6 +521,9 @@ 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_ka_respawn_delay 0
+set g_ka_respawn_waves 0
+set g_ka_weapon_stay 0
 set g_kh_respawn_delay 0
 set g_kh_respawn_waves 0
 set g_kh_weapon_stay 0
@@ -525,9 +535,9 @@ 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_nb_respawn_delay 0
+set g_nb_respawn_waves 0
+set g_nb_weapon_stay 0
 set g_as_respawn_delay 0
 set g_as_respawn_waves 0
 set g_as_weapon_stay 0
@@ -542,12 +552,9 @@ 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 2
-set g_freezetag_respawn_waves 0
-set g_freezetag_respawn_delay 0
-set g_freezetag_weapon_stay 0
-set g_keepaway_respawn_delay 0
-set g_keepaway_respawn_waves 0
-set g_keepaway_weapon_stay 0
+set g_ft_respawn_waves 0
+set g_ft_respawn_delay 0
+set g_ft_weapon_stay 0
 
 // overtime
 seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
@@ -1562,9 +1569,10 @@ set menu_updatecheck 1
 set bot_navigation_ignoreplayers 0 // FIXME remove this once the issue is solved
 set bot_sound_monopoly 0 "when enabled, only bots can make any noise"
 
-set sv_loddistance1 1024
-set sv_loddistance2 4096
-seta cl_playerdetailreduction 0        "the higher, the less detailed player models are displayed (LOD)"
+set cl_loddistance1 1024
+set cl_loddistance2 3072
+seta cl_playerdetailreduction 1        "the higher, the less detailed player models are displayed (LOD)"
+seta cl_modeldetailreduction 1 "the higher, the less detailed certain map models are displayed (LOD)"
 
 set g_mapinfo_settemp_acl "+*" "ACL for mapinfo setting cvars"
 
index 65ef997b26aa34996369b095825ef37e9f429194..0c095482661bad962ccf801db08d056cf65d3aa6 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 0
 cl_decals_time 4
 cl_particles_quality 1
 cl_damageeffect 1
+cl_playerdetailreduction 0.5
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
index 4b0cf628198fbb80add620134d97be16a9ff41af..1569bc3df01fc5ec1d0622a85ba40136de0e9b4c 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 0.4
 cl_damageeffect 0
+cl_playerdetailreduction 2
 gl_flashblend 1
 gl_picmip 1
 mod_q3bsp_nolightmaps 1
index e4882b8c00f68701d8e0ecb4c03cb81206c27b31..0d006a9979d12a37dda32ce60ac063fd889db006 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 1
 cl_damageeffect 0
+cl_playerdetailreduction 1
 gl_flashblend 0
 gl_picmip 0
 mod_q3bsp_nolightmaps 0
index 64543bcc42d45bd6d75c222b344c4f2c7bfc799c..f421a10ec0f6214f5c93cf10ced721b268695cd1 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 1
 cl_damageeffect 1
+cl_playerdetailreduction 1
 gl_flashblend 0
 gl_picmip 0
 mod_q3bsp_nolightmaps 0
index 902266ca4830d505a8575d992076adb3d6b6ca70..c4a6895cec4eab4fcf325d5c359425b3c8c000eb 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 0.4
 cl_damageeffect 0
+cl_playerdetailreduction 4
 gl_flashblend 1
 gl_picmip 1337
 mod_q3bsp_nolightmaps 1
index ec949193cf919b8192e7e8c2669878a52fc8ecd3..8150ee14cef6f16da456a8c9d104d243731d8875 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 1
 cl_decals_time 10
 cl_particles_quality 1
 cl_damageeffect 2
+cl_playerdetailreduction 0
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
index 48c17c3a31eb5961a510d3872f9f9b20d650c16e..4c4c09baff0321867c5d99be8f2d7eb933121c51 100644 (file)
@@ -3,6 +3,7 @@ cl_decals_models 1
 cl_decals_time 10
 cl_particles_quality 1
 cl_damageeffect 1
+cl_playerdetailreduction 0
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
diff --git a/gfx/hud/default/weapon_hlacmod_renameit.tga b/gfx/hud/default/weapon_hlacmod_renameit.tga
deleted file mode 100644 (file)
index 601f3d7..0000000
Binary files a/gfx/hud/default/weapon_hlacmod_renameit.tga and /dev/null differ
diff --git a/gfx/hud/luminos/weapon_hlacmod_renameit.tga b/gfx/hud/luminos/weapon_hlacmod_renameit.tga
deleted file mode 100644 (file)
index 601f3d7..0000000
Binary files a/gfx/hud/luminos/weapon_hlacmod_renameit.tga and /dev/null differ
diff --git a/gfx/hud/old/weapon_hlacmod_renameit.tga b/gfx/hud/old/weapon_hlacmod_renameit.tga
deleted file mode 100644 (file)
index 503dad9..0000000
Binary files a/gfx/hud/old/weapon_hlacmod_renameit.tga and /dev/null differ
diff --git a/gfx/menu/luminos/icon_mod_NewToys.tga b/gfx/menu/luminos/icon_mod_NewToys.tga
new file mode 100644 (file)
index 0000000..cf88f77
Binary files /dev/null and b/gfx/menu/luminos/icon_mod_NewToys.tga differ
diff --git a/gfx/menu/wickedx/icon_mod_NewToys.tga b/gfx/menu/wickedx/icon_mod_NewToys.tga
new file mode 100644 (file)
index 0000000..cf88f77
Binary files /dev/null and b/gfx/menu/wickedx/icon_mod_NewToys.tga differ
diff --git a/gfx/menu/xaw/icon_mod_NewToys.tga b/gfx/menu/xaw/icon_mod_NewToys.tga
new file mode 100644 (file)
index 0000000..cf88f77
Binary files /dev/null and b/gfx/menu/xaw/icon_mod_NewToys.tga differ
index 57e6578dc7a7a47bdbe173c82b983a5ba234c78b..22f021434183f8611ae0307dc1b2314874ef6292 100644 (file)
 "weaplast"                              "previously used"
 "weapbest"                              "best"
 "reload"                                "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 / Rifle"
-"impulse 8"                        "Hagar / Seeker"
-"impulse 9"                        "Rocket Launcher / Fireball"
-"impulse 14"                        "Port-O-Launch / Hook"
+"weapon_group_1"                        "Laser"
+"weapon_group_2"                        "Shotgun"
+"weapon_group_3"                        "Machine Gun"
+"weapon_group_4"                        "Mortar / Mine Layer"
+"weapon_group_5"                        "Electro"
+"weapon_group_6"                        "Crylink / HLAC"
+"weapon_group_7"                        "Nex / Rifle"
+"weapon_group_8"                        "Hagar / Seeker"
+"weapon_group_9"                        "Rocket Launcher / Fireball"
+"weapon_group_0"                        "Port-O-Launch / Hook"
 ""                                      ""
 ""                                      "View"
 "+zoom"                                 "hold zoom"
index 3c43ca944913ef8f3b06e14a14d26ef9981edfbf..1a4ca00cdd32015b31bd66cc54b7fe4ffc9db65e 100644 (file)
 "weaplast"                              "zuletzt benutzte"
 "weapbest"                              "beste"
 "reload"                                "nachladen"
-"impulse 1"                             "Laser"
-"impulse 2"                             "Schrotgewehr"
-"impulse 3"                             "Maschinengewehr"
-"impulse 4"                             "Mortar / Mine Layer"
-"impulse 5"                             "Electro"
-"impulse 6"                             "Crylink / HLAC"
-"impulse 7"                             "Nex / MinstaNex / Gewehr"
-"impulse 8"                             "Hagar / Seeker"
-"impulse 9"                             "Rocket Launcher / Fireball"
-"impulse 14"                            "Port-O-Launch / Enterhaken"
+"weapon_group_1"                             "Laser"
+"weapon_group_2"                             "Schrotgewehr"
+"weapon_group_3"                             "Maschinengewehr"
+"weapon_group_4"                             "Mortar / Mine Layer"
+"weapon_group_5"                             "Electro"
+"weapon_group_6"                             "Crylink / HLAC"
+"weapon_group_7"                             "Nex / MinstaNex / Gewehr"
+"weapon_group_8"                             "Hagar / Seeker"
+"weapon_group_9"                             "Rocket Launcher / Fireball"
+"weapon_group_0"                            "Port-O-Launch / Enterhaken"
 ""                                      ""
 ""                                      "Anzeige"
 "+zoom"                                 "Vergrößern (festhalten)"
index cdaa8cc956fb3f60d3347cd1194fe4ee4088ae5d..3e3102c795b7da5785b9fd7247b728b0ce960501 100644 (file)
 "weaplast"                              "anteriormente usado"
 "weapbest"                              "mejor"
 "reload"                                "recargar"
-"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"
+"weapon_group_1"                             "Laser"
+"weapon_group_2"                             "Shotgun"
+"weapon_group_3"                             "Machine Gun"
+"weapon_group_4"                             "Mortar / Mine Layer"
+"weapon_group_5"                             "Electro"
+"weapon_group_6"                             "Crylink / HLAC"
+"weapon_group_7"                             "Nex / MinstaNex / Rifle"
+"weapon_group_8"                             "Hagar / Seeker"
+"weapon_group_9"                             "Rocket Launcher / Fireball"
+"weapon_group_0"                            "Port-O-Launch / Hook"
 ""                                      ""
 ""                                      "Vista"
 "+zoom"                                 "mantener zoom"
 "togglezoom"                            "cambiar zoom"
 "+showscores"                           "mostrar puntaje"
 "screenshot"                            "captura de pantalla"
+"+hud_panel_radar_maximized"            "maximize radar (FIXME)"
 ""                                      ""
 ""                                      "Communicación"
 "messagemode"                           "chat público"
 "messagemode2"                          "chat de equipo"
 "team_auto"                             "unirse al equipo automáticamente"
 "menu_showteamselect"                   "menu de equipo"
+"menu_showsandboxtools"                 "sandbox menu (FIXME)"
 "spec"                                  "entrar al modo espectador"
 "dropweapon"                            "soltar arma"
 "+use"                                  "soltar llave / soltar bandera"
+"+button8"                              "drag object (FIXME)"
 ""                                      ""
 ""                                      "Definido por el usuario"
 "+userbind 1"                           "$userbind1"
index cc63be3a6e112ef2901703465f95ed00ec85e716..4693e38686428f1a52a98f336d286383d5d1a88d 100644 (file)
 "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"
+"weapon_group_1"                        "laser"
+"weapon_group_2"                        "shotgun"
+"weapon_group_3"                        "machine gun / rifle"
+"weapon_group_4"                        "mortar"
+"weapon_group_5"                        "electro"
+"weapon_group_6"                        "crylink / hlac"
+"weapon_group_7"                        "nex / minstanex"
+"weapon_group_8"                        "hagar"
+"weapon_group_9"                        "rocket launcher / fireball"
+"weapon_group_0"                        "porto / hook"
 ""                                      ""
 ""                                      "Vue"
 "+zoom"                                 "zoom clic enfoncé"
 "togglezoom"                            "zoom 2 clics"
 "+showscores"                           "montrer les scores (enfoncé)"
 "screenshot"                            "capture d'écran"
+"+hud_panel_radar_maximized"            "maximize radar (FIXME)"
 ""                                      ""
 ""                                      "Communiquer"
 "messagemode"                           "chat public"
 "messagemode2"                          "chat d'équipe"
 "team_auto"                             "auto-joindre une équipe"
 "menu_showteamselect"                   "séléction d'équipe"
+"menu_showsandboxtools"                 "sandbox menu (FIXME)"
 "spec"                                  "mode spectateur"
 "dropweapon"                            "lâcher l'arme"
 "+use"                                  "lâcher la clé / lâcher le drapeau"
+"+button8"                              "drag object (FIXME)"
 ""                                      ""
 ""                                      "Utilisateur"
 "+userbind 1"                           "$userbind1"
index 8627a885a8ad007c4b679573857d623b9d3e55a0..da4644a9b008d60961716cb53bb596d984bdafe6 100644 (file)
@@ -33,6 +33,7 @@
 "togglezoom"                            "nagyítás váltás"
 "+showscores"                           "pontszámok"
 "screenshot"                            "kép mentés"
+"+hud_panel_radar_maximized"            "maximize radar (FIXME)"
 ""                                      ""
 ""                                      "Kommunikáció"
 "messagemode"                           "nyilvános beszélgetés"
 "messagemode2"                          "csapat beszélgetés"
 "team_auto"                             "automatikus csapatválasztás"
 "menu_showteamselect"                   "csapat menü"
+"menu_showsandboxtools"                 "sandbox menu (FIXME)"
 "spec"                                  "néző módba váltás"
 "dropweapon"                            "fegyver eldobás"
 "+use"                                  "zászló eldobás, kiszállás"
+"+button8"                              "drag object"
 ""                                      ""
 ""                                      "Felhasználói hozzárendelések"
 "+userbind 1"                           "$userbind1"
index 68c044acc188055ac621ef8d66fe34e6a76d8c1d..87d7840295d1bd6db9f04778c6e8e390152ab58e 100644 (file)
@@ -3,36 +3,37 @@
 "+back"                                 "indietro"
 "+moveleft"                             "a sinistra"
 "+moveright"                            "a destra"
-"+jump"                                 "salta / nuota"
-"+crouch"                               "accovacciarsi / abbassarsi"
-"+hook"                                 "uncino / jet pack"
+"+jump"                                 "salta / risalire in acqua"
+"+crouch"                               "abbassarsi / scendere in acqua"
+"+hook"                                 "off-hand hook / jet pack"
 ""                                      ""
 ""                                      "Attacco"
 "+fire"                                 "fuoco primario"
 "+fire2"                                "fuoco secondario"
 ""                                      ""
 ""                                      "Cambio d'arma"
-"weapprev"                              "arma precedente"
-"weapnext"                              "arma successiva"
-"weaplast"                              "ultima arma usata"
-"weapbest"                              "miglior arma"
+"weapprev"                              "precedente"
+"weapnext"                              "successiva"
+"weaplast"                              "ultima usata"
+"weapbest"                              "migliore"
 "reload"                                "ricarica"
-"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 / Fucile"
-"impulse 8"                             "Hagar / Seeker"
-"impulse 9"                             "Rocket Launcher / Fireball"
-"impulse 14"                            "Port-O-Launch / Hook"
+"weapon_group_1"                        "Laser"
+"weapon_group_2"                        "Shotgun"
+"weapon_group_3"                        "Machine Gun"
+"weapon_group_4"                        "Mortar / Mine Layer"
+"weapon_group_5"                        "Electro"
+"weapon_group_6"                        "Crylink / HLAC"
+"weapon_group_7"                        "Nex / Rifle"
+"weapon_group_8"                        "Hagar / Seeker"
+"weapon_group_9"                        "Rocket Launcher / Fireball"
+"weapon_group_0"                        "Port-O-Launch / Hook"
 ""                                      ""
 ""                                      "Vista"
 "+zoom"                                 "tieni zoom"
 "togglezoom"                            "attiva/disattiva zoom"
-"+showscores"                           "mostra punteggio"
+"+showscores"                           "mostra punteggi"
 "screenshot"                            "cattura schermata"
+"+hud_panel_radar_maximized"            "massimizza radar"
 ""                                      ""
 ""                                      "Comunicazione"
 "messagemode"                           "chat pubblica"
 "disconnect"                            "disconnetti"
 "menu_showquitdialog"                   "esci"
 ""                                      ""
-""                                      "Teamplay"
+""                                      "Gioco a squadre"
 "messagemode2"                          "chat di squadra"
-"team_auto"                             "auto-unisciti ad una squadra"
-"menu_showteamselect"                   "selezione della squadra"
-"spec"                                  "entra in modalità spettatore"
-"dropweapon"                            "rilascia arma"
-"+use"                                  "rilascia chiave / rilascia bandiera"
+"team_auto"                             "auto-scegli squadra"
+"menu_showteamselect"                   "menu scelta squadra"
+"menu_showsandboxtools"                 "menu sandbox"
+"spec"                                  "modalità spettatore"
+"dropweapon"                            "abbandona arma"
+"+use"                                  "abbandona chiave / bandiera"
+"+button8"                              "trascina oggetto"
 ""                                      ""
 ""                                      "Definiti dall'utente"
 "+userbind 1"                           "$userbind1"
index ee484cf155b94dd534b8bfd0d94b07c5a4e7bfc3..4d4221a205d648285049e6e6fd39ef97ff321071 100644 (file)
 "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"
+"weapon_group_1"                        "Laser"
+"weapon_group_2"                        "Shotgun"
+"weapon_group_3"                        "Machine Gun"
+"weapon_group_4"                        "Mortar / Mine Layer"
+"weapon_group_5"                        "Electro"
+"weapon_group_6"                        "Crylink / HLAC"
+"weapon_group_7"                        "Nex / Rifle"
+"weapon_group_8"                        "Hagar / Seeker"
+"weapon_group_9"                        "Rocket Launcher / Fireball"
+"weapon_group_0"                        "Port-O-Launch / Hook"
 ""                                      ""
 ""                                      "Вид"
 "+zoom"                                 "увеличение"
 "togglezoom"                            "переключить увеличение"
 "+showscores"                           "показать очки"
 "screenshot"                            "снимок экрана"
+"+hud_panel_radar_maximized"            "maximize radar (FIXME)"
 ""                                      ""
 ""                                      "Общение"
 "messagemode"                           "общий чат"
 "messagemode2"                          "чат команды"
 "team_auto"                             "авто-выбор команды"
 "menu_showteamselect"                   "меню команды"
+"menu_showsandboxtools"                 "sandbox menu (FIXME)"
 "spec"                                  "стать наблюдателем"
 "dropweapon"                            "бросить оружие"
 "+use"                                  "бросить ключ или флаг"
+"+button8"                              "drag object"
 ""                                      ""
 ""                                      "Определенно пользователем"
 "+userbind 1"                           "$userbind1"
index 9284c172e91a7ad131de0cd86582136c82151ee7..07edd866831cc4d2ecd58af4c381319faae36b81 100644 (file)
@@ -33,6 +33,7 @@
 "togglezoom"                            "увімк / вимк зум"
 "+showscores"                           "показати рахунок"
 "screenshot"                            "скриншот"
+"+hud_panel_radar_maximized"            "maximize radar (FIXME)"
 ""                                      ""
 ""                                      "Спілкування"
 "messagemode"                           "публічний чат"
 "messagemode2"                          "командний чат"
 "team_auto"                             "автовибір команди"
 "menu_showteamselect"                   "командне меню"
+"menu_showsandboxtools"                 "sandbox menu (FIXME)"
 "spec"                                  "увійти в режим спостерігача"
 "dropweapon"                            "викинути зброю"
 "+use"                                  "викинути ключ / прапор"
+"+button8"                              "drag object"
 ""                                      ""
 ""                                      "Визначені користувачем"
 "+userbind 1"                           "$userbind1"
index 966635dbf621bf3a8428594b62247aa4fa1fffe3..5352e583f92ce6a123647e762ed2492c68e7daa2 100644 (file)
@@ -1,13 +1,13 @@
 de German "Deutsch"
-el Greek "Ελληνική" // bad
+el Greek "Ελληνική (INCOMPLETE)"
 en English "English"
-es Spanish "Español" // bad
+es Spanish "Español (INCOMPLETE)"
 fr French "Français"
 it Italian "Italiano"
 hu Hungarian "Magyar"
 nl Dutch "Nederlands"
 pt Portuguese "Português"
 ro Romanian "Romana"
-ru Russian "Русский" // bad
-fi Finnish "Suomi" // bad
+ru Russian "Русский (INCOMPLETE)"
+fi Finnish "Suomi"
 uk Ukrainian "Українська"
index 116c9bb982f463346ae1b17c2d1b76b779eb2624..bd8e93f3749ffa719517f48d0dbe6f786ce3780d 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-09-02 07:51+0200\n"
+"POT-Creation-Date: 2012-01-26 12:24+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"
@@ -17,33 +17,102 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/common/mapinfo.qc:1092 qcsrc/menu/xonotic/skinlist.c:163
+#: qcsrc/common/mapinfo.qc:665
+#, c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr "@!#% tuubanheitto!"
+
+#: qcsrc/common/mapinfo.qc:1057 qcsrc/menu/xonotic/skinlist.c:166
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: qcsrc/menu/gamecommand.qc:47
+#: qcsrc/common/mapinfo.qh:36
+msgid "Deathmatch"
+msgstr "Mättö (Deathmatch)"
+
+#: qcsrc/common/mapinfo.qh:39
+msgid "Last Man Standing"
+msgstr "Viimeiseen mieheen (Last Man Standing)"
+
+#: qcsrc/common/mapinfo.qh:42
+msgid "Arena"
+msgstr "Areena (Arena)"
+
+#: qcsrc/common/mapinfo.qh:45
+msgid "Runematch"
+msgstr "Riimu-ottelu (Runematch)"
+
+#: qcsrc/common/mapinfo.qh:48
+msgid "Race"
+msgstr "Kilpailu (RACE)"
+
+#: qcsrc/common/mapinfo.qh:51
+msgid "Race CTS"
+msgstr "Kilpailu CTS (RACE CTS)"
+
+#: qcsrc/common/mapinfo.qh:54
+msgid "Team Deathmatch"
+msgstr "Joukkuemättö (Team Deatchmatch)"
+
+#: qcsrc/common/mapinfo.qh:57
+msgid "Capture the Flag"
+msgstr "Lipunryöstö (CTF)"
+
+#: qcsrc/common/mapinfo.qh:60
+msgid "Clan Arena"
+msgstr "Klaaniareena (Clan Arena)"
+
+#: qcsrc/common/mapinfo.qh:63
+msgid "Domination"
+msgstr "Hallinta (Domination)"
+
+#: qcsrc/common/mapinfo.qh:66
+msgid "Key Hunt"
+msgstr "Avaimenetsintä (Key Hunt)"
+
+#: qcsrc/common/mapinfo.qh:69
+msgid "Assault"
+msgstr "Rynnäkkö (Assault)"
+
+#: qcsrc/common/mapinfo.qh:72
+msgid "Onslaught"
+msgstr "Suurtaistelu (Onslaught)"
+
+#: qcsrc/common/mapinfo.qh:75
+msgid "Nexball"
+msgstr "Nexpallo (Nexball)"
+
+#: qcsrc/common/mapinfo.qh:78
+msgid "Freeze Tag"
+msgstr "Pakkashippa (Freeze Tag)"
+
+#: qcsrc/common/mapinfo.qh:81
+msgid "Keepaway"
+msgstr "Pakomatka (Keepaway)"
+
+#: qcsrc/menu/command/menu_cmd.qc:41
 #, c-format
 msgid "error: status is %d\n"
 msgstr "virhe: %d\n"
 
-#: qcsrc/menu/gamecommand.qc:65
+#: qcsrc/menu/command/menu_cmd.qc:64
 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
+#: qcsrc/menu/command/menu_cmd.qc:65
 msgid "  sync - reloads all cvars on the current menu page\n"
 msgstr "  sync - uudelleenlataa kaikki cvar-muuttujat nykyiseen valikkoon"
 
-#: qcsrc/menu/gamecommand.qc:67
+#: qcsrc/menu/command/menu_cmd.qc:66
 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
+#: qcsrc/menu/command/menu_cmd.qc:179
 msgid "error creating curl handle\n"
 msgstr "virhe luodessa curl handlea\n"
 
-#: qcsrc/menu/gamecommand.qc:239
+#: qcsrc/menu/command/menu_cmd.qc:186
 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 "
@@ -72,17 +141,17 @@ msgstr "%d (%s)"
 msgid "custom"
 msgstr "omavalintainen"
 
-#: qcsrc/menu/menu.qc:29
+#: qcsrc/menu/menu.qc:37
 #, c-format
 msgid "^4MQC Build information: ^1%s\n"
 msgstr "^4MQC Version tiedot: ^1%s\n"
 
-#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:134
+#: qcsrc/menu/xonotic/campaign.c:288
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:123
 msgid "???"
 msgstr "???"
 
-#: qcsrc/menu/xonotic/campaign.c:285
+#: qcsrc/menu/xonotic/campaign.c:289
 #, c-format
 msgid "Level %d: %s"
 msgstr "Taso %d: %s"
@@ -113,10 +182,14 @@ 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:57
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:277
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:91
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:113
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:74
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:89
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:73
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
 msgstr "OK"
@@ -125,7 +198,7 @@ msgstr "OK"
 msgid "Welcome"
 msgstr "Tervetuloa"
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+#: qcsrc/menu/xonotic/dialog_firstrun.c:40
 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 "
@@ -134,18 +207,34 @@ msgstr ""
 "Tervetuloa pelaamaan Xonoticcia! Valitse haluamasi kieli ja pelaajanimesi "
 "aloittaaksesi. Voit vaihtaa näitä asetuksia jälkikäteen pelin asetuksista."
 
-#: 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_firstrun.c:46
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:37
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
 msgid "Name:"
 msgstr "Nimi:"
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+#: qcsrc/menu/xonotic/dialog_firstrun.c:68
+#: qcsrc/menu/xonotic/dialog_settings_user.c:65
+msgid "Text language:"
+msgstr "Tekstin kieli:"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:77
+msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
+msgstr "Salli pelinimesi käyttö pelaajatilastosivulla stats.xonotic.org?"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:81
+msgid "ALWU2N^Yes"
+msgstr "ALWU2N^Kyllä"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:82
+msgid "ALWU2N^No"
+msgstr "ALWU2N^Ei"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:83
+msgid "ALWU2N^Undecided"
+msgstr "ALWU2N^En osaa päättää"
+
+#: qcsrc/menu/xonotic/dialog_firstrun.c:87
 msgid "Save settings"
 msgstr "Tallenna asetukset"
 
@@ -204,7 +293,7 @@ msgid "Text alignment:"
 msgstr "Tekstin kohdistus:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:51
 msgid "Center"
 msgstr "Keskus"
 
@@ -348,12 +437,12 @@ msgid "Status bar"
 msgstr "Tilapalkki"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:49
 msgid "Left align"
 msgstr "Vasen tasaus"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
 msgid "Right align"
 msgstr "Oikea tasaus"
 
@@ -370,6 +459,7 @@ msgid "Flip speed/acceleration positions"
 msgstr "Vaihda nopeuden/kiihtyvyyden paikkaa"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:29
 msgid "Speed:"
 msgstr "Nopeus:"
 
@@ -461,8 +551,8 @@ 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:154
-#: qcsrc/menu/xonotic/util.qc:600
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:66
+#: qcsrc/menu/xonotic/util.qc:655
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -491,6 +581,7 @@ msgid "North"
 msgstr "Pohjoinen"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:61
 msgid "Scale:"
 msgstr "Skaala:"
 
@@ -567,7 +658,6 @@ 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ä"
 
@@ -601,34 +691,38 @@ msgid "Weapon icons:"
 msgstr "Aseiden kuvakkeet:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show only owned weapons"
+msgstr "Näytä vain omistuksessa olevat aseet"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Show weapon ID as:"
 msgstr "Näytä aseen tunniste:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
 msgid "SHOWAS^None"
 msgstr "SHOWAS^Ei mitään."
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
 msgid "Number"
 msgstr "Numero"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Bind"
 msgstr "Näppäin"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:54
 msgid "Show Accuracy"
 msgstr "Näytä tarkkuus"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Show Ammo"
 msgstr "Näytä panokset"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:58
 msgid "Ammo bar color:"
 msgstr "Ammuskotelon väri"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:64
 msgid "Ammo bar alpha:"
 msgstr "Ammuskotelon alpha"
 
@@ -640,24 +734,24 @@ msgstr "Paneelin näkymän asetukset"
 msgid "Panel background defaults:"
 msgstr "Paneelin taustan perusasetukset:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:630
 msgid "Background:"
 msgstr "Tausta:"
 
 #: 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:578
-#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:633
+#: qcsrc/menu/xonotic/util.qc:649 qcsrc/menu/xonotic/util.qc:666
 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:583
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:638
 msgid "Color:"
 msgstr "Väri:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:646
 msgid "Border size:"
 msgstr "Reunan koko:"
 
@@ -666,11 +760,11 @@ msgstr "Reunan koko:"
 msgid "Team color:"
 msgstr "Joukkueen väri:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:672
 msgid "Test team color in configure mode"
 msgstr "Kokeile joukkueen väriä muokkaustilassa"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:675
 msgid "Padding:"
 msgstr "Pehmustus:"
 
@@ -744,127 +838,123 @@ msgstr "Pelaajan asetukset"
 msgid "Game type:"
 msgstr "Pelityyppi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
-msgid "Match settings:"
-msgstr "Ottelun asetukset"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:48
 msgid "Time limit:"
 msgstr "Aikaraja"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:52
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:60
 msgid "Use map specified default"
 msgstr "Käytä kartan omaa oletusarvoa"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
 msgid "Point limit:"
 msgstr "Pisteraja:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:63
 msgid "Player slots:"
 msgstr "Pelaajamäärä:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:66
 msgid "Number of bots:"
 msgstr "Bottien lukumäärä:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:69
 msgid "Bot skill:"
 msgstr "Bottien taitotaso:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
 msgid "Botlike"
 msgstr "Typerä kone"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:73
 msgid "Beginner"
 msgstr "Aloittelija"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
 msgid "You will win"
 msgstr "Helppo voitto"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
 msgid "You can win"
 msgstr "Helpohko"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You might win"
 msgstr "Keskitaso"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "Advanced"
 msgstr "Kehittynyt"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "Expert"
 msgstr "Ekspertti"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Pro"
 msgstr "Mestari"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
 msgid "Assassin"
 msgstr "Murhaaja"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
 msgid "Unhuman"
 msgstr "Epäinhimillinen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Godlike"
 msgstr "Jumalainen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:87
 msgid "Mutators..."
 msgstr "Muokkaukset..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:96
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:145
 msgid "Advanced settings..."
 msgstr "Edistyneet asetukset..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:103
 msgid "Map list:"
 msgstr "Karttalista"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:109
 msgid "Select all"
 msgstr "Valitse kaikki"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:112
 msgid "Select none"
 msgstr "Poista kaikki valinnat"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:118
 msgid "Start Multiplayer!"
 msgstr "Aloita moninpeli!"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:153
 msgid "Capture limit:"
 msgstr "Lipunryöstöraja"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
 msgid "Lives:"
 msgstr "Elämät:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Laps:"
 msgstr "Kierrokset:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
 msgid "Goals:"
 msgstr "Maalit:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
 msgid "Frag limit:"
 msgstr "Tapporaja:"
 
@@ -968,28 +1058,28 @@ msgstr "Esineiden täysi sijoittaminen"
 msgid "MinstaGib only"
 msgstr "Vain MinstaGib"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:81
 msgid "Title:"
 msgstr "Otsikko:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:87
 msgid "Author:"
 msgstr "Tekijä:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:93
 msgid "Features:"
 msgstr "Ominaisuudet:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:98
 msgid "Game types:"
 msgstr "Pelityypit:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:335
 msgid "Close"
 msgstr "Sulje"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:124
 msgid "MAP^Play"
 msgstr "Pelaa"
 
@@ -1011,108 +1101,121 @@ msgid "%s Arena"
 msgstr "%s taistelukenttä"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
 msgid "Dodging"
 msgstr "Väistely"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:258
 msgid "MinstaGib"
 msgstr "MinstaGib"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:261
 msgid "NIX"
 msgstr "NIX"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:213
 msgid "Rocket Flying"
 msgstr "Rakettilentely"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:210
+msgid "Invincible Projectiles"
+msgstr "Kuolemattomat Projektiilit"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:272
 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
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:195
 msgid "Low gravity"
 msgstr "Vajaa painovoima"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
 msgid "Cloaked"
 msgstr "Näkymätön"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
 msgid "Hook"
 msgstr "Köysi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:179
 msgid "Midair"
 msgstr "Jalat irti maasta"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:182
 msgid "Vampire"
 msgstr "Vampyyri"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:216
 msgid "Piñata"
 msgstr "Piñata"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:219
 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
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:186
 msgid "Blood loss"
 msgstr "Verenvuodatus"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:207
 msgid "Jet pack"
 msgstr "Rakettireppu"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:100
+msgid "No powerups"
+msgstr "Ei tehonlisäyksiä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:102
+msgid "Powerups"
+msgstr "Tehonlisäykset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:104
 msgid "MUT^None"
 msgstr "MUT^Ei mitään"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
 msgid "Gameplay mutators:"
 msgstr "Pelityylin muokkaukset:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:201
 msgid "Weapon & item mutators:"
 msgstr "Aseiden ja esineiden muokkaukset:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:204
 msgid "Grappling hook"
 msgstr "Köysi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:223
 msgid "Weapon arenas:"
 msgstr "Tietyn aseen taistelukenttä"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:226
 msgid "Regular (no arena)"
 msgstr "Perinteinen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
 msgid "with laser"
 msgstr "laserilla"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:255
 msgid "Special arenas:"
 msgstr "Erikoistaistelukentät:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:268
 msgid "Most weapons"
 msgstr "Suurin osa aseista"
 
@@ -1121,26 +1224,26 @@ msgid "Demo"
 msgstr "Demo"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
-msgid "Record demos while playing"
+msgid "Automatically record demos while playing"
 msgstr "Tallenna demoja pelin aikana"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:31
 #: 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_demo.c:32
 #: 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
+#: qcsrc/menu/xonotic/dialog_settings_input.c:40
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:32
 msgid "Clear"
 msgstr "Tyhjennä"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:45
 msgid "Timedemo"
 msgstr "Aikademo"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:48
 msgid "DEMO^Play"
 msgstr "Pelaa"
 
@@ -1161,6 +1264,7 @@ msgid "Pause"
 msgstr "Keskeytä"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:262
 msgid "Address:"
 msgstr "Osoite:"
 
@@ -1169,7 +1273,7 @@ msgid "Info..."
 msgstr "Tietoa..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:342
 msgid "Join!"
 msgstr "Liity!"
 
@@ -1177,307 +1281,495 @@ msgstr "Liity!"
 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
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:132
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:133
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:242
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:247
 msgid "N/A"
 msgstr "N/A"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:179
 #, c-format
-msgid "%d/%d, %d free player slots"
-msgstr "%d/%d, %d vapaata pelaajapaikkaa"
+msgid "%d/%d"
+msgstr "%d/%d"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:193
+#: qcsrc/menu/xonotic/util.qc:632 qcsrc/menu/xonotic/util.qc:648
+#: qcsrc/menu/xonotic/util.qc:657 qcsrc/menu/xonotic/util.qc:665
+#: qcsrc/menu/xonotic/util.qc:677
+msgid "Default"
+msgstr "Perusasetus"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:200
 #, c-format
-msgid "%d modified settings"
+msgid "%d modified"
 msgstr "%d muokattua asetusta"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-msgid "Official settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:200
+msgid "Official"
 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:208
+msgid "N/A (auth library missing, can't connect)"
+msgstr "Ei saatavilla (valtuutuskirjastot puuttuvat, 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:210
+msgid "N/A (auth library missing)"
+msgstr "Ei saatavilla (valtuutuskirjastot puuttuvat)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
-msgid "not supported (won't encrypt)"
-msgstr "ei tuettu (salaus ei onnistu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:216
+msgid "Not supported (can't connect)"
+msgstr "Ei tuettu (ei voida yhdistää)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
-msgid "supported (will encrypt)"
-msgstr "tuettu (salaus onnistuu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:218
+msgid "Not supported (won't encrypt)"
+msgstr "Ei tuettu (salaus ei onnistu)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
-msgid "supported (won't encrypt)"
-msgstr "tuettu (salaus ei onnistu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:222
+msgid "Supported (will encrypt)"
+msgstr "Tuettu (salaus onnistuu)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
-msgid "requested (will encrypt)"
-msgstr "pyydetty (salaus onnistuu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:224
+msgid "Supported (won't encrypt)"
+msgstr "Tuettu (salaus ei onnistu)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
-msgid "requested (won't encrypt)"
-msgstr "pyydetty (salaus ei onnistu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:228
+msgid "Requested (will encrypt)"
+msgstr "Pyydetty (salaus onnistuu)"
 
-#: 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:230
+msgid "Requested (won't encrypt)"
+msgstr "Pyydetty (salaus ei onnistu)"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
-msgid "required (will encrypt)"
-msgstr "vaadittu (salaus onnistuu)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:234
+msgid "Required (can't connect)"
+msgstr "Vaadittu (ei voida yhdistää)"
 
-#: 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:236
+msgid "Required (will encrypt)"
+msgstr "Vaadittu (salaus onnistuu)"
 
-#: 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:256
+msgid "Hostname:"
+msgstr "Palvelimen nimi"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:270
+msgid "Gametype:"
+msgstr "Pelityyppi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:275
 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
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:280
 msgid "Mod:"
 msgstr "Modi:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:285
 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:290
+msgid "Settings:"
+msgstr "Asetukset"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
-msgid "CA:"
-msgstr "CA:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:297
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:329
+msgid "Players:"
+msgstr "Pelaajat:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
-msgid "Key:"
-msgstr "Avain:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:302
+msgid "Bots:"
+msgstr "Botit:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Free slots:"
+msgstr "Vapaat paikat:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:313
 msgid "Encryption:"
 msgstr "Salaus:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:318
+msgid "ID:"
+msgstr "Tunnus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:323
+msgid "Key:"
+msgstr "Avain:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:60
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:19
 msgid "Model:"
 msgstr "Hahmo:"
 
 #: 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:"
+msgid "No crosshair"
+msgstr "Ei tähtäintä:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
-msgid "Zoom speed:"
-msgstr "Tarkennuksen nopeus:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:90
+msgid "Per weapon crosshair"
+msgstr "Asekohtainen tähtäin"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
-msgid "Weapon settings..."
-msgstr "Aseiden asetukset..."
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:93
+msgid "Custom crosshair"
+msgstr "Muokattu tähtäin:"
 
-#: 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:139
-msgid "Per weapon"
-msgstr "Asekohtainen"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:112
 msgid "Crosshair size:"
 msgstr "Tähtäimen suuruus:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:117
 msgid "Crosshair alpha:"
 msgstr "Tähtäimen alpha:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:123
 msgid "Crosshair color:"
 msgstr "Tähtäimen väri:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:125
+msgid "Per weapon"
+msgstr "Asekohtainen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:127
 msgid "By health"
 msgstr "Elämän mukaan"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:131
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:47
 msgid "Custom"
 msgstr "Omavalintainen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
-msgid "Enable center dot"
-msgstr "Ota tähtäin käyttöön"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139
+msgid "Other crosshair settings"
+msgstr "Muut tähtäimen asetukset"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
-msgid "Size:"
-msgstr "Koko:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:147
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:6
+msgid "Model settings"
+msgstr "Hahmon asetukset"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
-msgid "Hit test:"
-msgstr "Osumatesti:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:153
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:6
+msgid "View settings"
+msgstr "Näkymän asetukset"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
-msgid "HTST^None"
-msgstr "HTST^Ei mitään."
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr "Aseiden asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:6
+msgid "HUD settings"
+msgstr "Käyttöliittymän asetukset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:203
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:185
+#: qcsrc/menu/xonotic/dialog_settings_input.c:89
+#: qcsrc/menu/xonotic/dialog_settings_user.c:88
+#: qcsrc/menu/xonotic/dialog_settings_video.c:142
+msgid "Apply immediately"
+msgstr "Ota heti käyttöön"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
-msgid "TrueAim"
-msgstr "TrueAim"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:6
+msgid "Crosshair settings"
+msgstr "Tähtäimen asetukset:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
-msgid "Enemies"
-msgstr "Viholliset"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:28
+msgid "Enable center crosshair dot"
+msgstr "Käytä keskitettyä pistettä tähtäimessä"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
-msgid "Waypoints setup..."
-msgstr "Välimatkojen asetukset..."
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:31
+msgid "Dot size:"
+msgstr "Pisteen koko:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:36
+msgid "Dot alpha:"
+msgstr "Pisteen läpinäkyvyys:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:41
+msgid "Dot color:"
+msgstr "Pisteen väri:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:43
+msgid "Use normal crosshair color"
+msgstr "Käytä normaalin tähtäimen väriä:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:54
+msgid "Crosshair animations:"
+msgstr "Tähtäimen animaatiot:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:57
+msgid "Smooth effects of crosshairs"
+msgstr "Pehmennä tähtäimen efektejä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:61
+msgid "Use rings to indicate weapon status"
+msgstr "Ympyrät näyttävät aseen tila"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:67
+msgid "Hit testing:"
+msgstr "Osumatesti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:69
+msgid "HTTST^Disabled"
+msgstr "HTTST^Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:70
+msgid "HTTST^TrueAim"
+msgstr "HTTST^TrueAim"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:71
+msgid "HTTST^Enemies"
+msgstr "HTTST^Viholliset"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:76
+msgid "Blur crosshair if the shot is obstructed"
+msgstr "Sumenna tähtäin jos aseen ja kohteen välissä on este"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:81
+msgid "Animate when hitting an enemy"
+msgstr "Animoi osutessa viholliseen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c:85
+msgid "Animate when picking up an item"
+msgstr "Animoi poimitessa esineen"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:40
+msgid "Damage:"
+msgstr "Veriroiskeet:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:43
+msgid "Overlay:"
+msgstr "Päällys:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:47
+msgid "Factor:"
+msgstr "Tarkennuskerroin:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:52
+msgid "Fade rate:"
+msgstr "Sisääntulon häivennyksen kesto"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:58
+msgid "Waypoints"
+msgstr "Välietapit"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:71
+msgid "Edge offset:"
+msgstr "Tönäisy reunasta:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:80
+msgid "Show names above players"
+msgstr "Näytä pelaajanimet hahmojen yläpuolella"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:83
+msgid "Only when near crosshair"
+msgstr "Vain lähellä tähtäintä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:86
+msgid "Display health and armor"
+msgstr "Näytä elämän ja panssarin arvot"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hud.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hudconfirm.c:4
 msgid "Enter HUD editor"
 msgstr "Muokkaa näkymää"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
-msgid "Force models:"
-msgstr "Pakota hahmojen ulkomuoto samanlaiseksi:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hudconfirm.c:28
+msgid "In order for the HUD editor to show, you must first be in game."
+msgstr "Jotta käyttöliittymän editori toimisi, täytyy sinun olla pelissä."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
-msgid "MDL^None"
-msgstr "MDL^Ei mitään."
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hudconfirm.c:30
+msgid "Do you wish to start a local game to set up the HUD?"
+msgstr ""
+"Haluatko aloittaa paikallisen pelin (LAN) muokatakseesi käyttöliittymää?"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
-msgid "MDL^Custom"
-msgstr "MDL^Omavalintainen"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hudconfirm.c:33
+msgid "HDCNFRM^Yes"
+msgstr "HDCNFRM^Kyllä"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
-msgid "MDL^All"
-msgstr "MDL^Kaikki"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_hudconfirm.c:36
+msgid "HDCNFRM^No"
+msgstr "HDCNFRM^Ei"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
-msgid "Disable gore effects"
-msgstr "Ota ylimitoitettu raakuus pois päältä"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:28
+msgid "Body fading:"
+msgstr "Ruumiin häivytys:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:31
 msgid "Gibs:"
 msgstr "Raajat:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:33
 msgid "GIBS^None"
 msgstr "GIBS^Ei mitään"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:34
 msgid "GIBS^Few"
 msgstr "GIBS^Vähän"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:35
 msgid "GIBS^Many"
 msgstr "GIBS^Paljon"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:36
 msgid "GIBS^Lots"
 msgstr "GIBS^Runsaasti"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
-msgid "Damage splash:"
-msgstr "Veriroiskeet"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:40
+msgid "Playermodel LOD:"
+msgstr "Pelaajahahmon LOD:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
-#: 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:109
-msgid "Apply immediately"
-msgstr "Ota heti käyttöön"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:44
+msgid "Force models:"
+msgstr "Pakota hahmojen ulkomuoto samanlaiseksi:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
-msgid "Waypoints"
-msgstr "Välietapit"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:45
+msgid "MDL^None"
+msgstr "MDL^Ei mitään."
 
-#: 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_model.c:46
+msgid "MDL^Custom"
+msgstr "MDL^Omavalintainen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
-msgid "Waypoint scale:"
-msgstr "Välietappien skaala:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:47
+msgid "MDL^All"
+msgstr "MDL^Kaikki"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
-msgid "Waypoint alpha:"
-msgstr "Välietappien alpha:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:50
+msgid "Force player models to mine"
+msgstr "Pakota hahmojen ulkomuoto samanlaiseksi:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
-msgid "Show names:"
-msgstr "Näytä nimet:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:52
+msgid "Force player colors to mine"
+msgstr "Pakota pelaajat samanvärisiksi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
-msgid "Teammates"
-msgstr "Oma joukkue"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:28
+msgid "Field of view:"
+msgstr "Näkökenttä:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
-msgid "All players"
-msgstr "Kaikki pelaajat"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:31
+msgid "Zoom:"
+msgstr "Tarkennus:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
-msgid "Weapon settings"
-msgstr "Aseiden asetukset"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:33
+msgid "RETICLE^Fullscreen"
+msgstr "RETICLE^Kokoruutu"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
-msgid "Weapon priority list:"
-msgstr "Aseiden prioriteetti:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:34
+msgid "RETICLE^With reticle"
+msgstr "RETICLE^Ristikolla"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
-msgid "Up"
-msgstr "Ylös"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:38
+msgid "ZOOM^Factor:"
+msgstr "ZOOM^Kerroin:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
-msgid "Down"
-msgstr "Alas"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:42
+msgid "ZOOM^Speed:"
+msgstr "ZOOM^Nopeus:"
 
-#: 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_view.c:52
+msgid "ZOOM^Instant"
+msgstr "ZOOM^Heti"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
-msgid "Auto switch weapons on pickup"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:56
+msgid "ZOOM^Sensitivity:"
+msgstr "ZOOM^Herkkyys:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:59
+msgid "Velocity zoom:"
+msgstr "Vauhtitarkennus:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:61
+msgid "VZOOM^Disabled"
+msgstr "VZOOM^Pois"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:62
+msgid "VZOOM^Forward only"
+msgstr "VZOOM^Vain eteenpäin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:63
+msgid "VZOOM^All directions"
+msgstr "VZOOM^Kaikkiin suuntiin"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:67
+msgid "VZOOM^Speed"
+msgstr "VZOOM^Vauhti"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:72
+msgid "Allow passing through walls while spectating"
+msgstr "Salli lentäminen seinien läpi katsojana"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:75
+msgid "1st person perspective"
+msgstr "Ensimmäisen persoonan näkymä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:79
+msgid "Smooth the view when landing from a jump"
+msgstr "Pehmennä näkymää laskeuduttaessa"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:83
+msgid "Smooth the view while crouching"
+msgstr "Pehmennä näkymää kun menet kyykkyyn"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:87
+msgid "View waving while idle"
+msgstr "Heiluta näkymää joutilaana"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:91
+msgid "View bobbing while walking around"
+msgstr "Heiluta näkymää kun kävelet"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:96
+msgid "3rd person perspective"
+msgstr "Kolmannen persoonan näkymä"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:100
+msgid "Back distance"
+msgstr "Etäisyys taakse:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_view.c:106
+msgid "Up distance"
+msgstr "Etäisyys ylös:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr "Aseiden prioriteetti:"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:33
+msgid "Up"
+msgstr "Ylös"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:36
+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
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:46
 msgid "Draw 1st person weapon model"
 msgstr "Piirrä ensimmäisen persoonan asemalli"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
-msgid "Flip view horizontally"
-msgstr "Käännä näkymä horisontaalisesti"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:58
+msgid "Gun model swaying"
+msgstr "Aseen huojunta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:63
+msgid "Gun model bobbing"
+msgstr "Aseen heilunta"
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:68
+msgid "VWMDL^Scale"
+msgstr "VWMDL^Skaala"
 
 #: qcsrc/menu/xonotic/dialog_news.c:4
 msgid "News"
@@ -1491,18 +1783,146 @@ msgstr "http://www.xonotic.org/team/blog/"
 msgid "Quit"
 msgstr "Lopeta"
 
-#: qcsrc/menu/xonotic/dialog_quit.c:17
+#: qcsrc/menu/xonotic/dialog_quit.c:18
 msgid "Are you sure you want to quit?"
 msgstr "Haluatko aivan varmasti lopettaa pelin?"
 
-#: qcsrc/menu/xonotic/dialog_quit.c:20
+#: qcsrc/menu/xonotic/dialog_quit.c:21
 msgid "Yes"
 msgstr "Kyllä"
 
-#: qcsrc/menu/xonotic/dialog_quit.c:21
+#: qcsrc/menu/xonotic/dialog_quit.c:22
 msgid "No"
 msgstr "Ei"
 
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:4
+msgid "Sandbox Tools"
+msgstr "Hiekkalaatikon työkalut"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:24
+msgid "Spawn"
+msgstr "Luo"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:25
+msgid "Remove *"
+msgstr "Poista *"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:27
+msgid "Copy *"
+msgstr "Kopioi *"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:28
+msgid "Paste"
+msgstr "Liitä:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:30
+msgid "Bone:"
+msgstr "Luu:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:35
+msgid "Set * as child"
+msgstr "Aseta * lapseksi"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:36
+msgid "Attach to *"
+msgstr "Liitä *:n"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:38
+msgid "Detach from *"
+msgstr "Irrota *:stä"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:41
+msgid "Visual object properties for *:"
+msgstr "Esineen *:n visuaaliset ominaisuudet:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:43
+msgid "Set skin:"
+msgstr "Aseta iho:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:45
+msgid "Set alpha:"
+msgstr "Aseta läpinäkyvyys:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:48
+msgid "Set color main:"
+msgstr "Aseta pääväri:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:50
+msgid "Set color glow:"
+msgstr "Aseta hehkumisväri:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:54
+msgid "Set frame:"
+msgstr "Aseta kuvaruutu"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:58
+msgid "Physical object properties for *:"
+msgstr "Esineen *:n fysikaaliset ominaisuudet:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:60
+msgid "Set material:"
+msgstr "Aseta materiaali"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:66
+msgid "Set solidity:"
+msgstr "Aseta kiinteyys:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:67
+msgid "Non-solid"
+msgstr "Ei-kiinteä"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:68
+msgid "Solid"
+msgstr "Kiinteä"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:69
+msgid "Set physics:"
+msgstr "Aseta fysiikka:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:70
+msgid "Static"
+msgstr "Staattinen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:71
+msgid "Movable"
+msgstr "Siirrettävä"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:72
+msgid "Physical"
+msgstr "Fyysinen"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:74
+msgid "Set scale:"
+msgstr "Aseta skaala:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:76
+msgid "Set force:"
+msgstr "Aseta voima:"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:80
+msgid "Claim *"
+msgstr "Valtaa *"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:82
+msgid "* object info"
+msgstr "* esineen info"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:83
+msgid "* mesh info"
+msgstr "* mesh info"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:84
+msgid "* attachment info"
+msgstr "* liitosinfo"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:85
+msgid "Show help"
+msgstr "Näytä apu"
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.c:86
+msgid "* is the object you are facing"
+msgstr "* on esine jota katsot"
+
 #: qcsrc/menu/xonotic/dialog_settings.c:4
 msgid "Settings"
 msgstr "Asetukset"
@@ -1528,9 +1948,9 @@ 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_user.c:4
+msgid "User"
+msgstr "Käyttäjä"
 
 #: qcsrc/menu/xonotic/dialog_settings.c:23
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:4
@@ -1541,194 +1961,170 @@ msgstr "Sekalainen"
 msgid "Master:"
 msgstr "Pääkanava:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:35
 msgid "Music:"
 msgstr "Musiikki:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:45
 msgid "VOL^Ambient:"
 msgstr "VOL^Ympäristö:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:54
 msgid "Info:"
 msgstr "Tiedoitukset:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:63
 msgid "Items:"
 msgstr "Esineet:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:72
 msgid "Pain:"
 msgstr "Kipu:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
 msgid "Player:"
 msgstr "Pelaaja:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:90
 msgid "Shots:"
 msgstr "Laukaukset:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:99
 msgid "Voice:"
 msgstr "Puhe:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
 msgid "Weapons:"
 msgstr "Aseet:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+msgid "New style sound attenuation"
+msgstr "Uusi äänenvaimennustapa"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+msgid "Mute sounds when not active"
+msgstr "Mykistä äänet ikkunan ollessa passiivinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:194
 msgid "Frequency:"
 msgstr "Taajuus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
 msgid "8 kHz"
 msgstr "8 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:125
 msgid "11.025 kHz"
 msgstr "11.025 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:126
 msgid "16 kHz"
 msgstr "16 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "22.05 kHz"
 msgstr "22.05 Khz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
 msgid "24 kHz"
 msgstr "24 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:129
 msgid "32 kHz"
 msgstr "32 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:130
 msgid "44.1 kHz"
 msgstr "44.1 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "48 kHz"
 msgstr "48 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "Channels:"
 msgstr "Kanavat:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
 msgid "Mono"
 msgstr "Mono"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Stereo"
 msgstr "Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
 msgid "2.1"
 msgstr "2.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
 msgid "4"
 msgstr "4"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "5"
 msgstr "5"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "5.1"
 msgstr "5.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "6.1"
 msgstr "6.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "7.1"
 msgstr "7.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
 msgid "Swap Stereo"
 msgstr "Vaihda stereoäänilähteiden paikkaa"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
 msgid "Headphone friendly mode"
 msgstr "Kuulokeystävällinen tila"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
-msgid "Spatial voices:"
-msgstr "Tilanneäänet:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
-msgid "VOCS^None"
-msgstr "VOCS^Ei mitään"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
-msgid "VOCS^Taunts"
-msgstr "VOCS^Huudahdukset"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
-msgid "VOCS^All"
-msgstr "VOCS^Kaikki"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
-msgid "Taunt range:"
-msgstr "Huudahduksen kantama"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
-msgid "RNG^Very short"
-msgstr "RNG^Hyvin lyhyt"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
-msgid "RNG^Short"
-msgstr "RNG^Lyhyt"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
-msgid "RNG^Normal"
-msgstr "RNG^Normaali"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
-msgid "RNG^Long"
-msgstr "RNG^Pitkä"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+msgid "Hit indication sound"
+msgstr "Osumailmaisimen ääni"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
-msgid "RNG^Full"
-msgstr "RNG^Täysi"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:172
+msgid "Chat message sound"
+msgstr "Keskustelun piippausääni"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
-msgid "Automatic taunts"
-msgstr "Automaattiset huudahdukset"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:174
+msgid "Menu sounds"
+msgstr "Valikon äänet"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
-msgid "Time warning:"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:177
+msgid "Time announcer:"
 msgstr "Aikavaroitus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
-msgid "WRN^None"
-msgstr "WRN^Ei mitään"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:179
+msgid "WRN^Disabled"
+msgstr "WRN^Pois päältä"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:180
 msgid "1 minute"
 msgstr "1 minuutti"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:181
 msgid "5 minutes"
 msgstr "5 minuuttia"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:182
 msgid "WRN^Both"
 msgstr "WRN^Molemmat"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
-msgid "Hit indicator"
-msgstr "Osumailmaisin"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:189
+msgid "Automatic taunts"
+msgstr "Automaattiset huudahdukset"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
-msgid "Menu sounds"
-msgstr "Valikon äänet"
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:199
+msgid "Debug info about sounds"
+msgstr "Äänten debug info"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:38
 msgid "Quality preset:"
@@ -1791,230 +2187,226 @@ 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
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
 msgid "RES^Leet"
 msgstr "RES^Leet"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
 msgid "RES^Lowest"
 msgstr "RES^Matalin"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:67
+msgid "RES^Very low"
+msgstr "RES^Hyvin matala"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:68
 msgid "RES^Low"
 msgstr "RES^Matala"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:69
 msgid "RES^Normal"
 msgstr "RES^Normaali"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
 msgid "RES^Good"
 msgstr "RES^Hyvä"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:71
 msgid "RES^Best"
 msgstr "RES^Paras"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:84
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:87
 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:93
+msgid "Use lightmaps"
+msgstr "Käytä valaistuksia"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
-msgid "ANISO^Disabled"
-msgstr "ANISO^Pois päältä"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
+msgid "Deluxe mapping"
+msgstr "Pikselikohtainen valaistus"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
-msgid "8x"
-msgstr "8x"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:96
+msgid "Gloss"
+msgstr "Kiilto"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
+msgid "Particles quality:"
+msgstr "Partikkeleiden laatu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
+msgid "Particles distance:"
+msgstr "Partikkeleiden etäisyys:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:106
-msgid "16x"
-msgstr "16x"
+msgid "Damage effects:"
+msgstr "Vahinkoefektit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
-msgid "Particle quality:"
-msgstr "Kappaleiden laatu:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:108
+msgid "DMGPRTCLS^Disabled"
+msgstr "DMGPRTCLS^Pois"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:109
+msgid "DMGPRTCLS^Skeletal"
+msgstr "DMGPRTCLS^Luusto"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
-msgid "Particle distance:"
-msgstr "Kappaleiden etäisyys:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
+msgid "DMGPRTCLS^All"
+msgstr "DMGPRTCLS^Kaikki"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:114
 msgid "Decals"
 msgstr "Siirtokuvat"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:115
 msgid "Decals on models"
 msgstr "Hahmojen siirtokuvat"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:119
 msgid "Distance:"
 msgstr "Etäisyys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:125
 msgid "Time:"
 msgstr "Kesto:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
-msgid "Use lightmaps"
-msgstr "Käytä valaistuksia"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
-msgid "Deluxe mapping"
-msgstr "Pikselikohtainen valaistus"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
-msgid "Gloss"
-msgstr "Kiilto"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
-msgid "Offset mapping"
-msgstr "Korosta tekstuurien kuhmuja"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
-msgid "Relief mapping"
-msgstr "Tehokas tekstuurien kuhmujen korostus"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
-msgid "Reflections:"
-msgstr "Heijastukset:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
-msgid "Blurred"
-msgstr "Sumea"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
-msgid "REFL^Good"
-msgstr "REFL^Hyvä"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
-msgid "Sharp"
-msgstr "Terävä"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:131
+msgid "Coronas"
+msgstr "Valokehät"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
-msgid "Show surfaces"
-msgstr "Näytä pinnat"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+msgid "Use Occlusion Queries"
+msgstr "Käytä Occlusion Queryä"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "No dynamic lighting"
 msgstr "Ei dynaamista valaistusta"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
-msgid "Flash blend approximation"
-msgstr "Yksinkertaiset valot"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:136
+msgid "Fake corona lighting"
+msgstr "Valaistuksen valokehä"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
 msgid "Realtime dynamic lighting"
 msgstr "Reaaliaikainen dynaaminen valaitus"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:139
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
 msgid "Shadows"
 msgstr "Varjot"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Realtime world lighting"
 msgstr "Reaaliaikainen ympäristön valaistus"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
 msgid "Use normal maps"
 msgstr "Käytä tekstuurien suunnattua varjostamista"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "Soft shadows"
 msgstr "Pehmeät varjot"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
-msgid "Coronas"
-msgstr "Valokehät"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+msgid "Show surfaces"
+msgstr "Näytä pinnat"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
-msgid "Use Occlusion Queries"
-msgstr "Käytä Occlusion Queryä"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+msgid "Offset mapping"
+msgstr "Korosta tekstuurien kuhmuja"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+msgid "Relief mapping"
+msgstr "Tehokas tekstuurien kuhmujen korostus"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+msgid "LOD"
+msgstr "Yksityiskohtaisuus"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
 msgid "Bloom"
 msgstr "Hehku"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
-msgid "High Dynamic Range (HDR)"
-msgstr "HDR"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+msgid "Reflections:"
+msgstr "Heijastukset:"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:167
+msgid "Blurred"
+msgstr "Sumea"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+msgid "REFL^Good"
+msgstr "REFL^Hyvä"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:169
+msgid "Sharp"
+msgstr "Terävä"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
 msgid "Motion blur:"
 msgstr "Liikesumeus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
-msgid "Blur and sharpen postprocessing"
-msgstr "Sumenna ja terävöitä jälkikäsittelyä"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:179
+msgid "Extra postprocessing effects"
+msgstr "Ylimääräiset jälkikäsittelyefektit"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Näppäimet:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+#: qcsrc/menu/xonotic/dialog_settings_input.c:30
 msgid "Change key..."
 msgstr "Vaihda näppäin..."
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+#: qcsrc/menu/xonotic/dialog_settings_input.c:34
 msgid "Edit..."
 msgstr "Muokkaa..."
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:46
-msgid "Sensitivity:"
-msgstr "Herkkyys:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:45
+msgid "Pressing \"enter console\" key also closes it"
+msgstr "\"avaa komentorivi\" myös sulkee komentorivin"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:47
+msgid "Automatically repeat jumping if holding jump"
+msgstr "Hyppää automaattisesti uudestaan pitämällä hyppynappi painettuna"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:51
-msgid "UI mouse speed:"
-msgstr "Käyttöliittymän hiiren nopeus:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:53
+#: qcsrc/menu/xonotic/dialog_settings_input.c:56
+msgid "Use joystick input"
+msgstr "Käytä peliohjainta"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:55
-msgid "Mouse filter"
-msgstr "Hiiren suodatin"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:61
+msgid "Mouse:"
+msgstr "Hiiri:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-msgid "Invert mouse"
-msgstr "Käännä hiiren suunta"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+msgid "Sensitivity:"
+msgstr "Herkkyys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:60
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-msgid "Use joystick input"
-msgstr "Käytä peliohjainta"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:68
+msgid "Smooth aiming"
+msgstr "Tähtäyksen pehmennys"
+
+#: qcsrc/menu/xonotic/dialog_settings_input.c:71
+msgid "Invert aiming"
+msgstr "Käännä hiiren suunta"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:65
-#: qcsrc/menu/xonotic/dialog_settings_input.c:67
-msgid "Turn off OS mouse acceleration"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:75
+#: qcsrc/menu/xonotic/dialog_settings_input.c:77
+#: qcsrc/menu/xonotic/dialog_settings_input.c:80
+msgid "Disable system mouse acceleration"
 msgstr "Laita käyttöjärjestelmän hiiren kiihtyvyys pois päältä"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:69
-msgid "\"enter console\" also closes"
-msgstr "\"avaa komentorivi\" myös sulkee komentorivin"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:85
+msgid "Enable built in mouse acceleration"
+msgstr "Laita käyttöjärjestelmän hiiren kiihtyvyys päälle"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
 msgid "User defined key bind"
@@ -2037,96 +2429,261 @@ msgid "Cancel"
 msgstr "Peruuta"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:26
-msgid "Menu skins:"
-msgstr "Päävalikon ulkoasu:"
+msgid "Network:"
+msgstr "Verkko:"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
-msgid "Show current time"
-msgstr "Näytä nykyinen kellonaika"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:31
+msgid "56k"
+msgstr "56k"
 
-#: 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:32
+msgid "ISDN"
+msgstr "ISDN"
 
-#: 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:33
+msgid "Slow ADSL"
+msgstr "Hidas ASL"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Minimize input latency"
-msgstr "Minimoi syötteen viive"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:34
+msgid "Fast ADSL"
+msgstr "Nopea ADSL"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
-msgid "Advanced settings"
-msgstr "Edistyneet asetukset"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+msgid "Broadband"
+msgstr "Laajakaista"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
-msgid "Cvar filter:"
-msgstr "Cvar suodatin"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:39
+msgid "Input packets/s:"
+msgstr "Vastaanottopaketit /s:"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
-msgid "Setting:"
-msgstr "Asetus:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:45
+msgid "Local latency:"
+msgstr "Paikallinen viive"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
-msgid "Value:"
-msgstr "Arvo:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:50
+msgid "Client UDP port:"
+msgstr "Asiakkaan UDP portti"
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
-msgid "Description:"
-msgstr "Kuvaus:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:55
+msgid "Show netgraph"
+msgstr "Näytä verkkograafi"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:59
 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_misc.c:62
+msgid "Movement error compensation"
+msgstr "Liikkeen virhekompensaatio"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:33
-msgid "Network speed:"
-msgstr "Verkon nopeus:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
+msgid "Downloads:"
+msgstr "Lataukset:"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:35
-msgid "56k"
-msgstr "56k"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:69
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:81
+msgid "Maximum:"
+msgstr "Maksimi:"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:36
-msgid "ISDN"
-msgstr "ISDN"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:73
+msgid "Speed (kB/s):"
+msgstr "Nopeus (kb/s)"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:37
-msgid "Slow ADSL"
-msgstr "Hidas ASL"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:78
+msgid "Framerate:"
+msgstr "Ruudunpäivitysnopeus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:38
-msgid "Fast ADSL"
-msgstr "Nopea ADSL"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:83
+msgid "MAXFPS^5 fps"
+msgstr "MAXFPS^5 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:39
-msgid "Broadband"
-msgstr "Laajakaista"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+msgid "MAXFPS^10 fps"
+msgstr "MAXFPS^10 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:42
-msgid "Input packets/s:"
-msgstr "Vastaanottopaketit /s:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:85
+msgid "MAXFPS^20 fps"
+msgstr "MAXFPS^20 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:46
-msgid "HTTP downloads:"
-msgstr "HTTP lataukset:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:86
+msgid "MAXFPS^30 fps"
+msgstr "MAXFPS^30 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:49
-msgid "Downloads:"
-msgstr "Lataukset:"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:87
+msgid "MAXFPS^40 fps"
+msgstr "MAXFPS^40 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:53
-msgid "Speed (kB/s):"
-msgstr "Nopeus (kb/s)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:88
+msgid "MAXFPS^50 fps"
+msgstr "MAXFPS^50 fps "
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:57
-msgid "Client UDP port:"
-msgstr "Asiakkaan UDP portti"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:89
+msgid "MAXFPS^60 fps"
+msgstr "MAXFPS^60 fps "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:90
+msgid "MAXFPS^70 fps"
+msgstr "MAXFPS^70 fps "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:91
+msgid "MAXFPS^100 fps"
+msgstr "MAXFPS^100 fps "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:92
+msgid "MAXFPS^125 fps"
+msgstr "MAXFPS^125 fps "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:93
+msgid "MAXFPS^200 fps"
+msgstr "MAXFPS^200 fps "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:94
+msgid "MAXFPS^Unlimited"
+msgstr "MAXFPS^Rajaton "
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:98
+msgid "Target:"
+msgstr "Kohde:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:100
+msgid "TRGT^Disabled"
+msgstr "TRGT^Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:101
+msgid "TRGT^30 fps"
+msgstr "TRGT^30 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:102
+msgid "TRGT^40 fps"
+msgstr "TRGT^40 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:103
+msgid "TRGT^50 fps"
+msgstr "TRGT^50 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:104
+msgid "TRGT^60 fps"
+msgstr "TRGT^60 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:105
+msgid "TRGT^100 fps"
+msgstr "TRGT^100 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:106
+msgid "TRGT^125 fps"
+msgstr "TRGT^125 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:107
+msgid "TRGT^200 fps"
+msgstr "TRGT^200 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:111
+msgid "Idle limit:"
+msgstr "Aikaraja"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:113
+msgid "IDLFPS^10 fps"
+msgstr "IDLFPS^10 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:114
+msgid "IDLFPS^20 fps"
+msgstr "IDLFPS^20 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:115
+msgid "IDLFPS^30 fps"
+msgstr "IDLFPS^30 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:116
+msgid "IDLFPS^60 fps"
+msgstr "IDLFPS^60 fps"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:117
+msgid "IDLFPS^Unlimited"
+msgstr "IDLFPS^Rajaton"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:122
+msgid "Show frames per second"
+msgstr "Näytä ruudunpäivitysnopeus (FPS)"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:125
+msgid "Save processing time for other apps"
+msgstr "Jätä laskenta-aikaa muille sovelluksille"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:129
+msgid "Menu tooltips:"
+msgstr "Päävalikon työkaluvihjeet:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:131
+msgid "TLTIP^Disabled"
+msgstr "TLTIP^Pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:132
+msgid "TLTIP^Standard"
+msgstr "TLTIP^Vakio"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:133
+msgid "TLTIP^Advanced"
+msgstr "TLTIP^Kehittynyt"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:137
+msgid "Show current time"
+msgstr "Näytä nykyinen kellonaika"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:139
+msgid "Show current date"
+msgstr "Näytä nykyinen päivämäärä"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:141
+msgid "Enable developer mode"
+msgstr "Ota kehittäjätila käyttöön"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
+msgstr "Edistyneet asetukset"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:31
+msgid "Cvar filter:"
+msgstr "Cvar suodatin"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:44
+msgid "Setting:"
+msgstr "Asetus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:48
+msgid "Type:"
+msgstr "Tyyppi:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:52
+msgid "Value:"
+msgstr "Arvo:"
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:68
+msgid "Description:"
+msgstr "Kuvaus:"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:27
+msgid "Menu skins:"
+msgstr "Päävalikon ulkoasu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:31
+msgid "Set skin"
+msgstr "Aseta ulkoasu:"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:74
+msgid "Set language"
+msgstr "Tekstin kieli:"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:79
+msgid "Disable gore effects and harsh language"
+msgstr "Ota ylimitoitettu raakuus ja karski kieli pois käytöstä"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:82
+msgid "Allow player statistics to track your client"
+msgstr "Salli pelaajatilastojen seuraavan peliasennustasi"
+
+#: qcsrc/menu/xonotic/dialog_settings_user.c:84
+msgid "Allow player statistics to use your nickname"
+msgstr "Salli pelaajatilastojen käyttävän pelinimeäsi"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:26
 msgid "Resolution:"
@@ -2176,103 +2733,173 @@ msgstr "SZ^Massiivinen"
 msgid "Color depth:"
 msgstr "Värisävy:"
 
+#: qcsrc/menu/xonotic/dialog_settings_video.c:44
+msgid "16bit"
+msgstr "16 bittinen"
+
 #: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "32bit"
+msgstr "32 bittinen"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:48
 msgid "Full screen"
 msgstr "Kokoruutu"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
 msgid "Vertical Synchronization"
 msgstr "Pystytahdistus (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:53
+msgid "Anisotropy:"
+msgstr "Anisotropia:"
 
-#: 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:55
+msgid "ANISO^Disabled"
+msgstr "ANISO^Pois päältä"
 
 #: 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:66
+msgid "2x"
+msgstr "2x"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:57
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "4x"
+msgstr "4x"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:58
+msgid "8x"
+msgstr "8x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:59
-msgid "VBO^Off"
-msgstr "VBO^Pois"
+msgid "16x"
+msgstr "16x"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:60
-msgid "Vertices, some Tris (compatible)"
-msgstr "Verteksit, vähän kolmioita (yhteensopivin)"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:62
+msgid "Antialiasing:"
+msgstr "Reunojenpehmennys (Antialiasing):"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:63
-msgid "Vertices"
-msgstr "Verteksit"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:65
+msgid "AA^Disabled"
+msgstr "AA^Pois päältä"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:64
-msgid "Vertices and Triangles"
-msgstr "Verteksit ja kolmiot"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "High-quality frame buffer"
+msgstr "Korkeanlaatuinen kehyspuskuri"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+#: qcsrc/menu/xonotic/dialog_settings_video.c:76
 msgid "Depth first:"
 msgstr "Syvyyssuuntainen renderöinti:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+#: qcsrc/menu/xonotic/dialog_settings_video.c:78
 msgid "DF^Disabled"
 msgstr "DF^Pois"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+#: qcsrc/menu/xonotic/dialog_settings_video.c:79
 msgid "DF^World"
 msgstr "DF^Maailma"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
 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:83
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr "Vertex Buffer Object (VBO)"
 
-#: 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:86
+msgid "VBO^Off"
+msgstr "VBO^Pois"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+#: qcsrc/menu/xonotic/dialog_settings_video.c:87
+msgid "Vertices, some Tris (compatible)"
+msgstr "Verteksit, vähän kolmioita (yhteensopivin)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:90
+msgid "Vertices"
+msgstr "Verteksit"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+msgid "Vertices and Triangles"
+msgstr "Verteksit ja kolmiot"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:94
 msgid "Brightness:"
 msgstr "Kirkkaus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+#: qcsrc/menu/xonotic/dialog_settings_video.c:97
 msgid "Contrast:"
 msgstr "Kontrasti:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+#: qcsrc/menu/xonotic/dialog_settings_video.c:100
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Contrast boost:"
 msgstr "Kontrastin lisäys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:96
+#: qcsrc/menu/xonotic/dialog_settings_video.c:110
 msgid "Saturation:"
 msgstr "Kylläisyys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:102
+#: qcsrc/menu/xonotic/dialog_settings_video.c:116
 msgid "LIT^Ambient:"
 msgstr "LIT^Ympäristö:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:119
 msgid "Intensity:"
 msgstr "Intensiivisyys:"
 
+#: qcsrc/menu/xonotic/dialog_settings_video.c:123
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr "Käytä OpenGL 2.0 shaders-varjostuksia (GLSL)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:125
+msgid "Use GLSL to handle color control"
+msgstr "Käytä GLSL:ää värien hallinnassa"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:128
+msgid "Wait for GPU to finish each frame"
+msgstr "Anna näytönohjaimen viimeistellä jokainen ruutu"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:132
+msgid "Psycho coloring (easter egg)"
+msgstr "Psyko-väritys (easter egg)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:135
+msgid "Trippy vertices (easter egg)"
+msgstr "Oudot kärjet (easter egg)"
+
+#: qcsrc/menu/xonotic/dialog_settings_video.c:138
+msgid "Flip view horizontally"
+msgstr "Käännä näkymä horisontaalisesti"
+
 #: qcsrc/menu/xonotic/dialog_singleplayer.c:4
 msgid "Singleplayer"
 msgstr "Yksinpeli"
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:127
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:116
 msgid "Instant action! (random map with bots)"
 msgstr "Suoraan taisteluun! (satunnainen kartta bottien kera)"
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:148
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:137
+msgid "Campaign Difficulty:"
+msgstr "Kampanjan Vaikeusaste:"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:138
+msgid "CSKL^Easy"
+msgstr "CSKL^Helppo"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:139
+msgid "CSKL^Medium"
+msgstr "CSKL^Keskikokoinen"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:140
+msgid "CSKL^Hard"
+msgstr "CSKL^Vaikea"
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:142
 msgid "Start Singleplayer!"
 msgstr "Aloita yksinpeli!"
 
@@ -2308,23 +2935,23 @@ msgstr "pinkki"
 msgid "spectate"
 msgstr "seuraa sivusta"
 
-#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+#: qcsrc/menu/xonotic/mainwindow.c:39 qcsrc/menu/xonotic/mainwindow.c:42
 msgid "Do not press this button again!"
 msgstr "Älä paina enää näppäintä!"
 
-#: qcsrc/menu/xonotic/maplist.c:278
+#: qcsrc/menu/xonotic/maplist.c:282
 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
+#: qcsrc/menu/xonotic/maplist.c:290
 #, c-format
 msgid "%s's Xonotic Server"
 msgstr "%s Xonotic-palvelin"
 
-#: qcsrc/menu/xonotic/maplist.c:291
+#: qcsrc/menu/xonotic/maplist.c:295
 msgid ""
 "Huh? Can't play this (invalid game type). Refiltering so this won't happen "
 "again.\n"
@@ -2332,7 +2959,11 @@ msgstr ""
 "Höh? Tätä ei voida pelata (epäkelpo pelityyppi). Uudelleensuodatetaan jottei "
 "vastaava enää toistuisi.\n"
 
-#: qcsrc/menu/xonotic/playermodel.c:174
+#: qcsrc/menu/xonotic/playerlist.c:118 qcsrc/menu/xonotic/playerlist.c:128
+msgid "spectator"
+msgstr "katsoja"
+
+#: qcsrc/menu/xonotic/playermodel.c:177
 msgid "<no model found>"
 msgstr "<mallia ei löytynyt>"
 
@@ -2344,23 +2975,23 @@ msgstr "Poista"
 msgid "Bookmark"
 msgstr "Kirjanmerkki"
 
-#: qcsrc/menu/xonotic/serverlist.c:527
+#: qcsrc/menu/xonotic/serverlist.c:548
 msgid "Ping"
 msgstr "Viive"
 
-#: qcsrc/menu/xonotic/serverlist.c:528
+#: qcsrc/menu/xonotic/serverlist.c:549
 msgid "Host name"
 msgstr "Palvelimen nimi"
 
-#: qcsrc/menu/xonotic/serverlist.c:529
+#: qcsrc/menu/xonotic/serverlist.c:550
 msgid "Map"
 msgstr "Kartta"
 
-#: qcsrc/menu/xonotic/serverlist.c:530
+#: qcsrc/menu/xonotic/serverlist.c:551
 msgid "Type"
 msgstr "Tyyppi"
 
-#: qcsrc/menu/xonotic/serverlist.c:531
+#: qcsrc/menu/xonotic/serverlist.c:552
 msgid "Players"
 msgstr "Pelaajat"
 
@@ -2390,25 +3021,25 @@ msgstr "%s dB"
 msgid "%dx%d"
 msgstr "%dx%d"
 
-#: qcsrc/menu/xonotic/util.qc:270
+#: qcsrc/menu/xonotic/util.qc:276
 #, 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
+#: qcsrc/menu/xonotic/util.qc:291
 #, 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
+#: qcsrc/menu/xonotic/util.qc:296
 msgid "error: received HTML instead of an update notification\n"
 msgstr "virhe: vastaanotettiin HTML päivitystiedotteen asemesta\n"
 
-#: qcsrc/menu/xonotic/util.qc:295
+#: qcsrc/menu/xonotic/util.qc:301
 msgid "error: received carriage returns from update notification server\n"
 msgstr "virhe: vastaanotettiin tyhjää dataa päivitystiedotepalvelimelta\n"
 
-#: qcsrc/menu/xonotic/util.qc:316
+#: qcsrc/menu/xonotic/util.qc:322
 #, c-format
 msgid ""
 "Update can be downloaded at:\n"
@@ -2417,22 +3048,22 @@ msgstr ""
 "Päivitys on ladattavissa:\n"
 "%s\n"
 
-#: qcsrc/menu/xonotic/util.qc:337
+#: qcsrc/menu/xonotic/util.qc:351
 msgid "Autogenerating mapinfo for newly added maps..."
 msgstr ""
 "Luodaan automaattisesti karttatietoja vastikään lisätyille kartoille..."
 
-#: qcsrc/menu/xonotic/util.qc:367
+#: qcsrc/menu/xonotic/util.qc:381
 #, c-format
 msgid "^1%s TEST BUILD"
 msgstr "^1%s TESTIVERSIO"
 
-#: qcsrc/menu/xonotic/util.qc:432
+#: qcsrc/menu/xonotic/util.qc:439
 #, c-format
 msgid "Update to %s now!"
 msgstr "Päivitä versioon %s nyt!"
 
-#: qcsrc/menu/xonotic/util.qc:501
+#: qcsrc/menu/xonotic/util.qc:524
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2440,444 +3071,358 @@ msgstr ""
 "^1VIRHE: Tekstuurien pakkaus vaaditaan mutta ei ole tuettuna.\n"
 "^1Grafiikkavirheitä odotettavissa.\n"
 
-#: qcsrc/menu/xonotic/util.qc:523
-msgid "Arena"
-msgstr "Areena (Arena)"
+#: qcsrc/menu/xonotic/util.qc:643
+msgid "Use default"
+msgstr "Käytä perusasetusta"
 
-#: qcsrc/menu/xonotic/util.qc:524
-msgid "Assault"
-msgstr "Rynnäkkö (Assault)"
+#: qcsrc/menu/xonotic/util.qc:663
+msgid "Team Color:"
+msgstr "Joukkueen väri"
 
-#: qcsrc/menu/xonotic/util.qc:525
-msgid "Capture The Flag"
-msgstr "Lipunryöstö (CTF)"
+#: qcsrc/menu/xonotic/util.qh:50
+msgid "Enable panel"
+msgstr "Ota paneeli käyttöön"
 
-#: qcsrc/menu/xonotic/util.qc:526
-msgid "Clan Arena"
-msgstr "Klaaniareena (Clan Arena)"
+#: weapons.qc.tmp:1
+msgid "Rifle"
+msgstr "Rifle"
 
-#: qcsrc/menu/xonotic/util.qc:527
-msgid "Deathmatch"
-msgstr "Mättö (Deathmatch)"
+#: weapons.qc.tmp:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
 
-#: qcsrc/menu/xonotic/util.qc:528
-msgid "Domination"
-msgstr "Hallinta (Domination)"
+#: weapons.qc.tmp:3
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
 
-#: qcsrc/menu/xonotic/util.qc:529
-msgid "Freeze Tag"
-msgstr "Pakkashippa (Freeze Tag)"
+#: weapons.qc.tmp:4
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
 
-#: qcsrc/menu/xonotic/util.qc:530
-msgid "Keepaway"
-msgstr "Pakomatka (Keepaway)"
+#: weapons.qc.tmp:5
+msgid "Grappling Hook"
+msgstr "Grabbling Hook"
 
-#: qcsrc/menu/xonotic/util.qc:531
-msgid "Key Hunt"
-msgstr "Avaimenetsintä (Key Hunt)"
+#: weapons.qc.tmp:6
+msgid "Electro"
+msgstr "Electro"
 
-#: qcsrc/menu/xonotic/util.qc:532
-msgid "Last Man Standing"
-msgstr "Viimeiseen mieheen (Last Man Standing)"
+#: weapons.qc.tmp:7
+msgid "Laser"
+msgstr "Laser"
 
-#: qcsrc/menu/xonotic/util.qc:533
-msgid "Nexball"
-msgstr "Nexpallo (Nexball)"
+#: weapons.qc.tmp:8
+msgid "Shotgun"
+msgstr "Shotgun"
 
-#: qcsrc/menu/xonotic/util.qc:534
-msgid "Onslaught"
-msgstr "Suurtaistelu (Onslaught)"
+#: weapons.qc.tmp:9
+#, c-format
+msgid "@!#%'n Tuba"
+msgstr "@!#% tuuba"
 
-#: qcsrc/menu/xonotic/util.qc:535
-msgid "Race"
-msgstr "Kilpailu (RACE)"
+#: weapons.qc.tmp:10
+msgid "MinstaNex"
+msgstr "MinstaNex"
 
-#: qcsrc/menu/xonotic/util.qc:536
-msgid "Race CTS"
-msgstr "Kilpailu CTS (RACE CTS)"
+#: weapons.qc.tmp:11
+msgid "Crylink"
+msgstr "Crylink"
 
-#: qcsrc/menu/xonotic/util.qc:537
-msgid "Runematch"
-msgstr "Riimu-ottelu (Runematch)"
+#: weapons.qc.tmp:12
+msgid "Heavy Laser Assault Cannon"
+msgstr "HLAC"
 
-#: qcsrc/menu/xonotic/util.qc:538
-msgid "Team Deathmatch"
-msgstr "Joukkuemättö (Team Deatchmatch)"
+#: weapons.qc.tmp:13
+msgid "Mortar"
+msgstr "Mortar"
 
-#: qcsrc/menu/xonotic/util.qc:557
-#, c-format
-msgid "@!#%'n Tuba Throwing"
-msgstr "@!#% tuubanheitto!"
+#: weapons.qc.tmp:14
+msgid "Hagar"
+msgstr "Hagar"
 
-#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
-#: qcsrc/menu/xonotic/util.qc:622
-msgid "Default"
-msgstr "Perusasetus"
+#: weapons.qc.tmp:15
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
 
-#: qcsrc/menu/xonotic/util.qc:588
-msgid "Use default"
-msgstr "Käytä perusasetusta"
+#: weapons.qc.tmp:16
+msgid "Fireball"
+msgstr "Fireball"
 
-#: qcsrc/menu/xonotic/util.qc:608
-msgid "Team Color:"
-msgstr "Joukkueen väri"
+#: weapons.qc.tmp:17
+msgid "Mine Layer"
+msgstr "Mine Layer"
 
-#: qcsrc/menu/xonotic/util.qh:47
-msgid "Enable panel"
-msgstr "Ota paneeli käyttöön"
+#: weapons.qc.tmp:18
+msgid "Nex"
+msgstr "Nex"
 
-#: qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
-msgstr "Crylink"
+#~ msgid "%d/%d, %d free player slots"
+#~ msgstr "%d/%d, %d vapaata pelaajapaikkaa"
 
-#: qcsrc/server/w_crylink.qc:666
-#, c-format
-msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr "%s hautoi itsetuhoisia ajatuksia Crylink kädessä"
+#~ msgid "Gameplay:"
+#~ msgstr "Pelitila:"
 
-#: qcsrc/server/w_crylink.qc:671
-#, c-format
-msgid "%s could not hide from %s's Crylink"
-msgstr "%s ei kyennyt pakenemaan pelaajan %s Crylinkkiä"
+#~ msgid "Ping:"
+#~ msgstr "Viive:"
 
-#: qcsrc/server/w_crylink.qc:673
-#, c-format
-msgid "%s was too close to %s's Crylink"
-msgstr "%s oli liian lähellä pelaajan %s ampumarataa"
+#~ msgid "CA:"
+#~ msgstr "CA:"
 
-#: qcsrc/server/w_crylink.qc:675
-#, c-format
-msgid "%s took a close look at %s's Crylink"
-msgstr "%s pääsi tutustumaan lähemmin pelaajan %s kauniiseen Crylinkkiin"
+#~ msgid "View bobbing:"
+#~ msgstr "Näytä huojunta:"
 
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr "Electro"
+#~ msgid "Zoom speed:"
+#~ msgstr "Tarkennuksen nopeus:"
 
-#: qcsrc/server/w_electro.qc:574
-#, c-format
-msgid "%s could not remember where they put plasma"
-msgstr "%s ei sattunut muistamaan minne se plasma oikein kuuluikaan"
+#~ msgid "Weapon settings..."
+#~ msgstr "Aseiden asetukset..."
 
-#: qcsrc/server/w_electro.qc:576
-#, c-format
-msgid "%s played with plasma"
-msgstr "%s leikki plasmalla, ei hyvä"
+#~ msgid "Size:"
+#~ msgstr "Koko:"
 
-#: qcsrc/server/w_electro.qc:583
-#, c-format
-msgid "%s just noticed %s's blue ball"
-msgstr "%s näki pelaajan %s sinisen pallon"
+#~ msgid "HTST^None"
+#~ msgstr "HTST^Ei mitään."
 
-#: qcsrc/server/w_electro.qc:585
-#, c-format
-msgid "%s got in touch with %s's blue ball"
-msgstr "%s pääsi tutustumaan pelaajan %s siniseen palloon"
+#~ msgid "Waypoints setup..."
+#~ msgstr "Välimatkojen asetukset..."
 
-#: qcsrc/server/w_electro.qc:590
-#, c-format
-msgid "%s felt the electrifying air of %s's combo"
-msgstr "%s tunsi sähköä ilmassa pelaajan %s tulituksen jälkeen"
+#~ msgid "Waypoint scale:"
+#~ msgstr "Välietappien skaala:"
 
-#: qcsrc/server/w_electro.qc:592
-#, c-format
-msgid "%s got too close to %s's blue beam"
-msgstr "%s joutui liian lähelle pelaajan %s sinistä sädettä"
+#~ msgid "Show names:"
+#~ msgstr "Näytä nimet:"
 
-#: qcsrc/server/w_electro.qc:594
-#, c-format
-msgid "%s was blasted by %s's blue beam"
-msgstr "%s posahti pelaajan %s siniseen säteeseen"
+#~ msgid "Teammates"
+#~ msgstr "Oma joukkue"
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
-msgstr "Fireball"
+#~ msgid "All players"
+#~ msgstr "Kaikki pelaajat"
 
-#: qcsrc/server/w_fireball.qc:417
-#, c-format
-msgid "%s forgot about some firemine"
-msgstr "%s unohti tulimiinansa"
+#~ msgid "Spatial voices:"
+#~ msgstr "Tilanneäänet:"
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
-msgstr "%s olisi pitänyt käyttää pienempää asetta"
+#~ msgid "VOCS^None"
+#~ msgstr "VOCS^Ei mitään"
 
-#: qcsrc/server/w_fireball.qc:426
-#, c-format
-msgid "%s tried to catch %s's firemine"
-msgstr "%s koetti napata pelaajan %s tulimiinan"
+#~ msgid "VOCS^Taunts"
+#~ msgstr "VOCS^Huudahdukset"
 
-#: qcsrc/server/w_fireball.qc:428
-#, c-format
-msgid "%s fatefully ignored %s's firemine"
-msgstr "%s kohtalokkaasti tutustui pelaajan %s tulimiinaan"
+#~ msgid "VOCS^All"
+#~ msgstr "VOCS^Kaikki"
 
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
-msgstr "%s ei kyennyt pakenemaan pelaajan %s tulipalloa"
+#~ msgid "Taunt range:"
+#~ msgstr "Huudahduksen kantama"
 
-#: qcsrc/server/w_fireball.qc:437
-#, c-format
-msgid "%s saw the pretty lights of %s's fireball"
-msgstr "&s näki kauniita valoja pelaajan %s tulipallosta"
+#~ msgid "RNG^Very short"
+#~ msgstr "RNG^Hyvin lyhyt"
 
-#: qcsrc/server/w_fireball.qc:440
-#, c-format
-msgid "%s got too close to %s's fireball"
-msgstr "%s joutui turhan lähelle pelaajan %s tulipalloa"
+#~ msgid "RNG^Short"
+#~ msgstr "RNG^Lyhyt"
 
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
-msgstr "%s maistoi pelaajan %s tulipalloa"
+#~ msgid "RNG^Normal"
+#~ msgstr "RNG^Normaali"
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
+#~ msgid "RNG^Long"
+#~ msgstr "RNG^Pitkä"
 
-#: qcsrc/server/w_grenadelauncher.qc:383
-#, c-format
-msgid "%s tried out his own grenade"
-msgstr "%s testasi räjähtääkö oma kranaatti"
+#~ msgid "RNG^Full"
+#~ msgstr "RNG^Täysi"
 
-#: qcsrc/server/w_grenadelauncher.qc:385
-#, c-format
-msgid "%s detonated"
-msgstr "%s pössähti"
+#~ msgid "WRN^None"
+#~ msgstr "WRN^Ei mitään"
 
-#: qcsrc/server/w_grenadelauncher.qc:391
-#, c-format
-msgid "%s didn't see %s's grenade"
-msgstr "%s ei nähnyt pelaajan %s kranaattia"
+#~ msgid "Flash blend approximation"
+#~ msgstr "Yksinkertaiset valot"
 
-#: qcsrc/server/w_grenadelauncher.qc:393
-#, c-format
-msgid "%s almost dodged %s's grenade"
-msgstr "%s väisti melkein pelaajan %s kranaatin"
+#~ msgid "High Dynamic Range (HDR)"
+#~ msgstr "HDR"
 
-#: qcsrc/server/w_grenadelauncher.qc:395
-#, c-format
-msgid "%s ate %s's grenade"
-msgstr "%s söi pelaajan %s kranaatin"
+#~ msgid "Blur and sharpen postprocessing"
+#~ msgstr "Sumenna ja terävöitä jälkikäsittelyä"
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
+#~ msgid "UI mouse speed:"
+#~ msgstr "Käyttöliittymän hiiren nopeus:"
 
-#: qcsrc/server/w_hagar.qc:395 qcsrc/server/w_seeker.qc:655
-#, c-format
-msgid "%s played with tiny rockets"
-msgstr "%s leikki pienien rakettien kanssa"
+#~ msgid "Mouse filter"
+#~ msgstr "Hiiren suodatin"
 
-#: qcsrc/server/w_hagar.qc:399
-#, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr "%s toivoi ettei pelaajan %s raketit olisi kimmonneet"
+#~ msgid "Minimize input latency"
+#~ msgstr "Minimoi syötteen viive"
 
-#: qcsrc/server/w_hagar.qc:401 qcsrc/server/w_seeker.qc:661
-#, c-format
-msgid "%s was pummeled by %s"
-msgstr "%s joutui pelaajan %s nuijimaksi"
+#~ msgid "Network speed:"
+#~ msgstr "Verkon nopeus:"
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
-msgstr "HLAC"
+#~ msgid "HTTP downloads:"
+#~ msgstr "HTTP lataukset:"
 
-#: qcsrc/server/w_hlac.qc:242
-#, c-format
-msgid "%s was cut down by %s"
-msgstr "%s joutui pelaajan %s niittämäksi"
+#~ msgid "Disable multithreaded OpenGL"
+#~ msgstr "Ota monisäkeinen OpenGL pois päältä"
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
-msgstr "Grabbling Hook"
+#~ msgid "%s succeeded at self-destructing themself with the Crylink"
+#~ msgstr "%s hautoi itsetuhoisia ajatuksia Crylink kädessä"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
-#, c-format
-msgid "%s did the impossible"
-msgstr "%s teki mahdottomat"
+#~ msgid "%s could not hide from %s's Crylink"
+#~ msgstr "%s ei kyennyt pakenemaan pelaajan %s Crylinkkiä"
 
-#: qcsrc/server/w_hook.qc:268
-#, c-format
-msgid "%s has run into %s's gravity bomb"
-msgstr "%s juoksi pelaajan %s pommiin"
+#~ msgid "%s was too close to %s's Crylink"
+#~ msgstr "%s oli liian lähellä pelaajan %s ampumarataa"
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
+#~ msgid "%s took a close look at %s's Crylink"
+#~ msgstr "%s pääsi tutustumaan lähemmin pelaajan %s kauniiseen Crylinkkiin"
 
-#: qcsrc/server/w_laser.qc:311
-#, c-format
-msgid "%s lasered themself to hell"
-msgstr "%s lähetti itsensä laserilla helvettiin"
+#~ msgid "%s could not remember where they put plasma"
+#~ msgstr "%s ei sattunut muistamaan minne se plasma oikein kuuluikaan"
 
-#: qcsrc/server/w_laser.qc:315
-#, c-format
-msgid "%s was cut in half by %s's gauntlet"
-msgstr "%s leikkaantui kahtia pelaajan %s taisteluhansikkaaseen"
+#~ msgid "%s played with plasma"
+#~ msgstr "%s leikki plasmalla, ei hyvä"
 
-#: qcsrc/server/w_laser.qc:317
-#, c-format
-msgid "%s was lasered to death by %s"
-msgstr "%s kuoli pelaajan %s laseriin"
+#~ msgid "%s just noticed %s's blue ball"
+#~ msgstr "%s näki pelaajan %s sinisen pallon"
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
+#~ msgid "%s got in touch with %s's blue ball"
+#~ msgstr "%s pääsi tutustumaan pelaajan %s siniseen palloon"
 
-#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
-#, c-format
-msgid "%s exploded"
-msgstr "%s räjähti"
+#~ msgid "%s felt the electrifying air of %s's combo"
+#~ msgstr "%s tunsi sähköä ilmassa pelaajan %s tulituksen jälkeen"
 
-#: qcsrc/server/w_minelayer.qc:527
-#, c-format
-msgid "%s got too close to %s's mine"
-msgstr "%s joutui liian lähelle pelaajan %s miinaa"
+#~ msgid "%s got too close to %s's blue beam"
+#~ msgstr "%s joutui liian lähelle pelaajan %s sinistä sädettä"
 
-#: qcsrc/server/w_minelayer.qc:529
-#, c-format
-msgid "%s almost dodged %s's mine"
-msgstr "%s miltein väisti pelaajan %s miinan"
+#~ msgid "%s was blasted by %s's blue beam"
+#~ msgstr "%s posahti pelaajan %s siniseen säteeseen"
 
-#: qcsrc/server/w_minelayer.qc:531
-#, c-format
-msgid "%s stepped on %s's mine"
-msgstr "%s astui pelaajan %s miinaan"
+#~ msgid "%s forgot about some firemine"
+#~ msgstr "%s unohti tulimiinansa"
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
-msgstr "MinstaNex"
+#~ msgid "%s should have used a smaller gun"
+#~ msgstr "%s olisi pitänyt käyttää pienempää asetta"
 
-#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
-#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
-#, c-format
-msgid "%s is now thinking with portals"
-msgstr "%s kokee portaalit"
+#~ msgid "%s tried to catch %s's firemine"
+#~ msgstr "%s koetti napata pelaajan %s tulimiinan"
 
-#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
-#, c-format
-msgid "%s has been vaporized by %s"
-msgstr "%s höyrystyi pelaajan %s toimesta"
+#~ msgid "%s fatefully ignored %s's firemine"
+#~ msgstr "%s kohtalokkaasti tutustui pelaajan %s tulimiinaan"
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
+#~ msgid "%s could not hide from %s's fireball"
+#~ msgstr "%s ei kyennyt pakenemaan pelaajan %s tulipalloa"
 
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
+#~ msgid "%s saw the pretty lights of %s's fireball"
+#~ msgstr "&s näki kauniita valoja pelaajan %s tulipallosta"
 
-#: qcsrc/server/w_porto.qc:298
-#, c-format
-msgid "%s felt %s doing the impossible to him"
-msgstr "%s tunsi kuinka pelaaja %s teki hänelle mahdottoman tempun"
+#~ msgid "%s got too close to %s's fireball"
+#~ msgstr "%s joutui turhan lähelle pelaajan %s tulipalloa"
 
-#: qcsrc/server/w_rifle.qc:2
-msgid "Rifle"
-msgstr "Rifle"
+#~ msgid "%s tasted %s's fireball"
+#~ msgstr "%s maistoi pelaajan %s tulipalloa"
 
-#: qcsrc/server/w_rifle.qc:233
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s ampui itsensä täysin omatoimisesti"
+#~ msgid "%s tried out his own grenade"
+#~ msgstr "%s testasi räjähtääkö oma kranaatti"
 
-#: qcsrc/server/w_rifle.qc:235
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s onnistui jotenkin ampumaan omaan jalkaansa"
+#~ msgid "%s detonated"
+#~ msgstr "%s pössähti"
 
-#: qcsrc/server/w_rifle.qc:242
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s ei kyennyt pakenemaan pelaajan %s luotisadetta"
+#~ msgid "%s didn't see %s's grenade"
+#~ msgstr "%s ei nähnyt pelaajan %s kranaattia"
 
-#: qcsrc/server/w_rifle.qc:244
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s kuoli pelaajan %s luotisateeseen"
+#~ msgid "%s almost dodged %s's grenade"
+#~ msgstr "%s väisti melkein pelaajan %s kranaatin"
 
-#: qcsrc/server/w_rifle.qc:251
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s ei kyennyt piiloutumaan pelaajan %s kivääriä"
+#~ msgid "%s ate %s's grenade"
+#~ msgstr "%s söi pelaajan %s kranaatin"
 
-#: qcsrc/server/w_rifle.qc:256
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s sai päähänsä reiän pelaajan %s toimesta"
+#~ msgid "%s played with tiny rockets"
+#~ msgstr "%s leikki pienien rakettien kanssa"
 
-#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s ammuttiin alas, kuolonlaukauksen tarjosi %s"
+#~ msgid "%s hoped %s's missiles wouldn't bounce"
+#~ msgstr "%s toivoi ettei pelaajan %s raketit olisi kimmonneet"
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#~ msgid "%s was pummeled by %s"
+#~ msgstr "%s joutui pelaajan %s nuijimaksi"
 
-#: qcsrc/server/w_rocketlauncher.qc:505
-#, c-format
-msgid "%s got too close to %s's rocket"
-msgstr "%s joutui liian lähelle pelaajan %s rakettia"
+#~ msgid "%s was cut down by %s"
+#~ msgstr "%s joutui pelaajan %s niittämäksi"
 
-#: qcsrc/server/w_rocketlauncher.qc:507
-#, c-format
-msgid "%s almost dodged %s's rocket"
-msgstr "%s miltein väisti pelaajan %s raketin"
+#~ msgid "%s did the impossible"
+#~ msgstr "%s teki mahdottomat"
 
-#: qcsrc/server/w_rocketlauncher.qc:509
-#, c-format
-msgid "%s ate %s's rocket"
-msgstr "%s söi pelaajan %s raketin"
+#~ msgid "%s has run into %s's gravity bomb"
+#~ msgstr "%s juoksi pelaajan %s pommiin"
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
+#~ msgid "%s lasered themself to hell"
+#~ msgstr "%s lähetti itsensä laserilla helvettiin"
 
-#: qcsrc/server/w_seeker.qc:659
-#, c-format
-msgid "%s was tagged by %s"
-msgstr "%s joutui pelaajan %s leimaamaksi ja tuhoamaksi"
+#~ msgid "%s was cut in half by %s's gauntlet"
+#~ msgstr "%s leikkaantui kahtia pelaajan %s taisteluhansikkaaseen"
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
+#~ msgid "%s was lasered to death by %s"
+#~ msgstr "%s kuoli pelaajan %s laseriin"
 
-#: qcsrc/server/w_shotgun.qc:219
-#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr "%2$s ^7murjoi pelaajaa %1$s ^2haulikon tylpällä päällä"
+#~ msgid "%s exploded"
+#~ msgstr "%s räjähti"
 
-#: qcsrc/server/w_shotgun.qc:221
-#, c-format
-msgid "%s was gunned by %s"
-msgstr "%s ammuttiin alas pelaajan %s toimesta"
+#~ msgid "%s got too close to %s's mine"
+#~ msgstr "%s joutui liian lähelle pelaajan %s miinaa"
 
-#: qcsrc/server/w_tuba.qc:2
-#, c-format
-msgid "@!#%'n Tuba"
-msgstr "@!#% tuuba"
+#~ msgid "%s almost dodged %s's mine"
+#~ msgstr "%s miltein väisti pelaajan %s miinan"
 
-#: qcsrc/server/w_tuba.qc:252
-#, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
-msgstr "%s tärykalvot räjähti, kun hän soitteli @!#%% tuubaa"
+#~ msgid "%s stepped on %s's mine"
+#~ msgstr "%s astui pelaajan %s miinaan"
 
-#: qcsrc/server/w_tuba.qc:256
-#, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
-msgstr ""
-"%s kuoli ihastuksesta kuullessaan pelaajan %s kaunista @!#%% tuubansoittoa"
+#~ msgid "%s is now thinking with portals"
+#~ msgstr "%s kokee portaalit"
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
+#~ msgid "%s has been vaporized by %s"
+#~ msgstr "%s höyrystyi pelaajan %s toimesta"
 
-#: qcsrc/server/w_uzi.qc:323
-#, c-format
-msgid "%s was riddled full of holes by %s"
-msgstr "%s sai muutaman uuden ilmanvaihtoreiän, kun %s tarjosi niitä"
+#~ msgid "%s felt %s doing the impossible to him"
+#~ msgstr "%s tunsi kuinka pelaaja %s teki hänelle mahdottoman tempun"
+
+#~ msgid "%s shot themself automatically"
+#~ msgstr "%s ampui itsensä täysin omatoimisesti"
+
+#~ msgid "%s sniped themself somehow"
+#~ msgstr "%s onnistui jotenkin ampumaan omaan jalkaansa"
+
+#~ msgid "%s failed to hide from %s's bullet hail"
+#~ msgstr "%s ei kyennyt pakenemaan pelaajan %s luotisadetta"
+
+#~ msgid "%s died in %s's bullet hail"
+#~ msgstr "%s kuoli pelaajan %s luotisateeseen"
+
+#~ msgid "%s failed to hide from %s's rifle"
+#~ msgstr "%s ei kyennyt piiloutumaan pelaajan %s kivääriä"
+
+#~ msgid "%s got hit in the head by %s"
+#~ msgstr "%s sai päähänsä reiän pelaajan %s toimesta"
+
+#~ msgid "%s was sniped by %s"
+#~ msgstr "%s ammuttiin alas, kuolonlaukauksen tarjosi %s"
+
+#~ msgid "%s got too close to %s's rocket"
+#~ msgstr "%s joutui liian lähelle pelaajan %s rakettia"
+
+#~ msgid "%s almost dodged %s's rocket"
+#~ msgstr "%s miltein väisti pelaajan %s raketin"
+
+#~ msgid "%s ate %s's rocket"
+#~ msgstr "%s söi pelaajan %s raketin"
+
+#~ msgid "%s was tagged by %s"
+#~ msgstr "%s joutui pelaajan %s leimaamaksi ja tuhoamaksi"
+
+#~ msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+#~ msgstr "%2$s ^7murjoi pelaajaa %1$s ^2haulikon tylpällä päällä"
+
+#~ msgid "%s was gunned by %s"
+#~ msgstr "%s ammuttiin alas pelaajan %s toimesta"
+
+#~ msgid "%s hurt his own ears with the @!#%%'n Tuba"
+#~ msgstr "%s tärykalvot räjähti, kun hän soitteli @!#%% tuubaa"
+
+#~ msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+#~ msgstr ""
+#~ "%s kuoli ihastuksesta kuullessaan pelaajan %s kaunista @!#%% tuubansoittoa"
+
+#~ msgid "%s was riddled full of holes by %s"
+#~ msgstr "%s sai muutaman uuden ilmanvaihtoreiän, kun %s tarjosi niitä"
index 12bd9e1f6e3329c424476d82025d94d25390e53d..90c39edb3d6455505a142e3ed07311215cfaa93f 100644 (file)
@@ -2,14 +2,14 @@
 # Copyright (C) 2011 Team Xonotic
 # This file is distributed under the same license as the PACKAGE package.
 # Felice Sallustio <fel.sallustio@gmail.com>, 2011.
-# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.
+# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011,2012.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: 0.1preview\n"
+"Project-Id-Version: 0.6\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2012-01-26 12:24+0100\n"
-"PO-Revision-Date: 2011-09-04 01:40+0100\n"
+"PO-Revision-Date: 2011-02-26 20:40+0100\n"
 "Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
 "Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
 "Language: it\n"
@@ -678,7 +678,7 @@ msgstr "Effetto dissolvenza:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
-msgstr "EF^Nessuno"
+msgstr "Nessuno"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
@@ -690,7 +690,7 @@ msgstr "Opacità"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
 msgid "EF^Both"
-msgstr "EF^Entrambi"
+msgstr "Entrambi"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
@@ -706,7 +706,7 @@ msgstr "Mostra ID arma come:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
 msgid "SHOWAS^None"
-msgstr "SHOWAS^Nessuno"
+msgstr "Nessuno"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
 msgid "Number"
@@ -780,19 +780,19 @@ msgstr "Sfondo dell'HUD:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
 msgid "DOCK^Disabled"
-msgstr "DOCK^Disabilitato"
+msgstr "Disabilitato"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
 msgid "DOCK^Small"
-msgstr "DOCK^Piccolo"
+msgstr "Piccolo"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
 msgid "DOCK^Medium"
-msgstr "DOCK^Medio"
+msgstr "Medio"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
 msgid "DOCK^Large"
-msgstr "DOCK^Largo"
+msgstr "Largo"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
 msgid "Grid settings:"
@@ -1190,7 +1190,7 @@ msgstr "Powerup"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:104
 msgid "MUT^None"
-msgstr "MUT^Nessuno"
+msgstr "Nessuno"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
 msgid "Gameplay mutators:"
@@ -1259,11 +1259,11 @@ msgstr "Entra"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
 msgid "SRVS^Empty"
-msgstr "SRVS^Vuoti"
+msgstr "Vuoti"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
 msgid "SRVS^Full"
-msgstr "SRVS^Pieni"
+msgstr "Pieni"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
 msgid "Pause"
@@ -1292,7 +1292,7 @@ msgstr "Informazioni del server"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:242
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:247
 msgid "N/A"
-msgstr "N/D"
+msgstr "N.D."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:179
 #, c-format
@@ -1610,19 +1610,19 @@ msgstr "Gib:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:33
 msgid "GIBS^None"
-msgstr "GIBS^Nessuno"
+msgstr "Nessuno"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:34
 msgid "GIBS^Few"
-msgstr "GIBS^Pochi"
+msgstr "Pochi"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:35
 msgid "GIBS^Many"
-msgstr "GIBS^Molti"
+msgstr "Molti"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:36
 msgid "GIBS^Lots"
-msgstr "GIBS^Parecchi"
+msgstr "Parecchi"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:40
 msgid "Playermodel LOD:"
@@ -1634,15 +1634,15 @@ msgstr "Forza modelli:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:45
 msgid "MDL^None"
-msgstr "MDL^Nessuno"
+msgstr "Nessuno"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:46
 msgid "MDL^Custom"
-msgstr "MDL^Personalizzato"
+msgstr "Personalizzato"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:47
 msgid "MDL^All"
-msgstr "MDL^Tutti"
+msgstr "Tutti"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_model.c:50
 msgid "Force player models to mine"
@@ -1972,7 +1972,7 @@ msgstr "Musica:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:45
 msgid "VOL^Ambient:"
-msgstr "VOL^Ambiente:"
+msgstr "Ambiente:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:54
 msgid "Info:"
@@ -2121,7 +2121,7 @@ msgstr "5 minuti"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:182
 msgid "WRN^Both"
-msgstr "WNR^Entrambi"
+msgstr "Entrambi"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:189
 msgid "Automatic taunts"
@@ -2137,31 +2137,31 @@ msgstr "Preset qualità:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:41
 msgid "PRE^OMG!"
-msgstr "PRE^Oh mio dio!"
+msgstr "Oh mio dio!"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:42
 msgid "PRE^Low"
-msgstr "PRE^Bassa"
+msgstr "Bassa"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:43
 msgid "PRE^Medium"
-msgstr "PRE^Media"
+msgstr "Media"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:44
 msgid "PRE^Normal"
-msgstr "PRE^Normale"
+msgstr "Normale"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:45
 msgid "PRE^High"
-msgstr "PRE^Alta"
+msgstr "Alta"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:46
 msgid "PRE^Ultra"
-msgstr "PRE^Ultra"
+msgstr "Ultra"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:48
 msgid "PRE^Ultimate"
-msgstr "PRE^Massima"
+msgstr "Massima"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:52
 msgid "Geometry detail:"
@@ -2169,27 +2169,27 @@ msgstr "Dettagli geometrici:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:54
 msgid "DET^Lowest"
-msgstr "DET^Molto bassi"
+msgstr "Molto bassi"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:55
 msgid "DET^Low"
-msgstr "DET^Bassi"
+msgstr "Bassi"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:56
 msgid "DET^Normal"
-msgstr "DET^Normali"
+msgstr "Normali"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:57
 msgid "DET^Good"
-msgstr "DET^Buoni"
+msgstr "Buoni"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:58
 msgid "DET^Best"
-msgstr "DET^Ottimi"
+msgstr "Ottimi"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:59
 msgid "DET^Insane"
-msgstr "DET^Bestiali"
+msgstr "Bestiali"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:62
 msgid "Texture resolution:"
@@ -2197,11 +2197,11 @@ msgstr "Risoluzione texture:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:65
 msgid "RES^Leet"
-msgstr "RES^Leet"
+msgstr "Leet"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:66
 msgid "RES^Lowest"
-msgstr "RES^Molto bassa"
+msgstr "Molto bassa"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:67
 msgid "RES^Very low"
@@ -2209,19 +2209,19 @@ msgstr "Molto bassa"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:68
 msgid "RES^Low"
-msgstr "RES^Bassa"
+msgstr "Bassa"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:69
 msgid "RES^Normal"
-msgstr "RES^Normale"
+msgstr "Normale"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:70
 msgid "RES^Good"
-msgstr "RES^Buona"
+msgstr "Buona"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:71
 msgid "RES^Best"
-msgstr "RES^Ottima"
+msgstr "Ottima"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:84
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:87
@@ -2347,7 +2347,7 @@ msgstr "Sfocate"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:168
 msgid "REFL^Good"
-msgstr "REFL^Buone"
+msgstr "Buone"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:169
 msgid "Sharp"
@@ -2359,7 +2359,7 @@ msgstr "Sfocatura movimento:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:179
 msgid "Extra postprocessing effects"
-msgstr "Effetti extra di postprocessing"
+msgstr "Effetti extra di postcalcolo"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
@@ -2700,39 +2700,39 @@ msgstr "Dimensioni caratteri:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:31
 msgid "SZ^Unreadable"
-msgstr "SZ^Illeggibile"
+msgstr "Illeggibile"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:32
 msgid "SZ^Tiny"
-msgstr "SZ^Minuscolo"
+msgstr "Minuscolo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:33
 msgid "SZ^Little"
-msgstr "SZ^Molto piccolo"
+msgstr "Molto piccolo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:34
 msgid "SZ^Small"
-msgstr "SZ^Piccolo"
+msgstr "Piccolo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:35
 msgid "SZ^Medium"
-msgstr "SZ^Medio"
+msgstr "Medio"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:36
 msgid "SZ^Large"
-msgstr "SZ^Largo"
+msgstr "Largo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:37
 msgid "SZ^Huge"
-msgstr "SZ^Enorme"
+msgstr "Enorme"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:38
 msgid "SZ^Gigantic"
-msgstr "SZ^Gigante"
+msgstr "Gigante"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:39
 msgid "SZ^Colossal"
-msgstr "SZ^Colossale"
+msgstr "Colossale"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:42
 msgid "Color depth:"
@@ -2760,7 +2760,7 @@ msgstr "Anisotropia:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:55
 msgid "ANISO^Disabled"
-msgstr "ANISO^Disabilitato"
+msgstr "Disabilitata"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:56
 #: qcsrc/menu/xonotic/dialog_settings_video.c:66
@@ -2786,7 +2786,7 @@ msgstr "Antialiasing:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:65
 msgid "AA^Disabled"
-msgstr "AA^Disabilitato"
+msgstr "Disabilitato"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:71
 msgid "High-quality frame buffer"
@@ -2798,15 +2798,15 @@ msgstr "Profondità prima:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:78
 msgid "DF^Disabled"
-msgstr "DF^Disabilitata"
+msgstr "Disabilitato"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:79
 msgid "DF^World"
-msgstr "DF^Globale"
+msgstr "Globale"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:80
 msgid "DF^All"
-msgstr "DF^Tutto"
+msgstr "Tutto"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:83
 msgid "Vertex Buffer Objects (VBOs)"
@@ -2814,7 +2814,7 @@ msgstr "Vertex Buffer Objects (VBOs)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:86
 msgid "VBO^Off"
-msgstr "VBO^Off"
+msgstr "Non attivo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:87
 msgid "Vertices, some Tris (compatible)"
@@ -2850,7 +2850,7 @@ msgstr "Saturazione:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:116
 msgid "LIT^Ambient:"
-msgstr "LIT^Ambiente:"
+msgstr "Ambiente:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:119
 msgid "Intensity:"
@@ -3009,11 +3009,11 @@ msgstr "<AUTORE>"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:50
 msgid "VOL^OFF"
-msgstr "VOL^OFF"
+msgstr "OFF"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:52
 msgid "VOL^MAX"
-msgstr "VOL^MAX"
+msgstr "MAX"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:53
 #, c-format
@@ -3089,7 +3089,7 @@ msgstr "Abilita pannello"
 
 #: weapons.qc.tmp:1
 msgid "Rifle"
-msgstr "Fucile"
+msgstr "Rifle"
 
 #: weapons.qc.tmp:2
 msgid "Machine Gun"
diff --git a/models/ok_player/okmale1.dpm b/models/ok_player/okmale1.dpm
new file mode 100644 (file)
index 0000000..2967c86
Binary files /dev/null and b/models/ok_player/okmale1.dpm differ
diff --git a/models/ok_player/okmale1.dpm.framegroups b/models/ok_player/okmale1.dpm.framegroups
new file mode 100644 (file)
index 0000000..b1ccc04
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okmale1
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okmale1 die1
+42 56 30 0 // okmale1 die2
+98 11 15 1 // okmale1 draw
+109 6 10 1 // okmale1 duck
+115 17 15 1 // okmale1 duckwalk
+132 31 40 0 // okmale1 duckjump
+163 17 10 1 // okmale1 duckidle
+180 101 15 1 // okmale1 idle
+281 17 20 1 // okmale1 jump
+298 6 10 0 // okmale1 pain1
+304 6 10 0 // okmale1 pain2
+310 6 30 0 // okmale1 shoot
+316 17 15 1 // okmale1 taunt
+333 17 30 1 // okmale1 run
+350 17 30 1 // okmale1 runbackwards
+367 17 30 1 // okmale1 strafeleft
+384 17 30 1 // okmale1 straferight
+401 3 10 0 // okmale1 dead1
+404 3 10 0 // okmale1 dead2
+407 17 30 1 // okmale1 forwardright
+424 17 30 1 // okmale1 forwardleft
+441 17 30 1 // okmale1 backright
+458 17 30 1 // okmale1 backleft
+475 21 15 1 // okmale1 melee
diff --git a/models/ok_player/okmale1.dpm_0.sounds b/models/ok_player/okmale1.dpm_0.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/ok_player/okmale1.dpm_0.txt b/models/ok_player/okmale1.dpm_0.txt
new file mode 100644 (file)
index 0000000..da0d2a1
--- /dev/null
@@ -0,0 +1,7 @@
+name overkillmale1
+species human
+sex Male
+weight 105
+age 26
+
+overkill solider
diff --git a/models/ok_player/okmale2.dpm b/models/ok_player/okmale2.dpm
new file mode 100644 (file)
index 0000000..3261845
Binary files /dev/null and b/models/ok_player/okmale2.dpm differ
diff --git a/models/ok_player/okmale2.dpm.framegroups b/models/ok_player/okmale2.dpm.framegroups
new file mode 100644 (file)
index 0000000..0568594
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okmale2
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okmale2 die1
+42 56 30 0 // okmale2 die2
+98 11 15 1 // okmale2 draw
+109 6 10 1 // okmale2 duck
+115 17 15 1 // okmale2 duckwalk
+132 31 40 0 // okmale2 duckjump
+163 17 10 1 // okmale2 duckidle
+180 101 15 1 // okmale2 idle
+281 17 20 1 // okmale2 jump
+298 6 10 0 // okmale2 pain1
+304 6 10 0 // okmale2 pain2
+310 6 30 0 // okmale2 shoot
+316 17 15 1 // okmale2 taunt
+333 17 30 1 // okmale2 run
+350 17 30 1 // okmale2 runbackwards
+367 17 30 1 // okmale2 strafeleft
+384 17 30 1 // okmale2 straferight
+401 3 10 0 // okmale2 dead1
+404 3 10 0 // okmale2 dead2
+407 17 30 1 // okmale2 forwardright
+424 17 30 1 // okmale2 forwardleft
+441 17 30 1 // okmale2 backright
+458 17 30 1 // okmale2 backleft
+475 21 15 1 // okmale2 melee
diff --git a/models/ok_player/okmale2.dpm_0.sounds b/models/ok_player/okmale2.dpm_0.sounds
new file mode 100644 (file)
index 0000000..04d9592
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: insurrectionist
+//affirmative sound/player/insurrectionist/player/affirmative 0
+attack sound/player/insurrectionist/coms/attack 0
+//attacking sound/player/insurrectionist/player/attacking 0
+attackinfive sound/player/insurrectionist/coms/attackinfive 0
+coverme sound/player/insurrectionist/coms/coverme 0
+defend sound/player/insurrectionist/coms/defend 0
+//defending sound/player/insurrectionist/player/defending 0
+//droppedflag sound/player/insurrectionist/player/droppedflag 0
+flagcarriertakingdamage sound/player/insurrectionist/coms/flagcarriertakingdamage 0
+freelance sound/player/insurrectionist/coms/freelance 2
+getflag sound/player/insurrectionist/coms/getflag 0
+incoming sound/player/insurrectionist/coms/incoming 0
+meet sound/player/insurrectionist/coms/meet 0
+needhelp sound/player/insurrectionist/coms/needhelp 2
+//negative sound/player/insurrectionist/player/negative 0
+//onmyway sound/player/insurrectionist/player/onmyway 0
+//roaming sound/player/insurrectionist/player/roaming 0
+//seenenemy sound/player/insurrectionist/player/seenenemy 0
+seenflag sound/player/insurrectionist/coms/seenflag 0
+taunt sound/player/insurrectionist/coms/taunt 3
+teamshoot sound/player/insurrectionist/coms/teamshoot 3
+death sound/player/insurrectionist/player/death 3
+drown sound/player/insurrectionist/player/drown 0
+fall sound/player/insurrectionist/player/fall 0
+falling sound/player/insurrectionist/player/falling 0
+gasp sound/player/insurrectionist/player/gasp 0
+jump sound/player/insurrectionist/player/jump 0
+pain25 sound/player/insurrectionist/player/pain25 0
+pain50 sound/player/insurrectionist/player/pain50 0
+pain75 sound/player/insurrectionist/player/pain75 0
+pain100 sound/player/insurrectionist/player/pain100 0
diff --git a/models/ok_player/okmale2.dpm_0.txt b/models/ok_player/okmale2.dpm_0.txt
new file mode 100644 (file)
index 0000000..3e3a6cf
--- /dev/null
@@ -0,0 +1,7 @@
+name overkillmale1
+species human
+sex Male
+weight 105
+age 26
+
+overkill officer
\ No newline at end of file
diff --git a/models/ok_player/okmale3.dpm b/models/ok_player/okmale3.dpm
new file mode 100644 (file)
index 0000000..077dd84
Binary files /dev/null and b/models/ok_player/okmale3.dpm differ
diff --git a/models/ok_player/okmale3.dpm.framegroups b/models/ok_player/okmale3.dpm.framegroups
new file mode 100644 (file)
index 0000000..3c267ee
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okmale3
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okmale3 die1
+42 56 30 0 // okmale3 die2
+98 11 15 1 // okmale3 draw
+109 6 10 1 // okmale3 duck
+115 17 15 1 // okmale3 duckwalk
+132 31 40 0 // okmale3 duckjump
+163 17 10 1 // okmale3 duckidle
+180 101 15 1 // okmale3 idle
+281 17 20 1 // okmale3 jump
+298 6 10 0 // okmale3 pain1
+304 6 10 0 // okmale3 pain2
+310 6 30 0 // okmale3 shoot
+316 17 15 1 // okmale3 taunt
+333 17 30 1 // okmale3 run
+350 17 30 1 // okmale3 runbackwards
+367 17 30 1 // okmale3 strafeleft
+384 17 30 1 // okmale3 straferight
+401 3 10 0 // okmale3 dead1
+404 3 10 0 // okmale3 dead2
+407 17 30 1 // okmale3 forwardright
+424 17 30 1 // okmale3 forwardleft
+441 17 30 1 // okmale3 backright
+458 17 30 1 // okmale3 backleft
+475 21 15 1 // okmale3 melee
diff --git a/models/ok_player/okmale3.dpm_0.sounds b/models/ok_player/okmale3.dpm_0.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/ok_player/okmale3.dpm_0.txt b/models/ok_player/okmale3.dpm_0.txt
new file mode 100644 (file)
index 0000000..7fa399e
--- /dev/null
@@ -0,0 +1,7 @@
+name overkillmale3
+species human
+sex Male
+weight 105
+age 28
+
+overkill solider
diff --git a/models/ok_player/okmale4.dpm b/models/ok_player/okmale4.dpm
new file mode 100644 (file)
index 0000000..27f758d
Binary files /dev/null and b/models/ok_player/okmale4.dpm differ
diff --git a/models/ok_player/okmale4.dpm.framegroups b/models/ok_player/okmale4.dpm.framegroups
new file mode 100644 (file)
index 0000000..7ae2d38
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okmale4
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okmale4 die1
+42 56 30 0 // okmale4 die2
+98 11 15 1 // okmale4 draw
+109 6 10 1 // okmale4 duck
+115 17 15 1 // okmale4 duckwalk
+132 31 40 0 // okmale4 duckjump
+163 17 10 1 // okmale4 duckidle
+180 101 15 1 // okmale4 idle
+281 17 20 1 // okmale4 jump
+298 6 10 0 // okmale4 pain1
+304 6 10 0 // okmale4 pain2
+310 6 30 0 // okmale4 shoot
+316 17 15 1 // okmale4 taunt
+333 17 30 1 // okmale4 run
+350 17 30 1 // okmale4 runbackwards
+367 17 30 1 // okmale4 strafeleft
+384 17 30 1 // okmale4 straferight
+401 3 10 0 // okmale4 dead1
+404 3 10 0 // okmale4 dead2
+407 17 30 1 // okmale4 forwardright
+424 17 30 1 // okmale4 forwardleft
+441 17 30 1 // okmale4 backright
+458 17 30 1 // okmale4 backleft
+475 21 15 1 // okmale4 melee
diff --git a/models/ok_player/okmale4.dpm_0.sounds b/models/ok_player/okmale4.dpm_0.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/ok_player/okmale4.dpm_0.txt b/models/ok_player/okmale4.dpm_0.txt
new file mode 100644 (file)
index 0000000..7fa399e
--- /dev/null
@@ -0,0 +1,7 @@
+name overkillmale3
+species human
+sex Male
+weight 105
+age 28
+
+overkill solider
diff --git a/models/ok_player/okplayer.tga b/models/ok_player/okplayer.tga
new file mode 100644 (file)
index 0000000..e42318a
Binary files /dev/null and b/models/ok_player/okplayer.tga differ
diff --git a/models/ok_player/okplayer_gloss.tga b/models/ok_player/okplayer_gloss.tga
new file mode 100644 (file)
index 0000000..893f61d
Binary files /dev/null and b/models/ok_player/okplayer_gloss.tga differ
diff --git a/models/ok_player/okplayer_glow.tga b/models/ok_player/okplayer_glow.tga
new file mode 100644 (file)
index 0000000..545346a
Binary files /dev/null and b/models/ok_player/okplayer_glow.tga differ
diff --git a/models/ok_player/okplayer_reflect.tga b/models/ok_player/okplayer_reflect.tga
new file mode 100644 (file)
index 0000000..c3aaa65
Binary files /dev/null and b/models/ok_player/okplayer_reflect.tga differ
diff --git a/models/ok_player/okplayer_shirt.tga b/models/ok_player/okplayer_shirt.tga
new file mode 100644 (file)
index 0000000..4dd2ceb
Binary files /dev/null and b/models/ok_player/okplayer_shirt.tga differ
diff --git a/models/ok_player/okrobot1.dpm b/models/ok_player/okrobot1.dpm
new file mode 100644 (file)
index 0000000..37d64b0
Binary files /dev/null and b/models/ok_player/okrobot1.dpm differ
diff --git a/models/ok_player/okrobot1.dpm.framegroups b/models/ok_player/okrobot1.dpm.framegroups
new file mode 100644 (file)
index 0000000..662facc
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okrobot1
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okrobot1 die1
+67 56 30 0 // okrobot1 die2
+133 11 15 1 // okrobot1 draw
+144 6 10 1 // okrobot1 duck
+150 17 15 1 // okrobot1 duckwalk
+167 31 40 0 // okrobot1 duckjump
+198 1 10 1 // okrobot1 duckidle
+199 101 15 1 // okrobot1 idle
+300 17 20 1 // okrobot1 jump
+317 6 10 0 // okrobot1 pain1
+323 6 10 0 // okrobot1 pain2
+329 6 30 0 // okrobot1 shoot
+335 17 15 1 // okrobot1 taunt
+352 17 30 1 // okrobot1 run
+369 17 30 1 // okrobot1 runbackwards
+386 17 30 1 // okrobot1 strafeleft
+403 17 30 1 // okrobot1 straferight
+41 1 10 0 // okrobot4 dead1
+122 1 10 0 // okrobot4 dead2
+424 17 30 1 // okrobot1 forwardright
+441 17 30 1 // okrobot1 forwardleft
+458 17 30 1 // okrobot1 backright
+475 17 30 1 // okrobot1 backleft
+492 21 15 1 // okrobot1 melee
diff --git a/models/ok_player/okrobot1.dpm_0.sounds b/models/ok_player/okrobot1.dpm_0.sounds
new file mode 100644 (file)
index 0000000..62c5019
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: robot_shiny
+//affirmative sound/player/robot/player/affirmative 0
+attack sound/player/robot/coms/attack 0
+//attacking sound/player/robot/player/attacking 0
+attackinfive sound/player/robot/coms/attackinfive 0
+coverme sound/player/robot/coms/coverme 0
+defend sound/player/robot/coms/defend 0
+//defending sound/player/robot/player/defending 0
+//droppedflag sound/player/robot/player/droppedflag 0
+//flagcarriertakingdamage sound/player/robot/player/flagcarriertakingdamage 0
+freelance sound/player/robot/coms/freelance 2
+//getflag sound/player/soldier/player/getflag 0
+incoming sound/player/robot/coms/incoming 0
+meet sound/player/robot/coms/meet 0
+needhelp sound/player/robot/coms/needhelp 2
+//negative sound/player/robot/player/negative 0
+//onmyway sound/player/robot/player/onmyway 0
+//roaming sound/player/robot/player/roaming 0
+//seenenemy sound/player/robot/player/seenenemy 0
+seenflag sound/player/robot/coms/seenflag 0
+taunt sound/player/robot/coms/taunt 3
+teamshoot sound/player/robot/coms/teamshoot 3
+death sound/player/robot/player/death 3
+drown sound/player/robot/player/drown 0
+fall sound/player/robot/player/fall 0
+falling sound/player/robot/player/falling 0
+gasp sound/player/robot/player/gasp 0
+jump sound/player/robot/player/jump 0
+pain25 sound/player/robot/player/pain25 0
+pain50 sound/player/robot/player/pain50 0
+pain75 sound/player/robot/player/pain75 0
+pain100 sound/player/robot/player/pain100 0
diff --git a/models/ok_player/okrobot1.dpm_0.txt b/models/ok_player/okrobot1.dpm_0.txt
new file mode 100644 (file)
index 0000000..0b52a01
--- /dev/null
@@ -0,0 +1,7 @@
+name overkill robot1
+species robot_solid
+sex None
+weight 200
+age 1
+
+Overkill robot
diff --git a/models/ok_player/okrobot2.dpm b/models/ok_player/okrobot2.dpm
new file mode 100644 (file)
index 0000000..204aeab
Binary files /dev/null and b/models/ok_player/okrobot2.dpm differ
diff --git a/models/ok_player/okrobot2.dpm.framegroups b/models/ok_player/okrobot2.dpm.framegroups
new file mode 100644 (file)
index 0000000..8d7b4db
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okrobot2
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okrobot2 die1
+67 56 30 0 // okrobot2 die2
+133 11 15 1 // okrobot2 draw
+144 6 10 1 // okrobot2 duck
+150 17 15 1 // okrobot2 duckwalk
+167 31 40 0 // okrobot2 duckjump
+198 1 10 1 // okrobot2 duckidle
+199 101 15 1 // okrobot2 idle
+300 17 20 1 // okrobot2 jump
+317 6 10 0 // okrobot2 pain1
+323 6 10 0 // okrobot2 pain2
+329 6 30 0 // okrobot2 shoot
+335 17 15 1 // okrobot2 taunt
+352 17 30 1 // okrobot2 run
+369 17 30 1 // okrobot2 runbackwards
+386 17 30 1 // okrobot2 strafeleft
+403 17 30 1 // okrobot2 straferight
+41 1 10 0 // okrobot4 dead1
+122 1 10 0 // okrobot4 dead2
+424 17 30 1 // okrobot2 forwardright
+441 17 30 1 // okrobot2 forwardleft
+458 17 30 1 // okrobot2 backright
+475 17 30 1 // okrobot2 backleft
+492 21 15 1 // okrobot2 melee
diff --git a/models/ok_player/okrobot2.dpm_0.sounds b/models/ok_player/okrobot2.dpm_0.sounds
new file mode 100644 (file)
index 0000000..62c5019
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: robot_shiny
+//affirmative sound/player/robot/player/affirmative 0
+attack sound/player/robot/coms/attack 0
+//attacking sound/player/robot/player/attacking 0
+attackinfive sound/player/robot/coms/attackinfive 0
+coverme sound/player/robot/coms/coverme 0
+defend sound/player/robot/coms/defend 0
+//defending sound/player/robot/player/defending 0
+//droppedflag sound/player/robot/player/droppedflag 0
+//flagcarriertakingdamage sound/player/robot/player/flagcarriertakingdamage 0
+freelance sound/player/robot/coms/freelance 2
+//getflag sound/player/soldier/player/getflag 0
+incoming sound/player/robot/coms/incoming 0
+meet sound/player/robot/coms/meet 0
+needhelp sound/player/robot/coms/needhelp 2
+//negative sound/player/robot/player/negative 0
+//onmyway sound/player/robot/player/onmyway 0
+//roaming sound/player/robot/player/roaming 0
+//seenenemy sound/player/robot/player/seenenemy 0
+seenflag sound/player/robot/coms/seenflag 0
+taunt sound/player/robot/coms/taunt 3
+teamshoot sound/player/robot/coms/teamshoot 3
+death sound/player/robot/player/death 3
+drown sound/player/robot/player/drown 0
+fall sound/player/robot/player/fall 0
+falling sound/player/robot/player/falling 0
+gasp sound/player/robot/player/gasp 0
+jump sound/player/robot/player/jump 0
+pain25 sound/player/robot/player/pain25 0
+pain50 sound/player/robot/player/pain50 0
+pain75 sound/player/robot/player/pain75 0
+pain100 sound/player/robot/player/pain100 0
diff --git a/models/ok_player/okrobot2.dpm_0.txt b/models/ok_player/okrobot2.dpm_0.txt
new file mode 100644 (file)
index 0000000..0b52a01
--- /dev/null
@@ -0,0 +1,7 @@
+name overkill robot1
+species robot_solid
+sex None
+weight 200
+age 1
+
+Overkill robot
diff --git a/models/ok_player/okrobot3.dpm b/models/ok_player/okrobot3.dpm
new file mode 100644 (file)
index 0000000..81db898
Binary files /dev/null and b/models/ok_player/okrobot3.dpm differ
diff --git a/models/ok_player/okrobot3.dpm.framegroups b/models/ok_player/okrobot3.dpm.framegroups
new file mode 100644 (file)
index 0000000..7f0a3df
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okrobot3
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okrobot3 die1
+67 56 30 0 // okrobot3 die2
+133 11 15 1 // okrobot3 draw
+144 6 10 1 // okrobot3 duck
+150 17 15 1 // okrobot3 duckwalk
+167 31 40 0 // okrobot3 duckjump
+198 1 10 1 // okrobot3 duckidle
+199 101 15 1 // okrobot3 idle
+300 17 20 1 // okrobot3 jump
+317 6 10 0 // okrobot3 pain1
+323 6 10 0 // okrobot3 pain2
+329 6 30 0 // okrobot3 shoot
+335 17 15 1 // okrobot3 taunt
+352 17 30 1 // okrobot3 run
+369 17 30 1 // okrobot3 runbackwards
+386 17 30 1 // okrobot3 strafeleft
+403 17 30 1 // okrobot3 straferight
+41 1 10 0 // okrobot4 dead1
+122 1 10 0 // okrobot4 dead2
+424 17 30 1 // okrobot3 forwardright
+441 17 30 1 // okrobot3 forwardleft
+458 17 30 1 // okrobot3 backright
+475 17 30 1 // okrobot3 backleft
+492 21 15 1 // okrobot3 melee
diff --git a/models/ok_player/okrobot3.dpm_0.sounds b/models/ok_player/okrobot3.dpm_0.sounds
new file mode 100644 (file)
index 0000000..62c5019
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: robot_shiny
+//affirmative sound/player/robot/player/affirmative 0
+attack sound/player/robot/coms/attack 0
+//attacking sound/player/robot/player/attacking 0
+attackinfive sound/player/robot/coms/attackinfive 0
+coverme sound/player/robot/coms/coverme 0
+defend sound/player/robot/coms/defend 0
+//defending sound/player/robot/player/defending 0
+//droppedflag sound/player/robot/player/droppedflag 0
+//flagcarriertakingdamage sound/player/robot/player/flagcarriertakingdamage 0
+freelance sound/player/robot/coms/freelance 2
+//getflag sound/player/soldier/player/getflag 0
+incoming sound/player/robot/coms/incoming 0
+meet sound/player/robot/coms/meet 0
+needhelp sound/player/robot/coms/needhelp 2
+//negative sound/player/robot/player/negative 0
+//onmyway sound/player/robot/player/onmyway 0
+//roaming sound/player/robot/player/roaming 0
+//seenenemy sound/player/robot/player/seenenemy 0
+seenflag sound/player/robot/coms/seenflag 0
+taunt sound/player/robot/coms/taunt 3
+teamshoot sound/player/robot/coms/teamshoot 3
+death sound/player/robot/player/death 3
+drown sound/player/robot/player/drown 0
+fall sound/player/robot/player/fall 0
+falling sound/player/robot/player/falling 0
+gasp sound/player/robot/player/gasp 0
+jump sound/player/robot/player/jump 0
+pain25 sound/player/robot/player/pain25 0
+pain50 sound/player/robot/player/pain50 0
+pain75 sound/player/robot/player/pain75 0
+pain100 sound/player/robot/player/pain100 0
diff --git a/models/ok_player/okrobot3.dpm_0.txt b/models/ok_player/okrobot3.dpm_0.txt
new file mode 100644 (file)
index 0000000..3157342
--- /dev/null
@@ -0,0 +1,7 @@
+name overkill robot3
+species robot_solid
+sex None
+weight 200
+age 1
+
+Overkill robot
diff --git a/models/ok_player/okrobot4.dpm b/models/ok_player/okrobot4.dpm
new file mode 100644 (file)
index 0000000..13cddb8
Binary files /dev/null and b/models/ok_player/okrobot4.dpm differ
diff --git a/models/ok_player/okrobot4.dpm.framegroups b/models/ok_player/okrobot4.dpm.framegroups
new file mode 100644 (file)
index 0000000..425f035
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+Generated framegroups file for okrobot4
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 41 30 0 // okrobot4 die1
+67 56 30 0 // okrobot4 die2
+133 11 15 1 // okrobot4 draw
+144 6 10 1 // okrobot4 duck
+150 17 15 1 // okrobot4 duckwalk
+167 31 40 0 // okrobot4 duckjump
+198 1 10 1 // okrobot4 duckidle
+199 101 15 1 // okrobot4 idle
+300 17 20 1 // okrobot4 jump
+317 6 10 0 // okrobot4 pain1
+323 6 10 0 // okrobot4 pain2
+329 6 30 0 // okrobot4 shoot
+335 17 15 1 // okrobot4 taunt
+352 17 30 1 // okrobot4 run
+369 17 30 1 // okrobot4 runbackwards
+386 17 30 1 // okrobot4 strafeleft
+403 17 30 1 // okrobot4 straferight
+41 1 10 0 // okrobot4 dead1
+122 1 10 0 // okrobot4 dead2
+424 17 30 1 // okrobot4 forwardright
+441 17 30 1 // okrobot4 forwardleft
+458 17 30 1 // okrobot4 backright
+475 17 30 1 // okrobot4 backleft
+492 21 15 1 // okrobot4 melee
diff --git a/models/ok_player/okrobot4.dpm_0.sounds b/models/ok_player/okrobot4.dpm_0.sounds
new file mode 100644 (file)
index 0000000..62c5019
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: robot_shiny
+//affirmative sound/player/robot/player/affirmative 0
+attack sound/player/robot/coms/attack 0
+//attacking sound/player/robot/player/attacking 0
+attackinfive sound/player/robot/coms/attackinfive 0
+coverme sound/player/robot/coms/coverme 0
+defend sound/player/robot/coms/defend 0
+//defending sound/player/robot/player/defending 0
+//droppedflag sound/player/robot/player/droppedflag 0
+//flagcarriertakingdamage sound/player/robot/player/flagcarriertakingdamage 0
+freelance sound/player/robot/coms/freelance 2
+//getflag sound/player/soldier/player/getflag 0
+incoming sound/player/robot/coms/incoming 0
+meet sound/player/robot/coms/meet 0
+needhelp sound/player/robot/coms/needhelp 2
+//negative sound/player/robot/player/negative 0
+//onmyway sound/player/robot/player/onmyway 0
+//roaming sound/player/robot/player/roaming 0
+//seenenemy sound/player/robot/player/seenenemy 0
+seenflag sound/player/robot/coms/seenflag 0
+taunt sound/player/robot/coms/taunt 3
+teamshoot sound/player/robot/coms/teamshoot 3
+death sound/player/robot/player/death 3
+drown sound/player/robot/player/drown 0
+fall sound/player/robot/player/fall 0
+falling sound/player/robot/player/falling 0
+gasp sound/player/robot/player/gasp 0
+jump sound/player/robot/player/jump 0
+pain25 sound/player/robot/player/pain25 0
+pain50 sound/player/robot/player/pain50 0
+pain75 sound/player/robot/player/pain75 0
+pain100 sound/player/robot/player/pain100 0
diff --git a/models/ok_player/okrobot4.dpm_0.txt b/models/ok_player/okrobot4.dpm_0.txt
new file mode 100644 (file)
index 0000000..3157342
--- /dev/null
@@ -0,0 +1,7 @@
+name overkill robot3
+species robot_solid
+sex None
+weight 200
+age 1
+
+Overkill robot
index 835bd3bd176e2b806fcfb89773bcdbecf55d6878..ba5578339fb5ceeb36c3c9919731bcd72d234ceb 100644 (file)
@@ -1,8 +1,3 @@
-/*
-Generated framegroups file for spiderbot
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
 1 31 30 1 // spiderbot forward
 32 31 30 1 // spiderbot backwards
 63 31 20 1 // spiderbot left
diff --git a/models/weapons/g_ok_hmg.md3 b/models/weapons/g_ok_hmg.md3
new file mode 100644 (file)
index 0000000..3b08085
Binary files /dev/null and b/models/weapons/g_ok_hmg.md3 differ
diff --git a/models/weapons/g_ok_mg.md3 b/models/weapons/g_ok_mg.md3
new file mode 100644 (file)
index 0000000..c7e5453
Binary files /dev/null and b/models/weapons/g_ok_mg.md3 differ
diff --git a/models/weapons/g_ok_rl.md3 b/models/weapons/g_ok_rl.md3
new file mode 100644 (file)
index 0000000..c677b1b
Binary files /dev/null and b/models/weapons/g_ok_rl.md3 differ
diff --git a/models/weapons/g_ok_shotgun.md3 b/models/weapons/g_ok_shotgun.md3
new file mode 100644 (file)
index 0000000..4acc77f
Binary files /dev/null and b/models/weapons/g_ok_shotgun.md3 differ
diff --git a/models/weapons/g_ok_sniper.md3 b/models/weapons/g_ok_sniper.md3
new file mode 100644 (file)
index 0000000..4acc77f
Binary files /dev/null and b/models/weapons/g_ok_sniper.md3 differ
index 82b0b23303677dd5691606fe905becba1ad19568..61fed1377987fb09bf38d0eee86dd5fbe911700a 100644 (file)
Binary files a/models/weapons/h_minstanex.iqm and b/models/weapons/h_minstanex.iqm differ
index 9c7e7021cf861112551214fd9e733e54e218b7a5..ba97a6dec3675c7fc37b7c312929077e6841df5f 100644 (file)
@@ -1,10 +1,9 @@
 /*
-Generated framegroups file for h_uzi
+Generated framegroups file for h_minstanex
 Used by DarkPlaces to simulate frame groups in DPM models.
 */
 
-1 16 30 0 // h_uzi mgafire
-17 16 30 0 // h_uzi mgafire2
-33 101 3 1 // h_uzi mgaidle
-134 61 30 0 // h_uzi mgareload
-195 16 30 0 // h_uzi mgafire
+1 21 20 0 // h_minstanex fire
+22 21 20 0 // h_minstanex fire
+43 101 6 1 // h_minstanex idle
+144 101 30 0 // h_minstanex reload
diff --git a/models/weapons/h_ok_grenade.iqm b/models/weapons/h_ok_grenade.iqm
new file mode 100644 (file)
index 0000000..eaffcc2
Binary files /dev/null and b/models/weapons/h_ok_grenade.iqm differ
diff --git a/models/weapons/h_ok_grenade.iqm.framegroups b/models/weapons/h_ok_grenade.iqm.framegroups
new file mode 100644 (file)
index 0000000..ceb09de
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+Generated framegroups file for h_laser
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 51 50 0 // h_laser hgrenade_fire
+52 101 50 0 // h_laser hgrenade_idle
+153 101 5 1 // h_laser hgrenade_idle
+254 101 5 1 // h_laser hgrenade_idle
diff --git a/models/weapons/h_ok_hmg.iqm b/models/weapons/h_ok_hmg.iqm
new file mode 100644 (file)
index 0000000..e8f9a8e
Binary files /dev/null and b/models/weapons/h_ok_hmg.iqm differ
diff --git a/models/weapons/h_ok_hmg.iqm.framegroups b/models/weapons/h_ok_hmg.iqm.framegroups
new file mode 100644 (file)
index 0000000..8067f62
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+Generated framegroups file for h_uzi
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 11 120 0 // h_uzi mgafire
+12 11 120 0 // h_uzi mgafire
+23 51 2 1 // h_uzi mgaidle
+74 11 30 0 // h_uzi mgafire
+85 11 30 0 // h_uzi mgafire
diff --git a/models/weapons/h_ok_mg.iqm b/models/weapons/h_ok_mg.iqm
new file mode 100644 (file)
index 0000000..6048a9c
Binary files /dev/null and b/models/weapons/h_ok_mg.iqm differ
diff --git a/models/weapons/h_ok_mg.iqm.framegroups b/models/weapons/h_ok_mg.iqm.framegroups
new file mode 100644 (file)
index 0000000..948542a
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+Generated framegroups file for h_uzi
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 7 30 0 // h_uzi mgafire
+8 7 30 0 // h_uzi mgafire
+15 101 5 1 // h_uzi mgaidle
+116 61 40 1 // h_uzi mgareload
+177 61 15 1 // h_uzi mgareload
diff --git a/models/weapons/h_ok_rl.iqm b/models/weapons/h_ok_rl.iqm
new file mode 100644 (file)
index 0000000..2870b04
Binary files /dev/null and b/models/weapons/h_ok_rl.iqm differ
diff --git a/models/weapons/h_ok_rl.iqm.framegroups b/models/weapons/h_ok_rl.iqm.framegroups
new file mode 100644 (file)
index 0000000..fae30c9
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+Generated framegroups file for h_uzi
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 61 30 0 // h_uzi mgafire
+62 61 30 0 // h_uzi mgafire
+123 101 3 1 // h_uzi mgaidle
+224 61 30 0 // h_uzi mgafire
+285 61 30 0 // h_uzi mgafire
diff --git a/models/weapons/h_ok_shotgun.iqm b/models/weapons/h_ok_shotgun.iqm
new file mode 100644 (file)
index 0000000..34ef1c7
Binary files /dev/null and b/models/weapons/h_ok_shotgun.iqm differ
diff --git a/models/weapons/h_ok_shotgun.iqm.framegroups b/models/weapons/h_ok_shotgun.iqm.framegroups
new file mode 100644 (file)
index 0000000..004c9af
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+Generated framegroups file for h_shotgun
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 22 30 0 // h_shotgun sghmesh_fire
+23 31 30 0 // h_shotgun sghmesh_fire2
+54 201 5 1 // h_shotgun sghmesh_idle
+255 61 30 1 // h_shotgun sghmesh_reload
diff --git a/models/weapons/h_ok_sniper.iqm b/models/weapons/h_ok_sniper.iqm
new file mode 100644 (file)
index 0000000..6e6df93
Binary files /dev/null and b/models/weapons/h_ok_sniper.iqm differ
diff --git a/models/weapons/h_ok_sniper.iqm.framegroups b/models/weapons/h_ok_sniper.iqm.framegroups
new file mode 100644 (file)
index 0000000..75854d7
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+Generated framegroups file for h_minstanex
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 28 25 0 // h_minstanex h_minst_fire
+29 28 25 0 // h_minstanex h_minst_fire
+57 201 5 1 // h_minstanex h_minst_idle
+258 28 30 0 // h_minstanex h_minst_reload
diff --git a/models/weapons/ok_rocket.md3 b/models/weapons/ok_rocket.md3
new file mode 100644 (file)
index 0000000..7a9d082
Binary files /dev/null and b/models/weapons/ok_rocket.md3 differ
diff --git a/models/weapons/okrocketthrust.tga b/models/weapons/okrocketthrust.tga
new file mode 100644 (file)
index 0000000..8c8bcb5
Binary files /dev/null and b/models/weapons/okrocketthrust.tga differ
diff --git a/models/weapons/okrocketthrust_glow.tga b/models/weapons/okrocketthrust_glow.tga
new file mode 100644 (file)
index 0000000..293ce97
Binary files /dev/null and b/models/weapons/okrocketthrust_glow.tga differ
diff --git a/models/weapons/okweapons.tga b/models/weapons/okweapons.tga
new file mode 100644 (file)
index 0000000..2717e1b
Binary files /dev/null and b/models/weapons/okweapons.tga differ
diff --git a/models/weapons/okweapons_gloss.tga b/models/weapons/okweapons_gloss.tga
new file mode 100644 (file)
index 0000000..adba882
Binary files /dev/null and b/models/weapons/okweapons_gloss.tga differ
diff --git a/models/weapons/okweapons_glow.tga b/models/weapons/okweapons_glow.tga
new file mode 100644 (file)
index 0000000..65566aa
Binary files /dev/null and b/models/weapons/okweapons_glow.tga differ
diff --git a/models/weapons/okweapons_reflect.tga b/models/weapons/okweapons_reflect.tga
new file mode 100644 (file)
index 0000000..c86bb4c
Binary files /dev/null and b/models/weapons/okweapons_reflect.tga differ
diff --git a/models/weapons/okweapons_shirt.tga b/models/weapons/okweapons_shirt.tga
new file mode 100644 (file)
index 0000000..abc73d5
Binary files /dev/null and b/models/weapons/okweapons_shirt.tga differ
diff --git a/models/weapons/overkillbullet.tga b/models/weapons/overkillbullet.tga
new file mode 100644 (file)
index 0000000..f48d302
Binary files /dev/null and b/models/weapons/overkillbullet.tga differ
diff --git a/models/weapons/overkillbullet_gloss.tga b/models/weapons/overkillbullet_gloss.tga
new file mode 100644 (file)
index 0000000..08f2fd0
Binary files /dev/null and b/models/weapons/overkillbullet_gloss.tga differ
diff --git a/models/weapons/overkillbullet_reflect.tga b/models/weapons/overkillbullet_reflect.tga
new file mode 100644 (file)
index 0000000..ecb0222
Binary files /dev/null and b/models/weapons/overkillbullet_reflect.tga differ
diff --git a/models/weapons/v_ok_grenade.md3 b/models/weapons/v_ok_grenade.md3
new file mode 100644 (file)
index 0000000..e6f593d
Binary files /dev/null and b/models/weapons/v_ok_grenade.md3 differ
diff --git a/models/weapons/v_ok_hmg.md3 b/models/weapons/v_ok_hmg.md3
new file mode 100644 (file)
index 0000000..4f07ee8
Binary files /dev/null and b/models/weapons/v_ok_hmg.md3 differ
diff --git a/models/weapons/v_ok_mg.md3 b/models/weapons/v_ok_mg.md3
new file mode 100644 (file)
index 0000000..71a8e95
Binary files /dev/null and b/models/weapons/v_ok_mg.md3 differ
diff --git a/models/weapons/v_ok_rl.md3 b/models/weapons/v_ok_rl.md3
new file mode 100644 (file)
index 0000000..e43158e
Binary files /dev/null and b/models/weapons/v_ok_rl.md3 differ
diff --git a/models/weapons/v_ok_shotgun.md3 b/models/weapons/v_ok_shotgun.md3
new file mode 100644 (file)
index 0000000..30fbd6b
Binary files /dev/null and b/models/weapons/v_ok_shotgun.md3 differ
diff --git a/models/weapons/v_ok_sniper.md3 b/models/weapons/v_ok_sniper.md3
new file mode 100644 (file)
index 0000000..ee0ea46
Binary files /dev/null and b/models/weapons/v_ok_sniper.md3 differ
index 76edca95a59195f34ffd8dd30c78b0e21515a269..43dd0dd1834bd76fea1b760fefca9489d4c75f8a 100644 (file)
@@ -339,7 +339,6 @@ float autocvar_hud_shownames_antioverlap;
 float autocvar_hud_shownames_antioverlap_distance;
 float autocvar_hud_shownames_offset;
 string autocvar_hud_skin;
-float autocvar_loddebug;
 float autocvar_menu_mouse_speed;
 string autocvar_menu_skin;
 float autocvar_r_fakelight;
@@ -387,8 +386,9 @@ float autocvar_cl_damageeffect_lifetime;
 float autocvar_cl_damageeffect_lifetime_min;
 float autocvar_cl_damageeffect_lifetime_max;
 float autocvar_cl_playerdetailreduction;
-float autocvar_cl_loddistance1 = 1024;
-float autocvar_cl_loddistance2 = 4096;
+float autocvar_cl_modeldetailreduction;
+float autocvar_cl_loddistance1 = 768;
+float autocvar_cl_loddistance2 = 2048;
 float autocvar_cl_forceplayermodels;
 float autocvar_cl_forceplayercolors;
 string autocvar_cl_forcemyplayermodel;
index d7eddbcd8edd340b70a8b4bcf0df4912bb5cb062..2cda005ce8ea51c1602db4ca7dfa9722751f4232 100644 (file)
@@ -53,8 +53,8 @@ void CSQCPlayer_LOD_Apply(void)
        }
        else
        {
-               float distance = vlen(self.origin - other.origin);
-               float f = (distance + 100.0) * autocvar_cl_playerdetailreduction;
+               float distance = vlen(self.origin - view_origin);
+               float f = (distance * current_viewzoom + 100.0) * autocvar_cl_playerdetailreduction;
                f *= 1.0 / bound(0.01, view_quality, 1);
                if(f > autocvar_cl_loddistance2)
                        self.modelindex = self.lodmodelindex2;
@@ -243,6 +243,8 @@ float CSQCPlayer_FallbackFrame(float f)
 {
        if(frameduration(self.modelindex, f) > 0)
                return f; // goooooood
+       if(frameduration(self.modelindex, 1) <= 0)
+               return f; // this is a static model. We can't fix it if we wanted to
        switch(f)
        {
                case 23: return 11; // anim_melee -> anim_shoot
@@ -303,6 +305,7 @@ void CSQCModel_AutoTagIndex_Apply(void)
                        {
                                // the best part is: IT EXISTS
                                if(substring(self.model, 0, 17) == "models/weapons/v_")
+                               {
                                        if(substring(self.tag_entity.model, 0, 17) == "models/weapons/h_")
                                        {
                                                self.tag_index = gettagindex(self.tag_entity, "weapon");
@@ -316,14 +319,15 @@ void CSQCModel_AutoTagIndex_Apply(void)
                                                        dprint("h_ model lacks weapon attachment, but v_ model is attached to it\n");
                                                }
                                        }
-
-                               if(substring(self.model, 0, 17) == "models/weapons/v_")
-                                       if(substring(self.tag_entity.model, 0, 14) == "models/player/")
+                                       else
                                        {
-                                               self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
+                                               self.tag_index = gettagindex(self.tag_entity, "weapon");
+                                               if(!self.tag_index)
+                                                       self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
                                                if(!self.tag_index)
                                                        self.tag_index = gettagindex(self.tag_entity, "bip01 r hand");
                                        }
+                               }
 
                                if(substring(self.tag_entity.model, 0, 17) == "models/weapons/v_")
                                {
index 49d392abea2862397e6c49cbdb91ba62dab75c2e..fc8b83b5b6c8666a11efe0961ebe8af011cfcbfb 100644 (file)
@@ -113,7 +113,7 @@ void DamageEffect(vector hitorg, float dmg, float type, float specnum)
 
 void Ent_DamageInfo(float isNew)
 {
-       float dmg, rad, edge, thisdmg, forcemul, species;
+       float dmg, rad, edge, thisdmg, forcemul, species, hitplayer;
        vector force, thisforce;
        entity oldself;
 
@@ -192,6 +192,9 @@ void Ent_DamageInfo(float isNew)
                        self.event_damage(thisdmg, w_deathtype, w_org, thisforce);
 
                DamageEffect(w_org, thisdmg, w_deathtype, species);
+
+               if(self.isplayermodel)
+                       hitplayer = TRUE; // this impact damaged a player
        }
 
        self = oldself;
@@ -329,6 +332,7 @@ void Ent_DamageInfo(float isNew)
        
        // TODO spawn particle effects and sounds based on w_deathtype
        if(!DEATH_ISSPECIAL(w_deathtype))
+       if not(hitplayer && !rad) // don't show ground impacts for hitscan weapons if a player was hit
        {
                float hitwep;
 
index 58273dc19da80b4788519dea9c7ce83cedcf5498..e828a17d57d888b5ec97f1f4a386f6aab2cc3d49 100644 (file)
@@ -321,7 +321,7 @@ void Cmd_HUD_SetFields(float argc)
                else if(argv(2) == "all")
                {
                        string s;
-                       s = "ping pl color name |";
+                       s = "ping pl name |";
                        for(i = 0; i < MAX_SCORE; ++i)
                        {
                                if(i != ps_primary)
index 0a0bfa9ec143208ed3f2f286f6cf776f181fbb12..807b260ab2131eb57627aa564505898fdf9a50da 100644 (file)
@@ -7,7 +7,6 @@
 void Ent_Wall_Draw()
 {
        float f;
-       float d;
        var .vector fld;
 
        if(self.bgmscriptangular)
@@ -17,25 +16,26 @@ void Ent_Wall_Draw()
 
        if(self.lodmodelindex1)
        {
-               d = autocvar_loddebug;
-               if(d > 0)
+               if(autocvar_cl_modeldetailreduction <= 0)
                {
-                       if(d == 1)
-                               self.modelindex = self.lodmodelindex0;
-                       else if(d == 2 || !self.lodmodelindex2)
-                               self.modelindex = self.lodmodelindex1;
-                       else // if(d == 3)
+                       if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
                                self.modelindex = self.lodmodelindex2;
+                       else if(autocvar_cl_modeldetailreduction <= -1)
+                               self.modelindex = self.lodmodelindex1;
+                       else
+                               self.modelindex = self.lodmodelindex0;
                }
                else
                {
-                       d = vlen(NearestPointOnBox(self, view_origin) - view_origin);
-                       if(d < self.loddistance1)
-                               self.modelindex = self.lodmodelindex0;
-                       else if(!self.lodmodelindex2 || d < self.loddistance2)
+                       float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
+                       f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
+                       f *= 1.0 / bound(0.01, view_quality, 1);
+                       if(self.lodmodelindex2 && f > self.loddistance2)
+                               self.modelindex = self.lodmodelindex2;
+                       else if(f > self.loddistance1)
                                self.modelindex = self.lodmodelindex1;
                        else
-                               self.modelindex = self.lodmodelindex2;
+                               self.modelindex = self.lodmodelindex0;
                }
        }
 
index 23354397aacfd044f30d1ea744d64211fc1cd922..582777647c9fcd2e2798baa4c695ecea269d3969 100644 (file)
@@ -196,6 +196,9 @@ float median(float a, float b, float c)
 // works for up to 10 decimals!
 string ftos_decimals(float number, float decimals)
 {
+       // inhibit stupid negative zero
+       if(number == 0)
+               number = 0;
        // we have sprintf...
        return sprintf("%.*f", decimals, number);
 }
@@ -909,6 +912,8 @@ float almost_in_bounds(float a, float b, float c)
 {
        float eps;
        eps = (max(a, -a) + max(c, -c)) * 0.001;
+       if(a > c)
+               eps = -eps;
        return b == median(a - eps, b, c + eps);
 }
 
index bfbe8021fed5fbb1afc3677e37f37b8b896560df..d30ac7248d0294ac557d8fe4b38a9a96b1814ad1 100644 (file)
@@ -190,6 +190,7 @@ SKINBEGIN
 
        // item: nexposee
        SKINVECTOR(ALPHAS_MAINMENU, '0.6 0.8 0.9');
+       SKINFLOAT(ALPHA_DIALOG_SANDBOXTOOLS, 0.6);
 
        // item: player color button
        SKINSTRING(GFX_COLORBUTTON, "colorbutton");
index 509825047ee32d72c8de3ccd92c1cc03ba575c84..25b0fcb191d6ab2e41922c8ef9a63715a085077e 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticModelDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticModelDialog, title, string, _("Model settings"))
        ATTRIB(XonoticModelDialog, color, vector, SKINCOLOR_DIALOG_MODEL)
        ATTRIB(XonoticModelDialog, intendedWidth, float, 0.5)
-       ATTRIB(XonoticModelDialog, rows, float, 8)
+       ATTRIB(XonoticModelDialog, rows, float, 7)
        ATTRIB(XonoticModelDialog, columns, float, 3)
 ENDCLASS(XonoticModelDialog)
 #endif
@@ -36,9 +36,6 @@ void XonoticModelDialog_fill(entity me)
                        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, _("Playermodel LOD:")));
-               me.TD(me, 1, 2, e = makeXonoticSlider(0, 10, 1, "cl_playerdetailreduction"));
        me.TR(me);
        #ifdef ALLOW_FORCEMODELS
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Force models:")));
index 8ef2e9d6313b7b8e038e66b80f31e6ee2bd4f297..1e315dc98bf540573ddf81c27c745901a92a4bad 100644 (file)
@@ -58,6 +58,9 @@ void XonoticEffectsSettingsTab_fill(entity me)
                        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, _("Playermodel LOD:")));
+               me.TD(me, 1, 2, e = makeXonoticSlider(4, 0, -0.1, "cl_playerdetailreduction"));
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Texture resolution:")));
                me.TD(me, 1, 2, e = makeXonoticPicmipSlider());
@@ -70,7 +73,6 @@ void XonoticEffectsSettingsTab_fill(entity me)
                        e.addValue(e, ZCTX(_("RES^Good")), "-1");
                        e.addValue(e, ZCTX(_("RES^Best")), "-2");
                        e.configureXonoticTextSliderValues(e);
-       me.TR(me);
        me.TR(me);
                {
                        // detect texture compression method
index 2adb9343e491b7f70f1355ad14865463753b5857..f9d86c2dd229276aadb7272c9484f165bb1ad606 100644 (file)
@@ -191,7 +191,7 @@ void MainWindow_configureMainWindow(entity me)
        // mutator dialogs
        i = spawnXonoticSandboxToolsDialog();
        i.configureDialog(i);
-       me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+       me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z * SKINALPHA_DIALOG_SANDBOXTOOLS);
        
        
        // miscellaneous dialogs
index 1a94c115dd2c5b75ab10af99d6547c6ea4c1ae2d..fbf64c98be50b2359a3956550fe78d094f79a3c5 100644 (file)
@@ -649,6 +649,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        if(modname != "Xonotic")
        if(modname != "MinstaGib")
        if(modname != "CTS")
+       if(modname != "NewToys")
                pure = 0;
 
        if(gethostcachenumber(SLIST_FIELD_FREESLOTS, i) <= 0)
diff --git a/qcsrc/server/attic/nexball.qc b/qcsrc/server/attic/nexball.qc
new file mode 100644 (file)
index 0000000..a068a33
--- /dev/null
@@ -0,0 +1,738 @@
+//EF_BRIGHTFIELD|EF_BRIGHTLIGHT|EF_DIMLIGHT|EF_BLUE|EF_RED|EF_FLAME
+#define BALL_EFFECTMASK 1229
+#define BALL_MINS '-16 -16 -16'  // The model is 24*24*24
+#define BALL_MAXS '16 16 16'
+#define BALL_ATTACHORG '3 0 16'
+#define BALL_SPRITECOLOR '.91 .85 .62'
+#define BALL_FOOT   1
+#define BALL_BASKET 2
+//spawnflags
+#define GOAL_TOUCHPLAYER 1
+//goal types
+#define GOAL_FAULT -1
+#define GOAL_OUT -2
+
+#define CVTOV(s) s = cvar( #s )
+
+float g_nexball_football_boost_forward;
+float g_nexball_football_boost_up;
+float g_nexball_football_physics;
+float g_nexball_delay_idle;
+float g_nexball_basketball_delay_hold;
+float g_nexball_basketball_delay_hold_forteam;
+float g_nexball_basketball_effects_default;
+float g_nexball_basketball_teamsteal;
+float balls;
+float ball_scale;
+float nb_teams;
+
+.float teamtime;
+
+void nb_delayedinit();
+void nb_init() // Called early (worldspawn stage)
+{
+       CVTOV(g_nexball_meter_period); //sent with the client init entity
+       if (g_nexball_meter_period <= 0)
+               g_nexball_meter_period = 2; // avoid division by zero etc. due to silly users
+       g_nexball_meter_period = rint(g_nexball_meter_period * 32) / 32; //Round to 1/32ths to send as a byte multiplied by 32
+       addstat(STAT_NB_METERSTART, AS_FLOAT, metertime);
+
+       // General settings
+       CVTOV(g_nexball_football_boost_forward);   //100
+       CVTOV(g_nexball_football_boost_up);        //200
+       CVTOV(g_nexball_delay_idle);               //10
+       CVTOV(g_nexball_football_physics);         //0
+
+       radar_showennemies = autocvar_g_nexball_radar_showallplayers;
+
+       InitializeEntity(world, nb_delayedinit, INITPRIO_GAMETYPE);
+}
+
+float OtherTeam(float t)  //works only if there are two teams on the map!
+{
+       entity e;
+       e = find(world, classname, "nexball_team");
+       if (e.team == t)
+               e = find(e, classname, "nexball_team");
+       return e.team;
+}
+
+void ResetBall();
+
+void LogNB(string mode, entity actor)
+{
+       string s;
+       if(!autocvar_sv_eventlog)
+               return;
+       s = strcat(":nexball:", mode);
+       if(actor != world)
+               s = strcat(s, ":", ftos(actor.playerid));
+       GameLogEcho(s);
+}
+
+void ball_restart (void)
+{
+       if(self.owner)
+               DropBall(self, self.owner.origin, '0 0 0');
+       ResetBall();
+}
+
+void nexball_setstatus (void)
+{
+       entity oldself;
+       self.items &~= IT_KEY1;
+       if (self.ballcarried)
+       {
+               if (self.ballcarried.teamtime && (self.ballcarried.teamtime < time))
+               {
+                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
+                       oldself = self;
+                       self = self.ballcarried;
+                       DropBall(self, self.owner.origin, '0 0 0');
+                       ResetBall();
+                       self = oldself;
+               } else
+                       self.items |= IT_KEY1;
+       }
+}
+
+void relocate_nexball (void)
+{
+       tracebox(self.origin, BALL_MINS, BALL_MAXS, self.origin, TRUE, self);
+       if (trace_startsolid)
+       {
+               vector o;
+               o = self.origin;
+               if(!move_out_of_solid(self))
+                       objerror("could not get out of solid at all!");
+               print("^1NOTE: this map needs FIXING. ", self.classname, " at ", vtos(o - '0 0 1'));
+               print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
+               print(" ", ftos(self.origin_y - o_y));
+               print(" ", ftos(self.origin_z - o_z), "'\n");
+               self.origin = o;
+       }
+}
+
+void basketball_touch();
+void football_touch();
+
+void DropOwner (void)
+{
+       entity ownr;
+       ownr = self.owner;
+       DropBall(self, ownr.origin, ownr.velocity);
+       makevectors(ownr.v_angle_y * '0 1 0');
+       ownr.velocity += ('0 0 0.75' - v_forward) * 1000;
+       ownr.flags &~= FL_ONGROUND;
+}
+
+void GiveBall (entity plyr, entity ball)
+{
+       entity ownr;
+
+       if ((ownr = ball.owner))
+       {
+               ownr.effects &~= g_nexball_basketball_effects_default;
+               ownr.ballcarried = world;
+               if (ownr.metertime)
+               {
+                       ownr.metertime = 0;
+                       ownr.weaponentity.state = WS_READY;
+               }
+               WaypointSprite_Kill(ownr.waypointsprite_attachedforcarrier);
+       }
+       else
+       {
+               WaypointSprite_Kill(ball.waypointsprite_attachedforcarrier);
+       }
+
+       setattachment(ball, plyr, "");
+       setorigin(ball, BALL_ATTACHORG);
+
+       if (ball.team != plyr.team)
+               ball.teamtime = time + g_nexball_basketball_delay_hold_forteam;
+
+       ball.owner = ball.pusher = plyr; //"owner" is set to the player carrying, "pusher" to the last player who touched it
+       ball.team = plyr.team;
+       plyr.ballcarried = ball;
+       ball.dropperid = plyr.playerid;
+
+       plyr.effects |= g_nexball_basketball_effects_default;
+       ball.effects &~= g_nexball_basketball_effects_default;
+
+       ball.velocity = '0 0 0';
+       ball.movetype = MOVETYPE_NONE;
+       ball.touch = SUB_Null;
+       ball.effects |= EF_NOSHADOW;
+       ball.scale = 1; // scale down.
+
+       WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+       WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       if (g_nexball_basketball_delay_hold)
+       {
+               ball.think = DropOwner;
+               ball.nextthink = time + g_nexball_basketball_delay_hold;
+       }
+}
+
+void DropBall (entity ball, vector org, vector vel)
+{
+       ball.effects |= g_nexball_basketball_effects_default;
+       ball.effects &~= EF_NOSHADOW;
+       ball.owner.effects &~= g_nexball_basketball_effects_default;
+
+       setattachment(ball, world, "");
+       setorigin (ball, org);
+       ball.movetype = MOVETYPE_BOUNCE;
+       ball.flags &~= FL_ONGROUND;
+       ball.scale = ball_scale;
+       ball.velocity = vel;
+       ball.ctf_droptime = time;
+       ball.touch = basketball_touch;
+       ball.think = ResetBall;
+       ball.nextthink = min(time + g_nexball_delay_idle, ball.teamtime);
+
+       if (ball.owner.metertime)
+       {
+               ball.owner.metertime = 0;
+               ball.owner.weaponentity.state = WS_READY;
+       }
+
+       WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
+       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
+       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       ball.owner.ballcarried = world;
+       ball.owner = world;
+}
+
+void InitBall (void)
+{
+       if (gameover) return;
+       self.flags &~= FL_ONGROUND;
+       self.movetype = MOVETYPE_BOUNCE;
+       if (self.classname == "nexball_basketball")
+               self.touch = basketball_touch;
+       else if (self.classname == "nexball_football")
+               self.touch = football_touch;
+       self.cnt = 0;
+       self.think = ResetBall;
+       self.nextthink = time + g_nexball_delay_idle + 3;
+       self.teamtime = 0;
+       self.pusher = world;
+       self.team = FALSE;
+       sound (self, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+       WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
+       LogNB("init", world);
+}
+
+void ResetBall (void)
+{
+       if (self.cnt < 2) { // step 1
+               if (time == self.teamtime)
+                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
+               self.touch = SUB_Null;
+               self.movetype = MOVETYPE_NOCLIP;
+               self.velocity = '0 0 0'; // just in case?
+               if(!self.cnt)
+                       LogNB("resetidle", world);
+               self.cnt = 2;
+               self.nextthink = time;
+       } else if (self.cnt < 4) { // step 2 and 3
+//             dprint("Step ", ftos(self.cnt), ": Calculated velocity: ", vtos(self.spawnorigin - self.origin), ", time: ", ftos(time), "\n");
+               self.velocity = (self.spawnorigin - self.origin) * (self.cnt - 1); // 1 or 0.5 second movement
+               self.nextthink = time + 0.5;
+               self.cnt += 1;
+       } else { // step 4
+//             dprint("Step 4: time: ", ftos(time), "\n");
+               if (vlen(self.origin - self.spawnorigin) > 10) // should not happen anymore
+                       dprint("The ball moved too far away from its spawn origin.\nOffset: ",
+                              vtos(self.origin - self.spawnorigin), " Velocity: ", vtos(self.velocity), "\n");
+               self.velocity = '0 0 0';
+               setorigin(self, self.spawnorigin); // make sure it's positioned correctly anyway
+               self.movetype = MOVETYPE_NONE;
+               self.think = InitBall;
+               self.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
+       }
+}
+
+void football_touch (void)
+{
+       if (other.solid == SOLID_BSP) {
+               if (time > self.lastground + 0.1)
+               {
+                       sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+                       self.lastground = time;
+               }
+               if (vlen(self.velocity) && !self.cnt)
+                       self.nextthink = time + g_nexball_delay_idle;
+               return;
+       }
+       if (other.classname != "player")
+               return;
+       if (other.health < 1)
+               return;
+       if (!self.cnt)
+               self.nextthink = time + g_nexball_delay_idle;
+
+       self.pusher = other;
+       self.team = other.team;
+
+       if (g_nexball_football_physics == -1) { // MrBougo try 1, before decompiling Rev's original
+               if (vlen(other.velocity))
+                       self.velocity = other.velocity * 1.5 + '0 0 1' * g_nexball_football_boost_up;
+       } else if (g_nexball_football_physics == 1) { // MrBougo's modded Rev style: partially independant of the height of the aiming point
+               makevectors(other.v_angle);
+               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + '0 0 1' * g_nexball_football_boost_up;
+       } else if (g_nexball_football_physics == 2) { // 2nd mod try: totally independant. Really playable!
+               makevectors(other.v_angle_y * '0 1 0');
+               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + v_up * g_nexball_football_boost_up;
+       } else { // Revenant's original style (from the original mod's disassembly, acknowledged by Revenant)
+               makevectors(other.v_angle);
+               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + v_up * g_nexball_football_boost_up;
+       }
+       self.avelocity = -250 * v_forward;  // maybe there is a way to make it look better?
+}
+
+void basketball_touch (void)
+{
+       if (other.ballcarried)
+       {
+               football_touch();
+               return;
+       }
+       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);
+               GiveBall(other, self);
+       } else if (other.solid == SOLID_BSP) {
+               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+               if (vlen(self.velocity) && !self.cnt)
+                       self.nextthink = min(time + g_nexball_delay_idle, self.teamtime);
+       }
+}
+
+void GoalTouch (void)
+{
+       entity ball;
+       float isclient, pscore, otherteam;
+       string pname;
+
+       if (gameover) return;
+       if ((self.spawnflags & GOAL_TOUCHPLAYER) && other.ballcarried)
+               ball = other.ballcarried;
+       else
+               ball = other;
+       if (ball.classname != "nexball_basketball")
+       if (ball.classname != "nexball_football")
+               return;
+       if ((!ball.pusher && self.team != GOAL_OUT) || ball.cnt)
+               return;
+       EXACTTRIGGER_TOUCH;
+
+
+       if(nb_teams == 2)
+               otherteam = OtherTeam(ball.team);
+
+       if((isclient = ball.pusher.flags & FL_CLIENT))
+               pname = ball.pusher.netname;
+       else
+               pname = "Someone (?)";
+
+       if        (ball.team == self.team) //owngoal (regular goals)
+       {
+               LogNB("owngoal", ball.pusher);
+               bprint("Boo! ", pname, "^7 scored a goal against their own team!\n");
+               pscore = -1;
+       } else if (self.team == GOAL_FAULT) {
+               LogNB("fault", ball.pusher);
+               if (nb_teams == 2)
+                       bprint(ColoredTeamName(otherteam), " gets a point due to ", pname, "^7's silliness.\n");
+               else
+                       bprint(ColoredTeamName(ball.team), " loses a point due to ", pname, "^7's silliness.\n");
+               pscore = -1;
+       } else if (self.team == GOAL_OUT) {
+               LogNB("out", ball.pusher);
+               if ((self.spawnflags & GOAL_TOUCHPLAYER) && ball.owner)
+                       bprint(pname, "^7 went out of bounds.\n");
+               else
+                       bprint("The ball was returned.\n");
+               pscore = 0;
+       } else {                           //score
+               LogNB(strcat("goal:", ftos(self.team)), ball.pusher);
+               bprint("Goaaaaal! ", pname, "^7 scored a point for the ", ColoredTeamName(ball.team), ".\n");
+               pscore = 1;
+       }
+
+       sound (ball, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
+
+       if(ball.team && pscore)
+       {
+               if (nb_teams == 2 && pscore < 0)
+                       TeamScore_AddToTeam(otherteam, ST_NEXBALL_GOALS, -pscore);
+               else
+                       TeamScore_AddToTeam(ball.team, ST_NEXBALL_GOALS, pscore);
+       }
+       if (isclient)
+       {
+               if (pscore > 0)
+                       PlayerScore_Add(ball.pusher, SP_NEXBALL_GOALS, pscore);
+               else if (pscore < 0)
+                       PlayerScore_Add(ball.pusher, SP_NEXBALL_FAULTS, -pscore);
+       }
+
+       if (ball.owner) // Happens on spawnflag GOAL_TOUCHPLAYER
+               DropBall(ball, ball.owner.origin, ball.owner.velocity);
+
+       WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
+
+       ball.cnt = 1;
+       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 + autocvar_g_nexball_delay_goal * (self.team != GOAL_OUT);
+}
+
+//=======================//
+//       team ents       //
+//=======================//
+void spawnfunc_nexball_team (void)
+{
+       if(!g_nexball) { remove(self); return; }
+       self.team = self.cnt + 1;
+}
+
+void nb_spawnteam (string teamname, float teamcolor)
+{
+       dprint("^2spawned team ", teamname, "\n");
+       entity e;
+       e = spawn();
+       e.classname = "nexball_team";
+       e.netname = teamname;
+       e.cnt = teamcolor;
+       e.team = e.cnt + 1;
+       nb_teams += 1;
+}
+
+void nb_spawnteams (void)
+{
+       float t_r, t_b, t_y, t_p;
+       entity e;
+       for(e = world; (e = find(e, classname, "nexball_goal")); )
+       {
+               switch(e.team)
+               {
+                       case COLOR_TEAM1: if(!t_r) { nb_spawnteam ("Red", e.team-1)   ; t_r = 1; } break;
+                       case COLOR_TEAM2: if(!t_b) { nb_spawnteam ("Blue", e.team-1)  ; t_b = 1; } break;
+                       case COLOR_TEAM3: if(!t_y) { nb_spawnteam ("Yellow", e.team-1); t_y = 1; } break;
+                       case COLOR_TEAM4: if(!t_p) { nb_spawnteam ("Pink", e.team-1)  ; t_p = 1; } break;
+               }
+       }
+}
+
+void nb_delayedinit (void)
+{
+       if (find(world, classname, "nexball_team") == world)
+               nb_spawnteams();
+       ScoreRules_nexball(nb_teams);
+}
+
+
+//=======================//
+//      spawnfuncs       //
+//=======================//
+
+void SpawnBall (void)
+{
+       if(!g_nexball) { remove(self); return; }
+
+//     balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine
+
+       if (!self.model) {
+               self.model = "models/nexball/ball.md3";
+               self.scale = 1.3;
+       }
+
+       precache_model (self.model);
+       setmodel (self, self.model);
+       setsize (self, BALL_MINS, BALL_MAXS);
+       ball_scale = self.scale;
+
+       relocate_nexball();
+       self.spawnorigin = self.origin;
+
+       self.effects = self.effects | EF_LOWPRECISION;
+
+       if (cvar(strcat("g_", self.classname, "_trail"))) //nexball_basketball :p
+       {
+               self.glow_color = autocvar_g_nexball_trail_color;
+               self.glow_trail = TRUE;
+       }
+
+       self.movetype = MOVETYPE_FLY;
+
+       if (!autocvar_g_nexball_sound_bounce)
+               self.noise = "";
+       else if (!self.noise)
+               self.noise = "sound/nexball/bounce.wav";
+               //bounce sound placeholder (FIXME)
+       if (!self.noise1)
+               self.noise1 = "sound/nexball/drop.wav";
+               //ball drop sound placeholder (FIXME)
+       if (!self.noise2)
+               self.noise2 = "sound/nexball/steal.wav";
+               //stealing sound placeholder (FIXME)
+       if (self.noise) precache_sound (self.noise);
+       precache_sound (self.noise1);
+       precache_sound (self.noise2);
+
+       WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
+
+       self.reset = ball_restart;
+       self.think = InitBall;
+       self.nextthink = game_starttime + autocvar_g_nexball_delay_start;
+}
+
+void spawnfunc_nexball_basketball (void)
+{
+       self.classname = "nexball_basketball";
+       if not(balls & BALL_BASKET)
+       {
+               CVTOV(g_nexball_basketball_effects_default);
+               CVTOV(g_nexball_basketball_delay_hold);
+               CVTOV(g_nexball_basketball_delay_hold_forteam);
+               CVTOV(g_nexball_basketball_teamsteal);
+               g_nexball_basketball_effects_default = g_nexball_basketball_effects_default & BALL_EFFECTMASK;
+       }
+       if (!self.effects)
+               self.effects = g_nexball_basketball_effects_default;
+       self.solid = SOLID_TRIGGER;
+       balls |= BALL_BASKET;
+       self.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
+       self.bouncestop = autocvar_g_nexball_basketball_bouncestop;
+       SpawnBall();
+}
+
+void spawnfunc_nexball_football (void)
+{
+       self.classname = "nexball_football";
+       self.solid = SOLID_TRIGGER;
+       balls |= BALL_FOOT;
+       self.bouncefactor = autocvar_g_nexball_football_bouncefactor;
+       self.bouncestop = autocvar_g_nexball_football_bouncestop;
+       SpawnBall();
+}
+
+void SpawnGoal (void)
+{
+       if(!g_nexball) { remove(self); return; }
+       EXACTTRIGGER_INIT;
+       self.classname = "nexball_goal";
+       if (!self.noise)
+               self.noise = "ctf/respawn.wav";
+       precache_sound(self.noise);
+       self.touch = GoalTouch;
+}
+
+void spawnfunc_nexball_redgoal (void)
+{
+       self.team = COLOR_TEAM1;
+       SpawnGoal();
+}
+void spawnfunc_nexball_bluegoal (void)
+{
+       self.team = COLOR_TEAM2;
+       SpawnGoal();
+}
+void spawnfunc_nexball_yellowgoal (void)
+{
+       self.team = COLOR_TEAM3;
+       SpawnGoal();
+}
+void spawnfunc_nexball_pinkgoal (void)
+{
+       self.team = COLOR_TEAM4;
+       SpawnGoal();
+}
+
+void spawnfunc_nexball_fault (void)
+{
+       self.team = GOAL_FAULT;
+       if (!self.noise)
+               self.noise = "misc/typehit.wav";
+       SpawnGoal();
+}
+
+void spawnfunc_nexball_out (void)
+{
+       self.team = GOAL_OUT;
+       if (!self.noise)
+               self.noise = "misc/typehit.wav";
+       SpawnGoal();
+}
+
+//
+//Spawnfuncs preserved for compatibility
+//
+
+void spawnfunc_ball            (void) { spawnfunc_nexball_football(); }
+void spawnfunc_ball_football   (void) { spawnfunc_nexball_football(); }
+void spawnfunc_ball_basketball (void) { spawnfunc_nexball_basketball(); }
+// The "red goal" is defended by blue team. A ball in there counts as a point for red.
+void spawnfunc_ball_redgoal    (void) { spawnfunc_nexball_bluegoal(); } // I blame Revenant
+void spawnfunc_ball_bluegoal   (void) { spawnfunc_nexball_redgoal(); }  // but he didn't mean to cause trouble :p
+void spawnfunc_ball_fault      (void) { spawnfunc_nexball_fault(); }
+void spawnfunc_ball_bound      (void) { spawnfunc_nexball_out(); }
+
+//=======================//
+//      Weapon code      //
+//=======================//
+
+void W_Nexball_Touch (void)
+{
+       entity ball, attacker;
+       attacker = self.owner;
+
+       PROJECTILE_TOUCH;
+       if(attacker.team != other.team || g_nexball_basketball_teamsteal)
+       if((ball = other.ballcarried) && (attacker.classname == "player"))
+       {
+               other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
+               other.flags &~= FL_ONGROUND;
+               if(!attacker.ballcarried)
+               {
+                       LogNB("stole", attacker);
+                       sound (other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTN_NORM);
+
+                       if(attacker.team == other.team && time > attacker.teamkill_complain)
+                       {
+                               attacker.teamkill_complain = time + 5;
+                               attacker.teamkill_soundtime = time + 0.4;
+                               attacker.teamkill_soundsource = other;
+                       }
+
+                       GiveBall(attacker, other.ballcarried);
+               }
+       }
+       remove(self);
+}
+
+void W_Nexball_Attack (float t)
+{
+       entity ball;
+       float mul, mi, ma;
+       if (!(ball = self.ballcarried))
+               return;
+
+       W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
+       tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
+       if(trace_startsolid)
+       {
+               if(self.metertime)
+                       self.metertime = 0; // Shot failed, hide the power meter
+               return;
+       }
+
+       //Calculate multiplier
+       if (t < 0)
+               mul = 1;
+       else
+       {
+               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 * autocvar_g_balance_nexball_primary_speed * mul, FALSE));
+       //TODO: use the speed_up cvar too ??
+}
+
+void W_Nexball_Attack2 (void)
+{
+       entity missile;
+       if (!(balls & BALL_BASKET))
+               return;
+       W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
+//     pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+       missile = spawn ();
+
+       missile.owner = self;
+       missile.classname = "ballstealer";
+
+       missile.movetype = MOVETYPE_FLY;
+       PROJECTILE_MAKETRIGGER(missile);
+
+       setmodel (missile, "models/elaser.mdl"); // precision set below
+       setsize (missile, '0 0 0', '0 0 0');
+       setorigin (missile, w_shotorg);
+
+       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 + autocvar_g_balance_nexball_secondary_lifetime; //FIXME: use a distance instead?
+
+       missile.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
+       missile.flags = FL_PROJECTILE;
+}
+
+float w_nexball_weapon(float req)
+{
+       if (req == WR_THINK)
+       {
+               if (self.BUTTON_ATCK)
+               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, autocvar_g_balance_nexball_primary_animtime, w_ready);
+               }
+               else
+               {
+                       W_Nexball_Attack(-1);
+                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
+               }
+               if (self.BUTTON_ATCK2)
+               if (weapon_prepareattack(1, autocvar_g_balance_nexball_secondary_refire))
+               {
+                       W_Nexball_Attack2();
+                       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, autocvar_g_balance_nexball_primary_animtime, w_ready);
+               }
+       }
+       else if (req == WR_PRECACHE)
+       {
+               precache_model ("models/weapons/g_porto.md3");
+               precache_model ("models/weapons/v_porto.md3");
+               precache_model ("models/weapons/h_porto.iqm");
+               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);
+       else if (req == WR_SUICIDEMESSAGE)
+       {
+               w_deathtypestring = "is a weirdo";
+       }
+       else if (req == WR_KILLMESSAGE)
+       {
+               w_deathtypestring = "got killed by #'s black magic";
+       }
+       // No need to check WR_CHECKAMMO* or WR_AIM, it should always return TRUE
+       return TRUE;
+}
index ada824caa69b9d87239f51924a8365f973079d5d..848cbe030ade9d591442d107acd5095a1db1cdda 100644 (file)
@@ -404,8 +404,7 @@ void PutObserverInServer (void)
        DropAllRunes(self);
        MUTATOR_CALLHOOK(MakePlayerObserver);
 
-       if (g_minstagib)
-               minstagib_stop_countdown();
+       minstagib_stop_countdown(self);
 
        Portal_ClearAll(self);
 
@@ -421,9 +420,6 @@ void PutObserverInServer (void)
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
 
-       if(self.ballcarried && g_nexball)
-               DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
-
        WaypointSprite_PlayerDead();
 
        if not(g_ca)  // don't reset teams when moving a ca player to the spectators
@@ -1658,8 +1654,6 @@ void ClientDisconnect (void)
        RemoveGrapplingHook(self);
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
-       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.
 
index 07dc0788b341ebf88d0750271f4e0214fcc92c70..5a162742387c471883838d67a24a478e21357786 100644 (file)
@@ -702,8 +702,6 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        else
                                DropFlag(self.flagcarried, world, attacker);
                }
-               if(self.ballcarried && g_nexball)
-                       DropBall(self.ballcarried, self.origin, self.velocity);
                Portal_ClearAllLater(self);
 
                if(clienttype(self) == CLIENTTYPE_REAL)
index fac0d73aa2cbf09b30f36ed949e7bb97a9d26085..4a12ce1850323e10f7b11282a76874cb0f426e66 100644 (file)
@@ -318,7 +318,7 @@ float W_IsWeaponThrowable(float w)
                return 0;
        if (g_cts)
                return 0;
-       if (g_nexball && w == WEP_PORTO)
+       if (g_nexball && w == WEP_GRENADE_LAUNCHER)
                return 0;
 
        wb = W_WeaponBit(w);
index 97313ca17fd44870a3ea7228b2b7457f985f2866..4cd4f11569144ef63bed3ae7a0db04c0803f5817 100644 (file)
@@ -185,7 +185,7 @@ void VoteSpam(float notvoters, float mincount, string result)
        }
 }
 
-void VoteCount() 
+void VoteCount(float first_count
 {
        // declarations
        vote_accept_count = vote_reject_count = vote_abstain_count = 0;
@@ -250,8 +250,15 @@ void VoteCount()
        vote_factor_of_voted = bound(0.5, autocvar_sv_vote_majority_factor_of_voted, 0.999);
        vote_needed_of_voted = floor((vote_accept_count + vote_reject_count) * vote_factor_of_voted) + 1;
        
+       // are there any players at all on the server? it could be an admin vote
+       if(vote_player_count == 0 && first_count)
+       {
+               VoteSpam(0, -1, "yes"); // no players at all, just accept it 
+               VoteAccept();
+               return;
+       }
        
-       // finally calculate the result of the vote     
+       // since there ARE players, finally calculate the result of the vote    
        if(vote_accept_count >= vote_needed_overall)
        {
                VoteSpam(notvoters, -1, "yes"); // there is enough acceptions to pass the vote
@@ -301,7 +308,7 @@ void VoteThink()
        if(vote_endtime > 0) // a vote was called
        if(time > vote_endtime) // time is up
        {
-               VoteCount();
+               VoteCount(FALSE);
        }
        
        return;
@@ -602,7 +609,7 @@ void VoteCommand_abstain(float request, entity caller) // CLIENT ONLY
                                print_to(caller, "^1You abstained from your vote.");
                                caller.vote_selection = VOTE_SELECT_ABSTAIN;
                                msg_entity = caller;
-                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
                        }
                        
                        return;
@@ -662,7 +669,7 @@ void VoteCommand_call(float request, entity caller, float argc, string vote_comm
                                bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote for ", vote_called_display, "\n");
                                if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
                                Nagger_VoteChanged();
-                               VoteCount(); // needed if you are the only one
+                               VoteCount(TRUE); // needed if you are the only one
                        }
                        
                        return;
@@ -751,7 +758,7 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co
                                                        bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote to become ^3master^2.\n");
                                                        if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
                                                        Nagger_VoteChanged();
-                                                       VoteCount(); // needed if you are the only one
+                                                       VoteCount(TRUE); // needed if you are the only one
                                                }
                                                
                                                return;
@@ -789,7 +796,7 @@ void VoteCommand_no(float request, entity caller) // CLIENT ONLY
                                print_to(caller, "^1You rejected the vote.");
                                caller.vote_selection = VOTE_SELECT_REJECT;
                                msg_entity = caller;
-                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
                        }
                        
                        return;
@@ -866,7 +873,7 @@ void VoteCommand_yes(float request, entity caller) // CLIENT ONLY
                                print_to(caller, "^1You accepted the vote.");
                                caller.vote_selection = VOTE_SELECT_ACCEPT;
                                msg_entity = caller;
-                               if(!autocvar_sv_vote_singlecount) { VoteCount(); }
+                               if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
                        }
                        
                        return;
index 26fd254f1a4c72cb223f1ece3147406e4330b9e7..a46c8f7e7119aad27b12b28b3692b657c0372ee0 100644 (file)
@@ -342,7 +342,6 @@ string gamemode_name;
 float startitem_failed;
 
 void DropFlag(entity flag, entity penalty_receiver, entity attacker);
-void DropBall(entity ball, vector org, vector vel);
 void DropAllRunes(entity pl);
 
 
index 0c5a5ee8dca028bb6354225bc407e1fc33ea47c3..6f0e631ea50fd6db8cddb2a7f9afb4f4064f3026 100644 (file)
@@ -1537,7 +1537,7 @@ void FixIntermissionClient(entity e)
        }
 }
 
-
+void minstagib_stop_countdown(entity e);
 /*
 go to the next level for deathmatch
 only called if a time or frag limit has expired
@@ -1581,6 +1581,7 @@ void NextLevel()
        GameLogClose();
 
        FOR_EACH_PLAYER(other) {
+               minstagib_stop_countdown(other);
                FixIntermissionClient(other);
                if(other.winning)
                        bprint(other.netname, " ^7wins.\n");
index 060fa62689b721379829763b3701584a202a4846..7065542b1902db6b65b7faa35612b55d854aa5eb 100644 (file)
@@ -796,10 +796,6 @@ float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
                        t |= (i == WEP_HOOK);
        }
 
-       // we cannot disable porto in Nexball, we must force it
-       if(g_nexball && i == WEP_PORTO)
-               t = 1;
-
        return t;
 }
 
diff --git a/qcsrc/server/mutators/gamemode_nexball.qc b/qcsrc/server/mutators/gamemode_nexball.qc
new file mode 100644 (file)
index 0000000..8554a12
--- /dev/null
@@ -0,0 +1,983 @@
+float autocvar_g_nexball_safepass_turnrate;
+float autocvar_g_nexball_safepass_maxdist;
+float autocvar_g_nexball_safepass_holdtime;
+float autocvar_g_nexball_viewmodel_scale;
+float autocvar_g_nexball_tackling;
+vector autocvar_g_nexball_viewmodel_offset;
+
+void basketball_touch();
+void football_touch();
+void ResetBall();
+#define NBM_NONE 0
+#define NBM_FOOTBALL 2
+#define NBM_BASKETBALL 4
+float nexball_mode;
+
+float OtherTeam(float t)  //works only if there are two teams on the map!
+{
+       entity e;
+       e = find(world, classname, "nexball_team");
+       if(e.team == t)
+               e = find(e, classname, "nexball_team");
+       return e.team;
+}
+
+
+void LogNB(string mode, entity actor)
+{
+       string s;
+       if(!autocvar_sv_eventlog)
+               return;
+       s = strcat(":nexball:", mode);
+       if(actor != world)
+               s = strcat(s, ":", ftos(actor.playerid));
+       GameLogEcho(s);
+}
+
+void ball_restart(void)
+{
+       if(self.owner)
+               DropBall(self, self.owner.origin, '0 0 0');
+       ResetBall();
+}
+
+void nexball_setstatus(void)
+{
+       entity oldself;
+       self.items &~= IT_KEY1;
+       if(self.ballcarried)
+       {
+               if(self.ballcarried.teamtime && (self.ballcarried.teamtime < time))
+               {
+                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
+                       oldself = self;
+                       self = self.ballcarried;
+                       DropBall(self, self.owner.origin, '0 0 0');
+                       ResetBall();
+                       self = oldself;
+               }
+               else
+                       self.items |= IT_KEY1;
+       }
+}
+
+void relocate_nexball(void)
+{
+       tracebox(self.origin, BALL_MINS, BALL_MAXS, self.origin, TRUE, self);
+       if(trace_startsolid)
+       {
+               vector o;
+               o = self.origin;
+               if(!move_out_of_solid(self))
+                       objerror("could not get out of solid at all!");
+               print("^1NOTE: this map needs FIXING. ", self.classname, " at ", vtos(o - '0 0 1'));
+               print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
+               print(" ", ftos(self.origin_y - o_y));
+               print(" ", ftos(self.origin_z - o_z), "'\n");
+               self.origin = o;
+       }
+}
+
+void DropOwner(void)
+{
+       entity ownr;
+       ownr = self.owner;
+       DropBall(self, ownr.origin, ownr.velocity);
+       makevectors(ownr.v_angle_y * '0 1 0');
+       ownr.velocity += ('0 0 0.75' - v_forward) * 1000;
+       ownr.flags &~= FL_ONGROUND;
+}
+
+void GiveBall(entity plyr, entity ball)
+{
+       entity ownr;
+
+       if((ownr = ball.owner))
+       {
+               ownr.effects &~= autocvar_g_nexball_basketball_effects_default;
+               ownr.ballcarried = world;
+               if(ownr.metertime)
+               {
+                       ownr.metertime = 0;
+                       ownr.weaponentity.state = WS_READY;
+               }
+               WaypointSprite_Kill(ownr.waypointsprite_attachedforcarrier);
+       }
+       else
+       {
+               WaypointSprite_Kill(ball.waypointsprite_attachedforcarrier);
+       }
+       
+       //setattachment(ball, plyr, "");
+       setorigin(ball, plyr.origin + plyr.view_ofs);
+
+       if(ball.team != plyr.team)
+               ball.teamtime = time + autocvar_g_nexball_basketball_delay_hold_forteam;
+
+       ball.owner = ball.pusher = plyr; //"owner" is set to the player carrying, "pusher" to the last player who touched it
+       ball.team = plyr.team;
+       plyr.ballcarried = ball;
+       ball.dropperid = plyr.playerid;
+
+       plyr.effects |= autocvar_g_nexball_basketball_effects_default;
+       ball.effects &~= autocvar_g_nexball_basketball_effects_default;
+
+       ball.velocity = '0 0 0';
+       ball.movetype = MOVETYPE_NONE;
+       ball.touch = SUB_Null;
+       ball.effects |= EF_NOSHADOW;
+       ball.scale = 1; // scale down.
+
+       WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+       WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       if(autocvar_g_nexball_basketball_delay_hold)
+       {
+               ball.think = DropOwner;
+               ball.nextthink = time + autocvar_g_nexball_basketball_delay_hold;
+       }
+       
+    ownr = self;
+    self = plyr;    
+    self.weaponentity.weapons = self.weapons;
+    self.weaponentity.switchweapon = self.weapon;
+    self.weapons = W_WeaponBit(WEP_PORTO);      
+    weapon_action(WEP_PORTO, WR_RESETPLAYER);
+    self.switchweapon = WEP_PORTO;
+    W_SwitchWeapon(WEP_PORTO);
+    self = ownr;
+}
+
+void DropBall(entity ball, vector org, vector vel)
+{
+       ball.effects |= autocvar_g_nexball_basketball_effects_default;
+       ball.effects &~= EF_NOSHADOW;
+       ball.owner.effects &~= autocvar_g_nexball_basketball_effects_default;
+
+       setattachment(ball, world, "");
+       setorigin(ball, org);
+       ball.movetype = MOVETYPE_BOUNCE;
+       ball.flags &~= FL_ONGROUND;
+       ball.scale = ball_scale;
+       ball.velocity = vel;
+       ball.ctf_droptime = time;
+       ball.touch = basketball_touch;
+       ball.think = ResetBall;
+       ball.nextthink = min(time + autocvar_g_nexball_delay_idle, ball.teamtime);
+
+       if(ball.owner.metertime)
+       {
+               ball.owner.metertime = 0;
+               ball.owner.weaponentity.state = WS_READY;
+       }
+
+       WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
+       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
+       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       ball.owner.ballcarried = world;
+       ball.owner = world;
+}
+
+void InitBall(void)
+{
+       if(gameover) return;
+       self.flags &~= FL_ONGROUND;
+       self.movetype = MOVETYPE_BOUNCE;
+       if(self.classname == "nexball_basketball")
+               self.touch = basketball_touch;
+       else if(self.classname == "nexball_football")
+               self.touch = football_touch;
+       self.cnt = 0;
+       self.think = ResetBall;
+       self.nextthink = time + autocvar_g_nexball_delay_idle + 3;
+       self.teamtime = 0;
+       self.pusher = world;
+       self.team = FALSE;
+       sound(self, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+       WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
+       LogNB("init", world);
+}
+
+void ResetBall(void)
+{
+       if(self.cnt < 2)    // step 1
+       {
+               if(time == self.teamtime)
+                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
+               self.touch = SUB_Null;
+               self.movetype = MOVETYPE_NOCLIP;
+               self.velocity = '0 0 0'; // just in case?
+               if(!self.cnt)
+                       LogNB("resetidle", world);
+               self.cnt = 2;
+               self.nextthink = time;
+       }
+       else if(self.cnt < 4)      // step 2 and 3
+       {
+//             dprint("Step ", ftos(self.cnt), ": Calculated velocity: ", vtos(self.spawnorigin - self.origin), ", time: ", ftos(time), "\n");
+               self.velocity = (self.spawnorigin - self.origin) * (self.cnt - 1); // 1 or 0.5 second movement
+               self.nextthink = time + 0.5;
+               self.cnt += 1;
+       }
+       else     // step 4
+       {
+//             dprint("Step 4: time: ", ftos(time), "\n");
+               if(vlen(self.origin - self.spawnorigin) > 10)  // should not happen anymore
+                       dprint("The ball moved too far away from its spawn origin.\nOffset: ",
+                                  vtos(self.origin - self.spawnorigin), " Velocity: ", vtos(self.velocity), "\n");
+               self.velocity = '0 0 0';
+               setorigin(self, self.spawnorigin); // make sure it's positioned correctly anyway
+               self.movetype = MOVETYPE_NONE;
+               self.think = InitBall;
+               self.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
+       }
+}
+
+void football_touch(void)
+{
+       if(other.solid == SOLID_BSP)
+       {
+               if(time > self.lastground + 0.1)
+               {
+                       sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+                       self.lastground = time;
+               }
+               if(vlen(self.velocity) && !self.cnt)
+                       self.nextthink = time + autocvar_g_nexball_delay_idle;
+               return;
+       }
+       if(other.classname != "player")
+               return;
+       if(other.health < 1)
+               return;
+       if(!self.cnt)
+               self.nextthink = time + autocvar_g_nexball_delay_idle;
+
+       self.pusher = other;
+       self.team = other.team;
+
+       if(autocvar_g_nexball_football_physics == -1)    // MrBougo try 1, before decompiling Rev's original
+       {
+               if(vlen(other.velocity))
+                       self.velocity = other.velocity * 1.5 + '0 0 1' * autocvar_g_nexball_football_boost_up;
+       }
+       else if(autocvar_g_nexball_football_physics == 1)      // MrBougo's modded Rev style: partially independant of the height of the aiming point
+       {
+               makevectors(other.v_angle);
+               self.velocity = other.velocity + v_forward * autocvar_g_nexball_football_boost_forward + '0 0 1' * autocvar_g_nexball_football_boost_up;
+       }
+       else if(autocvar_g_nexball_football_physics == 2)      // 2nd mod try: totally independant. Really playable!
+       {
+               makevectors(other.v_angle_y * '0 1 0');
+               self.velocity = other.velocity + v_forward * autocvar_g_nexball_football_boost_forward + v_up * autocvar_g_nexball_football_boost_up;
+       }
+       else     // Revenant's original style (from the original mod's disassembly, acknowledged by Revenant)
+       {
+               makevectors(other.v_angle);
+               self.velocity = other.velocity + v_forward * autocvar_g_nexball_football_boost_forward + v_up * autocvar_g_nexball_football_boost_up;
+       }
+       self.avelocity = -250 * v_forward;  // maybe there is a way to make it look better?
+}
+
+void basketball_touch(void)
+{
+       if(other.ballcarried)
+       {
+               football_touch();
+               return;
+       }
+       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);
+               GiveBall(other, self);
+       }
+       else if(other.solid == SOLID_BSP)
+       {
+               sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+               if(vlen(self.velocity) && !self.cnt)
+                       self.nextthink = min(time + autocvar_g_nexball_delay_idle, self.teamtime);
+       }
+}
+
+void GoalTouch(void)
+{
+       entity ball;
+       float isclient, pscore, otherteam;
+       string pname;
+
+       if(gameover) return;
+       if((self.spawnflags & GOAL_TOUCHPLAYER) && other.ballcarried)
+               ball = other.ballcarried;
+       else
+               ball = other;
+       if(ball.classname != "nexball_basketball")
+               if(ball.classname != "nexball_football")
+                       return;
+       if((!ball.pusher && self.team != GOAL_OUT) || ball.cnt)
+               return;
+       EXACTTRIGGER_TOUCH;
+
+
+       if(nb_teams == 2)
+               otherteam = OtherTeam(ball.team);
+
+       if((isclient = ball.pusher.flags & FL_CLIENT))
+               pname = ball.pusher.netname;
+       else
+               pname = "Someone (?)";
+
+       if(ball.team == self.team)         //owngoal (regular goals)
+       {
+               LogNB("owngoal", ball.pusher);
+               bprint("Boo! ", pname, "^7 scored a goal against their own team!\n");
+               pscore = -1;
+       }
+       else if(self.team == GOAL_FAULT)
+       {
+               LogNB("fault", ball.pusher);
+               if(nb_teams == 2)
+                       bprint(ColoredTeamName(otherteam), " gets a point due to ", pname, "^7's silliness.\n");
+               else
+                       bprint(ColoredTeamName(ball.team), " loses a point due to ", pname, "^7's silliness.\n");
+               pscore = -1;
+       }
+       else if(self.team == GOAL_OUT)
+       {
+               LogNB("out", ball.pusher);
+               if((self.spawnflags & GOAL_TOUCHPLAYER) && ball.owner)
+                       bprint(pname, "^7 went out of bounds.\n");
+               else
+                       bprint("The ball was returned.\n");
+               pscore = 0;
+       }
+       else                               //score
+       {
+               LogNB(strcat("goal:", ftos(self.team)), ball.pusher);
+               bprint("Goaaaaal! ", pname, "^7 scored a point for the ", ColoredTeamName(ball.team), ".\n");
+               pscore = 1;
+       }
+
+       sound(ball, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
+
+       if(ball.team && pscore)
+       {
+               if(nb_teams == 2 && pscore < 0)
+                       TeamScore_AddToTeam(otherteam, ST_NEXBALL_GOALS, -pscore);
+               else
+                       TeamScore_AddToTeam(ball.team, ST_NEXBALL_GOALS, pscore);
+       }
+       if(isclient)
+       {
+               if(pscore > 0)
+                       PlayerScore_Add(ball.pusher, SP_NEXBALL_GOALS, pscore);
+               else if(pscore < 0)
+                       PlayerScore_Add(ball.pusher, SP_NEXBALL_FAULTS, -pscore);
+       }
+
+       if(ball.owner)  // Happens on spawnflag GOAL_TOUCHPLAYER
+               DropBall(ball, ball.owner.origin, ball.owner.velocity);
+
+       WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
+
+       ball.cnt = 1;
+       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 + autocvar_g_nexball_delay_goal * (self.team != GOAL_OUT);
+}
+
+//=======================//
+//       team ents       //
+//=======================//
+void spawnfunc_nexball_team(void)
+{
+       if(!g_nexball)
+       {
+               remove(self);
+               return;
+       }
+       self.team = self.cnt + 1;
+}
+
+void nb_spawnteam(string teamname, float teamcolor)
+{
+       dprint("^2spawned team ", teamname, "\n");
+       entity e;
+       e = spawn();
+       e.classname = "nexball_team";
+       e.netname = teamname;
+       e.cnt = teamcolor;
+       e.team = e.cnt + 1;
+       nb_teams += 1;
+}
+
+void nb_spawnteams(void)
+{
+       float t_r, t_b, t_y, t_p;
+       entity e;
+       for(e = world; (e = find(e, classname, "nexball_goal"));)
+       {
+               switch(e.team)
+               {
+               case COLOR_TEAM1:
+                       if(!t_r)
+                       {
+                               nb_spawnteam("Red", e.team-1)   ;
+                               t_r = 1;
+                       }
+                       break;
+               case COLOR_TEAM2:
+                       if(!t_b)
+                       {
+                               nb_spawnteam("Blue", e.team-1)  ;
+                               t_b = 1;
+                       }
+                       break;
+               case COLOR_TEAM3:
+                       if(!t_y)
+                       {
+                               nb_spawnteam("Yellow", e.team-1);
+                               t_y = 1;
+                       }
+                       break;
+               case COLOR_TEAM4:
+                       if(!t_p)
+                       {
+                               nb_spawnteam("Pink", e.team-1)  ;
+                               t_p = 1;
+                       }
+                       break;
+               }
+       }
+}
+
+void nb_delayedinit(void)
+{
+       if(find(world, classname, "nexball_team") == world)
+               nb_spawnteams();
+       ScoreRules_nexball(nb_teams);
+}
+
+
+//=======================//
+//      spawnfuncs       //
+//=======================//
+
+void SpawnBall(void)
+{
+       if(!g_nexball)
+       {
+               remove(self);
+               return;
+       }
+
+//     balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine
+
+       if(!self.model)
+       {
+               self.model = "models/nexball/ball.md3";
+               self.scale = 1.3;
+       }
+
+       precache_model(self.model);
+       setmodel(self, self.model);
+       setsize(self, BALL_MINS, BALL_MAXS);
+       ball_scale = self.scale;
+
+       relocate_nexball();
+       self.spawnorigin = self.origin;
+
+       self.effects = self.effects | EF_LOWPRECISION;
+
+       if(cvar(strcat("g_", self.classname, "_trail")))  //nexball_basketball :p
+       {
+               self.glow_color = autocvar_g_nexball_trail_color;
+               self.glow_trail = TRUE;
+       }
+
+       self.movetype = MOVETYPE_FLY;
+
+       if(!autocvar_g_nexball_sound_bounce)
+               self.noise = "";
+       else if(!self.noise)
+               self.noise = "sound/nexball/bounce.wav";
+       //bounce sound placeholder (FIXME)
+       if(!self.noise1)
+               self.noise1 = "sound/nexball/drop.wav";
+       //ball drop sound placeholder (FIXME)
+       if(!self.noise2)
+               self.noise2 = "sound/nexball/steal.wav";
+       //stealing sound placeholder (FIXME)
+       if(self.noise) precache_sound(self.noise);
+       precache_sound(self.noise1);
+       precache_sound(self.noise2);
+
+       WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
+
+       self.reset = ball_restart;
+       self.think = InitBall;
+       self.nextthink = game_starttime + autocvar_g_nexball_delay_start;
+}
+
+void spawnfunc_nexball_basketball(void)
+{
+    nexball_mode |= NBM_BASKETBALL;
+       self.classname = "nexball_basketball";
+       if not(balls & BALL_BASKET)
+       {
+               /*
+               CVTOV(g_nexball_basketball_effects_default);
+               CVTOV(g_nexball_basketball_delay_hold);
+               CVTOV(g_nexball_basketball_delay_hold_forteam);
+               CVTOV(g_nexball_basketball_teamsteal);
+               */
+               autocvar_g_nexball_basketball_effects_default = autocvar_g_nexball_basketball_effects_default & BALL_EFFECTMASK;
+       }
+       if(!self.effects)
+               self.effects = autocvar_g_nexball_basketball_effects_default;
+       self.solid = SOLID_TRIGGER;
+       balls |= BALL_BASKET;
+       self.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
+       self.bouncestop = autocvar_g_nexball_basketball_bouncestop;
+       SpawnBall();
+}
+
+void spawnfunc_nexball_football(void)
+{
+    nexball_mode |= NBM_FOOTBALL;
+       self.classname = "nexball_football";
+       self.solid = SOLID_TRIGGER;
+       balls |= BALL_FOOT;
+       self.bouncefactor = autocvar_g_nexball_football_bouncefactor;
+       self.bouncestop = autocvar_g_nexball_football_bouncestop;
+       SpawnBall();
+}
+
+void SpawnGoal(void)
+{
+       if(!g_nexball)
+       {
+               remove(self);
+               return;
+       }
+       EXACTTRIGGER_INIT;
+       self.classname = "nexball_goal";
+       if(!self.noise)
+               self.noise = "ctf/respawn.wav";
+       precache_sound(self.noise);
+       self.touch = GoalTouch;
+}
+
+void spawnfunc_nexball_redgoal(void)
+{
+       self.team = COLOR_TEAM1;
+       SpawnGoal();
+}
+void spawnfunc_nexball_bluegoal(void)
+{
+       self.team = COLOR_TEAM2;
+       SpawnGoal();
+}
+void spawnfunc_nexball_yellowgoal(void)
+{
+       self.team = COLOR_TEAM3;
+       SpawnGoal();
+}
+void spawnfunc_nexball_pinkgoal(void)
+{
+       self.team = COLOR_TEAM4;
+       SpawnGoal();
+}
+
+void spawnfunc_nexball_fault(void)
+{
+       self.team = GOAL_FAULT;
+       if(!self.noise)
+               self.noise = "misc/typehit.wav";
+       SpawnGoal();
+}
+
+void spawnfunc_nexball_out(void)
+{
+       self.team = GOAL_OUT;
+       if(!self.noise)
+               self.noise = "misc/typehit.wav";
+       SpawnGoal();
+}
+
+//
+//Spawnfuncs preserved for compatibility
+//
+
+void spawnfunc_ball(void)
+{
+       spawnfunc_nexball_football();
+}
+void spawnfunc_ball_football(void)
+{
+       spawnfunc_nexball_football();
+}
+void spawnfunc_ball_basketball(void)
+{
+       spawnfunc_nexball_basketball();
+}
+// The "red goal" is defended by blue team. A ball in there counts as a point for red.
+void spawnfunc_ball_redgoal(void)
+{
+       spawnfunc_nexball_bluegoal();    // I blame Revenant
+}
+void spawnfunc_ball_bluegoal(void)
+{
+       spawnfunc_nexball_redgoal();    // but he didn't mean to cause trouble :p
+}
+void spawnfunc_ball_fault(void)
+{
+       spawnfunc_nexball_fault();
+}
+void spawnfunc_ball_bound(void)
+{
+       spawnfunc_nexball_out();
+}
+
+//=======================//
+//      Weapon code      //
+//=======================//
+
+
+void W_Nexball_Think()
+{
+    //dprint("W_Nexball_Think\n");
+    //vector new_dir = steerlib_arrive(self.enemy.origin, 2500);
+    vector new_dir = normalize(self.enemy.origin - self.origin);
+    vector old_dir = normalize(self.velocity);     
+    float _speed = vlen(self.velocity);    
+    vector new_vel = normalize(old_dir + (new_dir * autocvar_g_nexball_safepass_turnrate)) * _speed;
+    //vector new_vel = (new_dir * autocvar_g_nexball_safepass_turnrate
+    
+    self.velocity = new_vel;
+    
+    self.nextthink = time;
+}
+
+void W_Nexball_Touch(void)
+{
+       entity ball, attacker;
+       attacker = self.owner;
+    //self.think = SUB_Null;
+    //self.enemy = world;
+    
+       PROJECTILE_TOUCH;
+       if(attacker.team != other.team || autocvar_g_nexball_basketball_teamsteal)
+               if((ball = other.ballcarried) && (attacker.classname == "player"))
+               {
+                       other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
+                       other.flags &~= FL_ONGROUND;
+                       if(!attacker.ballcarried)
+                       {
+                               LogNB("stole", attacker);
+                               sound(other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTN_NORM);
+
+                               if(attacker.team == other.team && time > attacker.teamkill_complain)
+                               {
+                                       attacker.teamkill_complain = time + 5;
+                                       attacker.teamkill_soundtime = time + 0.4;
+                                       attacker.teamkill_soundsource = other;
+                               }
+
+                               GiveBall(attacker, other.ballcarried);
+                       }
+               }
+       remove(self);
+}
+
+void W_Nexball_Attack(float t)
+{
+       entity ball;
+       float mul, mi, ma;
+       if(!(ball = self.ballcarried))
+               return;
+
+       W_SetupShot(self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
+       tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
+       if(trace_startsolid)
+       {
+               if(self.metertime)
+                       self.metertime = 0; // Shot failed, hide the power meter
+               return;
+       }
+
+       //Calculate multiplier
+       if(t < 0)
+               mul = 1;
+       else
+       {
+               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 * autocvar_g_balance_nexball_primary_speed * mul, FALSE));
+       
+
+       //TODO: use the speed_up cvar too ??
+}
+
+void W_Nexball_Attack2(void)
+{
+       if(self.ballcarried.enemy)
+       {
+           entity _ball = self.ballcarried;
+        W_SetupShot(self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
+           DropBall(_ball, w_shotorg, trigger_push_calculatevelocity(_ball.origin, _ball.enemy, 32));
+        _ball.think = W_Nexball_Think;
+        _ball.nextthink = time;
+           return;
+       }
+    
+    if(!autocvar_g_nexball_tackling)
+        return;
+       
+       entity missile;
+       if(!(balls & BALL_BASKET))
+               return;
+       W_SetupShot(self, FALSE, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
+//     pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+       missile = spawn();
+
+       missile.owner = self;
+       missile.classname = "ballstealer";
+
+       missile.movetype = MOVETYPE_FLY;
+       PROJECTILE_MAKETRIGGER(missile);
+
+       setmodel(missile, "models/elaser.mdl");  // precision set below
+       setsize(missile, '0 0 0', '0 0 0');
+       setorigin(missile, w_shotorg);
+
+       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 + autocvar_g_balance_nexball_secondary_lifetime; //FIXME: use a distance instead?
+
+       missile.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
+       missile.flags = FL_PROJECTILE;
+}
+
+var const float() nullfunc;
+float ball_customize()
+{
+    if(!self.owner)
+    {
+        self.effects &~= EF_FLAME;
+        self.scale = 1;
+        self.customizeentityforclient = nullfunc;
+        return TRUE;
+    }        
+    
+    if(other == self.owner)
+    {
+        self.scale = autocvar_g_nexball_viewmodel_scale;
+        if(self.enemy)
+            self.effects |= EF_FLAME;
+        else
+            self.effects &~= EF_FLAME;
+    }    
+    else
+    {
+        self.effects &~= EF_FLAME;
+        self.scale = 1;
+    }
+        
+    return TRUE;
+}
+
+float w_nexball_weapon(float req)
+{
+       if(req == WR_THINK)
+       {
+               if(self.BUTTON_ATCK)
+                       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, autocvar_g_balance_nexball_primary_animtime, w_ready);
+                               }
+                               else
+                               {
+                                       W_Nexball_Attack(-1);
+                                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
+                               }
+               if(self.BUTTON_ATCK2)
+                       if(weapon_prepareattack(1, autocvar_g_balance_nexball_secondary_refire))
+                       {
+                               W_Nexball_Attack2();
+                               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, autocvar_g_balance_nexball_primary_animtime, w_ready);
+               }
+       }
+       else if(req == WR_PRECACHE)
+       {
+               precache_model("models/weapons/g_porto.md3");
+               precache_model("models/weapons/v_porto.md3");
+               precache_model("models/weapons/h_porto.iqm");
+               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);
+       else if(req == WR_SUICIDEMESSAGE)
+       {
+               w_deathtypestring = "is a weirdo";
+       }
+       else if(req == WR_KILLMESSAGE)
+       {
+               w_deathtypestring = "got killed by #'s black magic";
+       }
+       // No need to check WR_CHECKAMMO* or WR_AIM, it should always return TRUE
+       return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(nexball_BallDrop)
+{
+       if(self.ballcarried && g_nexball)
+               DropBall(self.ballcarried, self.origin, self.velocity);
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nexball_BuildMutatorsString)
+{
+       ret_string = strcat(ret_string, ":NB");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nexball_BuildMutatorsPrettyString)
+{
+       ret_string = strcat(ret_string, ", NexBall");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nexball_PlayerPreThink)
+{
+    makevectors(self.v_angle);
+    if(nexball_mode & NBM_BASKETBALL)
+    {        
+        if(self.ballcarried)
+        {
+            // 'view ball'
+            self.ballcarried.velocity = self.velocity;            
+            self.ballcarried.customizeentityforclient = ball_customize;
+            
+            setorigin(self.ballcarried, self.origin + self.view_ofs + 
+                      v_forward * autocvar_g_nexball_viewmodel_offset_x + 
+                      v_right * autocvar_g_nexball_viewmodel_offset_y + 
+                      v_up * autocvar_g_nexball_viewmodel_offset_z);    
+                      
+            // 'safe passing'
+            if(autocvar_g_nexball_safepass_maxdist)
+            {
+                if(self.ballcarried.wait < time && self.ballcarried.enemy)
+                {
+                    //centerprint(self, sprintf("Lost lock on %s", self.ballcarried.enemy.netname));
+                    self.ballcarried.enemy = world;
+                }
+                    
+                
+                //tracebox(self.origin + self.view_ofs, '-2 -2 -2', '2 2 2', self.origin + self.view_ofs + v_forward * autocvar_g_nexball_safepass_maxdist);
+                crosshair_trace(self);
+                if( trace_ent && 
+                    trace_ent.flags & FL_CLIENT &&
+                    trace_ent.deadflag == DEAD_NO &&
+                    trace_ent.team == self.team &&
+                    vlen(trace_ent.origin - self.origin) <= autocvar_g_nexball_safepass_maxdist )
+                {
+                    
+                    //if(self.ballcarried.enemy != trace_ent)
+                    //    centerprint(self, sprintf("Locked to %s", trace_ent.netname));
+                    self.ballcarried.enemy = trace_ent;
+                    self.ballcarried.wait = time + autocvar_g_nexball_safepass_holdtime;
+                    
+                    
+                }
+            }
+        }
+        else
+        {            
+            if(self.weaponentity.weapons)
+            {
+                self.weapons = self.weaponentity.weapons;        
+                weapon_action(WEP_PORTO, WR_RESETPLAYER);
+                self.switchweapon = self.weaponentity.switchweapon;
+                W_SwitchWeapon(self.switchweapon);
+                
+                self.weaponentity.weapons = 0;
+            }
+        }
+        
+    }
+    return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(nexball_PlayerSpawn)
+{    
+    self.weaponentity.weapons = 0;
+    
+    if(nexball_mode & NBM_BASKETBALL)
+        self.weapons |= W_WeaponBit(WEP_PORTO);
+    else
+        self.weapons = 0; //    W_WeaponBit(WEP_PORTO);
+
+    return FALSE;
+}
+
+MUTATOR_DEFINITION(gamemode_nexball)
+{
+       MUTATOR_HOOK(PlayerDies, nexball_BallDrop, CBC_ORDER_ANY);
+       MUTATOR_HOOK(MakePlayerObserver, nexball_BallDrop, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ClientDisconnect, nexball_BallDrop, CBC_ORDER_ANY);
+       MUTATOR_HOOK(BuildMutatorsPrettyString, nexball_BuildMutatorsPrettyString, CBC_ORDER_ANY);
+       MUTATOR_HOOK(BuildMutatorsString, nexball_BuildMutatorsString, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerSpawn, nexball_PlayerSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerPreThink, nexball_PlayerPreThink, CBC_ORDER_ANY);
+
+       MUTATOR_ONADD
+       {
+           g_nexball = 1;
+               g_nexball_meter_period = autocvar_g_nexball_meter_period;
+               if(g_nexball_meter_period <= 0)
+                       g_nexball_meter_period = 2; // avoid division by zero etc. due to silly users
+               g_nexball_meter_period = rint(g_nexball_meter_period * 32) / 32; //Round to 1/32ths to send as a byte multiplied by 32
+               addstat(STAT_NB_METERSTART, AS_FLOAT, metertime);
+
+               // General settings
+               /*
+               CVTOV(g_nexball_football_boost_forward);   //100
+               CVTOV(g_nexball_football_boost_up);        //200
+               CVTOV(g_nexball_delay_idle);               //10
+               CVTOV(g_nexball_football_physics);         //0
+               */
+               radar_showennemies = autocvar_g_nexball_radar_showallplayers;
+
+               InitializeEntity(world, nb_delayedinit, INITPRIO_GAMETYPE);
+       }
+
+       return 0;
+}
diff --git a/qcsrc/server/mutators/gamemode_nexball.qh b/qcsrc/server/mutators/gamemode_nexball.qh
new file mode 100644 (file)
index 0000000..545ec96
--- /dev/null
@@ -0,0 +1,30 @@
+//EF_BRIGHTFIELD|EF_BRIGHTLIGHT|EF_DIMLIGHT|EF_BLUE|EF_RED|EF_FLAME
+#define BALL_EFFECTMASK 1229
+#define BALL_MINS '-16 -16 -16'  // The model is 24*24*24
+#define BALL_MAXS '16 16 16'
+#define BALL_ATTACHORG '3 0 16'
+#define BALL_SPRITECOLOR '.91 .85 .62'
+#define BALL_FOOT   1
+#define BALL_BASKET 2
+//spawnflags
+#define GOAL_TOUCHPLAYER 1
+//goal types
+#define GOAL_FAULT -1
+#define GOAL_OUT -2
+
+void DropBall(entity ball, vector org, vector vel);
+float autocvar_g_nexball_football_boost_forward;
+float autocvar_g_nexball_football_boost_up;
+float autocvar_g_nexball_football_physics;
+float autocvar_g_nexball_delay_idle;
+float autocvar_g_nexball_basketball_delay_hold;
+float autocvar_g_nexball_basketball_delay_hold_forteam;
+float autocvar_g_nexball_basketball_effects_default;
+float autocvar_g_nexball_basketball_teamsteal;
+float autocvar_g_nexball_meter_period;
+
+float balls;
+float ball_scale;
+float nb_teams;
+
+.float teamtime;
\ No newline at end of file
index 825062e1cdcd50bdd0429502921eec76c4377a59..bc3c3fbd4446a5283d841a5a24ee1c6b3893981b 100644 (file)
@@ -1,6 +1,7 @@
 MUTATOR_DECLARATION(gamemode_keyhunt);
 MUTATOR_DECLARATION(gamemode_freezetag);
 MUTATOR_DECLARATION(gamemode_keepaway);
+MUTATOR_DECLARATION(gamemode_nexball);
 
 MUTATOR_DECLARATION(mutator_invincibleprojectiles);
 MUTATOR_DECLARATION(mutator_nix);
diff --git a/qcsrc/server/nexball.qc b/qcsrc/server/nexball.qc
deleted file mode 100644 (file)
index a068a33..0000000
+++ /dev/null
@@ -1,738 +0,0 @@
-//EF_BRIGHTFIELD|EF_BRIGHTLIGHT|EF_DIMLIGHT|EF_BLUE|EF_RED|EF_FLAME
-#define BALL_EFFECTMASK 1229
-#define BALL_MINS '-16 -16 -16'  // The model is 24*24*24
-#define BALL_MAXS '16 16 16'
-#define BALL_ATTACHORG '3 0 16'
-#define BALL_SPRITECOLOR '.91 .85 .62'
-#define BALL_FOOT   1
-#define BALL_BASKET 2
-//spawnflags
-#define GOAL_TOUCHPLAYER 1
-//goal types
-#define GOAL_FAULT -1
-#define GOAL_OUT -2
-
-#define CVTOV(s) s = cvar( #s )
-
-float g_nexball_football_boost_forward;
-float g_nexball_football_boost_up;
-float g_nexball_football_physics;
-float g_nexball_delay_idle;
-float g_nexball_basketball_delay_hold;
-float g_nexball_basketball_delay_hold_forteam;
-float g_nexball_basketball_effects_default;
-float g_nexball_basketball_teamsteal;
-float balls;
-float ball_scale;
-float nb_teams;
-
-.float teamtime;
-
-void nb_delayedinit();
-void nb_init() // Called early (worldspawn stage)
-{
-       CVTOV(g_nexball_meter_period); //sent with the client init entity
-       if (g_nexball_meter_period <= 0)
-               g_nexball_meter_period = 2; // avoid division by zero etc. due to silly users
-       g_nexball_meter_period = rint(g_nexball_meter_period * 32) / 32; //Round to 1/32ths to send as a byte multiplied by 32
-       addstat(STAT_NB_METERSTART, AS_FLOAT, metertime);
-
-       // General settings
-       CVTOV(g_nexball_football_boost_forward);   //100
-       CVTOV(g_nexball_football_boost_up);        //200
-       CVTOV(g_nexball_delay_idle);               //10
-       CVTOV(g_nexball_football_physics);         //0
-
-       radar_showennemies = autocvar_g_nexball_radar_showallplayers;
-
-       InitializeEntity(world, nb_delayedinit, INITPRIO_GAMETYPE);
-}
-
-float OtherTeam(float t)  //works only if there are two teams on the map!
-{
-       entity e;
-       e = find(world, classname, "nexball_team");
-       if (e.team == t)
-               e = find(e, classname, "nexball_team");
-       return e.team;
-}
-
-void ResetBall();
-
-void LogNB(string mode, entity actor)
-{
-       string s;
-       if(!autocvar_sv_eventlog)
-               return;
-       s = strcat(":nexball:", mode);
-       if(actor != world)
-               s = strcat(s, ":", ftos(actor.playerid));
-       GameLogEcho(s);
-}
-
-void ball_restart (void)
-{
-       if(self.owner)
-               DropBall(self, self.owner.origin, '0 0 0');
-       ResetBall();
-}
-
-void nexball_setstatus (void)
-{
-       entity oldself;
-       self.items &~= IT_KEY1;
-       if (self.ballcarried)
-       {
-               if (self.ballcarried.teamtime && (self.ballcarried.teamtime < time))
-               {
-                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
-                       oldself = self;
-                       self = self.ballcarried;
-                       DropBall(self, self.owner.origin, '0 0 0');
-                       ResetBall();
-                       self = oldself;
-               } else
-                       self.items |= IT_KEY1;
-       }
-}
-
-void relocate_nexball (void)
-{
-       tracebox(self.origin, BALL_MINS, BALL_MAXS, self.origin, TRUE, self);
-       if (trace_startsolid)
-       {
-               vector o;
-               o = self.origin;
-               if(!move_out_of_solid(self))
-                       objerror("could not get out of solid at all!");
-               print("^1NOTE: this map needs FIXING. ", self.classname, " at ", vtos(o - '0 0 1'));
-               print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
-               print(" ", ftos(self.origin_y - o_y));
-               print(" ", ftos(self.origin_z - o_z), "'\n");
-               self.origin = o;
-       }
-}
-
-void basketball_touch();
-void football_touch();
-
-void DropOwner (void)
-{
-       entity ownr;
-       ownr = self.owner;
-       DropBall(self, ownr.origin, ownr.velocity);
-       makevectors(ownr.v_angle_y * '0 1 0');
-       ownr.velocity += ('0 0 0.75' - v_forward) * 1000;
-       ownr.flags &~= FL_ONGROUND;
-}
-
-void GiveBall (entity plyr, entity ball)
-{
-       entity ownr;
-
-       if ((ownr = ball.owner))
-       {
-               ownr.effects &~= g_nexball_basketball_effects_default;
-               ownr.ballcarried = world;
-               if (ownr.metertime)
-               {
-                       ownr.metertime = 0;
-                       ownr.weaponentity.state = WS_READY;
-               }
-               WaypointSprite_Kill(ownr.waypointsprite_attachedforcarrier);
-       }
-       else
-       {
-               WaypointSprite_Kill(ball.waypointsprite_attachedforcarrier);
-       }
-
-       setattachment(ball, plyr, "");
-       setorigin(ball, BALL_ATTACHORG);
-
-       if (ball.team != plyr.team)
-               ball.teamtime = time + g_nexball_basketball_delay_hold_forteam;
-
-       ball.owner = ball.pusher = plyr; //"owner" is set to the player carrying, "pusher" to the last player who touched it
-       ball.team = plyr.team;
-       plyr.ballcarried = ball;
-       ball.dropperid = plyr.playerid;
-
-       plyr.effects |= g_nexball_basketball_effects_default;
-       ball.effects &~= g_nexball_basketball_effects_default;
-
-       ball.velocity = '0 0 0';
-       ball.movetype = MOVETYPE_NONE;
-       ball.touch = SUB_Null;
-       ball.effects |= EF_NOSHADOW;
-       ball.scale = 1; // scale down.
-
-       WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
-       WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-
-       if (g_nexball_basketball_delay_hold)
-       {
-               ball.think = DropOwner;
-               ball.nextthink = time + g_nexball_basketball_delay_hold;
-       }
-}
-
-void DropBall (entity ball, vector org, vector vel)
-{
-       ball.effects |= g_nexball_basketball_effects_default;
-       ball.effects &~= EF_NOSHADOW;
-       ball.owner.effects &~= g_nexball_basketball_effects_default;
-
-       setattachment(ball, world, "");
-       setorigin (ball, org);
-       ball.movetype = MOVETYPE_BOUNCE;
-       ball.flags &~= FL_ONGROUND;
-       ball.scale = ball_scale;
-       ball.velocity = vel;
-       ball.ctf_droptime = time;
-       ball.touch = basketball_touch;
-       ball.think = ResetBall;
-       ball.nextthink = min(time + g_nexball_delay_idle, ball.teamtime);
-
-       if (ball.owner.metertime)
-       {
-               ball.owner.metertime = 0;
-               ball.owner.weaponentity.state = WS_READY;
-       }
-
-       WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
-       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
-       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-
-       ball.owner.ballcarried = world;
-       ball.owner = world;
-}
-
-void InitBall (void)
-{
-       if (gameover) return;
-       self.flags &~= FL_ONGROUND;
-       self.movetype = MOVETYPE_BOUNCE;
-       if (self.classname == "nexball_basketball")
-               self.touch = basketball_touch;
-       else if (self.classname == "nexball_football")
-               self.touch = football_touch;
-       self.cnt = 0;
-       self.think = ResetBall;
-       self.nextthink = time + g_nexball_delay_idle + 3;
-       self.teamtime = 0;
-       self.pusher = world;
-       self.team = FALSE;
-       sound (self, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
-       WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
-       LogNB("init", world);
-}
-
-void ResetBall (void)
-{
-       if (self.cnt < 2) { // step 1
-               if (time == self.teamtime)
-                       bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n");
-               self.touch = SUB_Null;
-               self.movetype = MOVETYPE_NOCLIP;
-               self.velocity = '0 0 0'; // just in case?
-               if(!self.cnt)
-                       LogNB("resetidle", world);
-               self.cnt = 2;
-               self.nextthink = time;
-       } else if (self.cnt < 4) { // step 2 and 3
-//             dprint("Step ", ftos(self.cnt), ": Calculated velocity: ", vtos(self.spawnorigin - self.origin), ", time: ", ftos(time), "\n");
-               self.velocity = (self.spawnorigin - self.origin) * (self.cnt - 1); // 1 or 0.5 second movement
-               self.nextthink = time + 0.5;
-               self.cnt += 1;
-       } else { // step 4
-//             dprint("Step 4: time: ", ftos(time), "\n");
-               if (vlen(self.origin - self.spawnorigin) > 10) // should not happen anymore
-                       dprint("The ball moved too far away from its spawn origin.\nOffset: ",
-                              vtos(self.origin - self.spawnorigin), " Velocity: ", vtos(self.velocity), "\n");
-               self.velocity = '0 0 0';
-               setorigin(self, self.spawnorigin); // make sure it's positioned correctly anyway
-               self.movetype = MOVETYPE_NONE;
-               self.think = InitBall;
-               self.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
-       }
-}
-
-void football_touch (void)
-{
-       if (other.solid == SOLID_BSP) {
-               if (time > self.lastground + 0.1)
-               {
-                       sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
-                       self.lastground = time;
-               }
-               if (vlen(self.velocity) && !self.cnt)
-                       self.nextthink = time + g_nexball_delay_idle;
-               return;
-       }
-       if (other.classname != "player")
-               return;
-       if (other.health < 1)
-               return;
-       if (!self.cnt)
-               self.nextthink = time + g_nexball_delay_idle;
-
-       self.pusher = other;
-       self.team = other.team;
-
-       if (g_nexball_football_physics == -1) { // MrBougo try 1, before decompiling Rev's original
-               if (vlen(other.velocity))
-                       self.velocity = other.velocity * 1.5 + '0 0 1' * g_nexball_football_boost_up;
-       } else if (g_nexball_football_physics == 1) { // MrBougo's modded Rev style: partially independant of the height of the aiming point
-               makevectors(other.v_angle);
-               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + '0 0 1' * g_nexball_football_boost_up;
-       } else if (g_nexball_football_physics == 2) { // 2nd mod try: totally independant. Really playable!
-               makevectors(other.v_angle_y * '0 1 0');
-               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + v_up * g_nexball_football_boost_up;
-       } else { // Revenant's original style (from the original mod's disassembly, acknowledged by Revenant)
-               makevectors(other.v_angle);
-               self.velocity = other.velocity + v_forward * g_nexball_football_boost_forward + v_up * g_nexball_football_boost_up;
-       }
-       self.avelocity = -250 * v_forward;  // maybe there is a way to make it look better?
-}
-
-void basketball_touch (void)
-{
-       if (other.ballcarried)
-       {
-               football_touch();
-               return;
-       }
-       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);
-               GiveBall(other, self);
-       } else if (other.solid == SOLID_BSP) {
-               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
-               if (vlen(self.velocity) && !self.cnt)
-                       self.nextthink = min(time + g_nexball_delay_idle, self.teamtime);
-       }
-}
-
-void GoalTouch (void)
-{
-       entity ball;
-       float isclient, pscore, otherteam;
-       string pname;
-
-       if (gameover) return;
-       if ((self.spawnflags & GOAL_TOUCHPLAYER) && other.ballcarried)
-               ball = other.ballcarried;
-       else
-               ball = other;
-       if (ball.classname != "nexball_basketball")
-       if (ball.classname != "nexball_football")
-               return;
-       if ((!ball.pusher && self.team != GOAL_OUT) || ball.cnt)
-               return;
-       EXACTTRIGGER_TOUCH;
-
-
-       if(nb_teams == 2)
-               otherteam = OtherTeam(ball.team);
-
-       if((isclient = ball.pusher.flags & FL_CLIENT))
-               pname = ball.pusher.netname;
-       else
-               pname = "Someone (?)";
-
-       if        (ball.team == self.team) //owngoal (regular goals)
-       {
-               LogNB("owngoal", ball.pusher);
-               bprint("Boo! ", pname, "^7 scored a goal against their own team!\n");
-               pscore = -1;
-       } else if (self.team == GOAL_FAULT) {
-               LogNB("fault", ball.pusher);
-               if (nb_teams == 2)
-                       bprint(ColoredTeamName(otherteam), " gets a point due to ", pname, "^7's silliness.\n");
-               else
-                       bprint(ColoredTeamName(ball.team), " loses a point due to ", pname, "^7's silliness.\n");
-               pscore = -1;
-       } else if (self.team == GOAL_OUT) {
-               LogNB("out", ball.pusher);
-               if ((self.spawnflags & GOAL_TOUCHPLAYER) && ball.owner)
-                       bprint(pname, "^7 went out of bounds.\n");
-               else
-                       bprint("The ball was returned.\n");
-               pscore = 0;
-       } else {                           //score
-               LogNB(strcat("goal:", ftos(self.team)), ball.pusher);
-               bprint("Goaaaaal! ", pname, "^7 scored a point for the ", ColoredTeamName(ball.team), ".\n");
-               pscore = 1;
-       }
-
-       sound (ball, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
-
-       if(ball.team && pscore)
-       {
-               if (nb_teams == 2 && pscore < 0)
-                       TeamScore_AddToTeam(otherteam, ST_NEXBALL_GOALS, -pscore);
-               else
-                       TeamScore_AddToTeam(ball.team, ST_NEXBALL_GOALS, pscore);
-       }
-       if (isclient)
-       {
-               if (pscore > 0)
-                       PlayerScore_Add(ball.pusher, SP_NEXBALL_GOALS, pscore);
-               else if (pscore < 0)
-                       PlayerScore_Add(ball.pusher, SP_NEXBALL_FAULTS, -pscore);
-       }
-
-       if (ball.owner) // Happens on spawnflag GOAL_TOUCHPLAYER
-               DropBall(ball, ball.owner.origin, ball.owner.velocity);
-
-       WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);
-
-       ball.cnt = 1;
-       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 + autocvar_g_nexball_delay_goal * (self.team != GOAL_OUT);
-}
-
-//=======================//
-//       team ents       //
-//=======================//
-void spawnfunc_nexball_team (void)
-{
-       if(!g_nexball) { remove(self); return; }
-       self.team = self.cnt + 1;
-}
-
-void nb_spawnteam (string teamname, float teamcolor)
-{
-       dprint("^2spawned team ", teamname, "\n");
-       entity e;
-       e = spawn();
-       e.classname = "nexball_team";
-       e.netname = teamname;
-       e.cnt = teamcolor;
-       e.team = e.cnt + 1;
-       nb_teams += 1;
-}
-
-void nb_spawnteams (void)
-{
-       float t_r, t_b, t_y, t_p;
-       entity e;
-       for(e = world; (e = find(e, classname, "nexball_goal")); )
-       {
-               switch(e.team)
-               {
-                       case COLOR_TEAM1: if(!t_r) { nb_spawnteam ("Red", e.team-1)   ; t_r = 1; } break;
-                       case COLOR_TEAM2: if(!t_b) { nb_spawnteam ("Blue", e.team-1)  ; t_b = 1; } break;
-                       case COLOR_TEAM3: if(!t_y) { nb_spawnteam ("Yellow", e.team-1); t_y = 1; } break;
-                       case COLOR_TEAM4: if(!t_p) { nb_spawnteam ("Pink", e.team-1)  ; t_p = 1; } break;
-               }
-       }
-}
-
-void nb_delayedinit (void)
-{
-       if (find(world, classname, "nexball_team") == world)
-               nb_spawnteams();
-       ScoreRules_nexball(nb_teams);
-}
-
-
-//=======================//
-//      spawnfuncs       //
-//=======================//
-
-void SpawnBall (void)
-{
-       if(!g_nexball) { remove(self); return; }
-
-//     balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine
-
-       if (!self.model) {
-               self.model = "models/nexball/ball.md3";
-               self.scale = 1.3;
-       }
-
-       precache_model (self.model);
-       setmodel (self, self.model);
-       setsize (self, BALL_MINS, BALL_MAXS);
-       ball_scale = self.scale;
-
-       relocate_nexball();
-       self.spawnorigin = self.origin;
-
-       self.effects = self.effects | EF_LOWPRECISION;
-
-       if (cvar(strcat("g_", self.classname, "_trail"))) //nexball_basketball :p
-       {
-               self.glow_color = autocvar_g_nexball_trail_color;
-               self.glow_trail = TRUE;
-       }
-
-       self.movetype = MOVETYPE_FLY;
-
-       if (!autocvar_g_nexball_sound_bounce)
-               self.noise = "";
-       else if (!self.noise)
-               self.noise = "sound/nexball/bounce.wav";
-               //bounce sound placeholder (FIXME)
-       if (!self.noise1)
-               self.noise1 = "sound/nexball/drop.wav";
-               //ball drop sound placeholder (FIXME)
-       if (!self.noise2)
-               self.noise2 = "sound/nexball/steal.wav";
-               //stealing sound placeholder (FIXME)
-       if (self.noise) precache_sound (self.noise);
-       precache_sound (self.noise1);
-       precache_sound (self.noise2);
-
-       WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
-
-       self.reset = ball_restart;
-       self.think = InitBall;
-       self.nextthink = game_starttime + autocvar_g_nexball_delay_start;
-}
-
-void spawnfunc_nexball_basketball (void)
-{
-       self.classname = "nexball_basketball";
-       if not(balls & BALL_BASKET)
-       {
-               CVTOV(g_nexball_basketball_effects_default);
-               CVTOV(g_nexball_basketball_delay_hold);
-               CVTOV(g_nexball_basketball_delay_hold_forteam);
-               CVTOV(g_nexball_basketball_teamsteal);
-               g_nexball_basketball_effects_default = g_nexball_basketball_effects_default & BALL_EFFECTMASK;
-       }
-       if (!self.effects)
-               self.effects = g_nexball_basketball_effects_default;
-       self.solid = SOLID_TRIGGER;
-       balls |= BALL_BASKET;
-       self.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
-       self.bouncestop = autocvar_g_nexball_basketball_bouncestop;
-       SpawnBall();
-}
-
-void spawnfunc_nexball_football (void)
-{
-       self.classname = "nexball_football";
-       self.solid = SOLID_TRIGGER;
-       balls |= BALL_FOOT;
-       self.bouncefactor = autocvar_g_nexball_football_bouncefactor;
-       self.bouncestop = autocvar_g_nexball_football_bouncestop;
-       SpawnBall();
-}
-
-void SpawnGoal (void)
-{
-       if(!g_nexball) { remove(self); return; }
-       EXACTTRIGGER_INIT;
-       self.classname = "nexball_goal";
-       if (!self.noise)
-               self.noise = "ctf/respawn.wav";
-       precache_sound(self.noise);
-       self.touch = GoalTouch;
-}
-
-void spawnfunc_nexball_redgoal (void)
-{
-       self.team = COLOR_TEAM1;
-       SpawnGoal();
-}
-void spawnfunc_nexball_bluegoal (void)
-{
-       self.team = COLOR_TEAM2;
-       SpawnGoal();
-}
-void spawnfunc_nexball_yellowgoal (void)
-{
-       self.team = COLOR_TEAM3;
-       SpawnGoal();
-}
-void spawnfunc_nexball_pinkgoal (void)
-{
-       self.team = COLOR_TEAM4;
-       SpawnGoal();
-}
-
-void spawnfunc_nexball_fault (void)
-{
-       self.team = GOAL_FAULT;
-       if (!self.noise)
-               self.noise = "misc/typehit.wav";
-       SpawnGoal();
-}
-
-void spawnfunc_nexball_out (void)
-{
-       self.team = GOAL_OUT;
-       if (!self.noise)
-               self.noise = "misc/typehit.wav";
-       SpawnGoal();
-}
-
-//
-//Spawnfuncs preserved for compatibility
-//
-
-void spawnfunc_ball            (void) { spawnfunc_nexball_football(); }
-void spawnfunc_ball_football   (void) { spawnfunc_nexball_football(); }
-void spawnfunc_ball_basketball (void) { spawnfunc_nexball_basketball(); }
-// The "red goal" is defended by blue team. A ball in there counts as a point for red.
-void spawnfunc_ball_redgoal    (void) { spawnfunc_nexball_bluegoal(); } // I blame Revenant
-void spawnfunc_ball_bluegoal   (void) { spawnfunc_nexball_redgoal(); }  // but he didn't mean to cause trouble :p
-void spawnfunc_ball_fault      (void) { spawnfunc_nexball_fault(); }
-void spawnfunc_ball_bound      (void) { spawnfunc_nexball_out(); }
-
-//=======================//
-//      Weapon code      //
-//=======================//
-
-void W_Nexball_Touch (void)
-{
-       entity ball, attacker;
-       attacker = self.owner;
-
-       PROJECTILE_TOUCH;
-       if(attacker.team != other.team || g_nexball_basketball_teamsteal)
-       if((ball = other.ballcarried) && (attacker.classname == "player"))
-       {
-               other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
-               other.flags &~= FL_ONGROUND;
-               if(!attacker.ballcarried)
-               {
-                       LogNB("stole", attacker);
-                       sound (other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTN_NORM);
-
-                       if(attacker.team == other.team && time > attacker.teamkill_complain)
-                       {
-                               attacker.teamkill_complain = time + 5;
-                               attacker.teamkill_soundtime = time + 0.4;
-                               attacker.teamkill_soundsource = other;
-                       }
-
-                       GiveBall(attacker, other.ballcarried);
-               }
-       }
-       remove(self);
-}
-
-void W_Nexball_Attack (float t)
-{
-       entity ball;
-       float mul, mi, ma;
-       if (!(ball = self.ballcarried))
-               return;
-
-       W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
-       tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
-       if(trace_startsolid)
-       {
-               if(self.metertime)
-                       self.metertime = 0; // Shot failed, hide the power meter
-               return;
-       }
-
-       //Calculate multiplier
-       if (t < 0)
-               mul = 1;
-       else
-       {
-               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 * autocvar_g_balance_nexball_primary_speed * mul, FALSE));
-       //TODO: use the speed_up cvar too ??
-}
-
-void W_Nexball_Attack2 (void)
-{
-       entity missile;
-       if (!(balls & BALL_BASKET))
-               return;
-       W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
-//     pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-       missile = spawn ();
-
-       missile.owner = self;
-       missile.classname = "ballstealer";
-
-       missile.movetype = MOVETYPE_FLY;
-       PROJECTILE_MAKETRIGGER(missile);
-
-       setmodel (missile, "models/elaser.mdl"); // precision set below
-       setsize (missile, '0 0 0', '0 0 0');
-       setorigin (missile, w_shotorg);
-
-       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 + autocvar_g_balance_nexball_secondary_lifetime; //FIXME: use a distance instead?
-
-       missile.effects = EF_BRIGHTFIELD | EF_LOWPRECISION;
-       missile.flags = FL_PROJECTILE;
-}
-
-float w_nexball_weapon(float req)
-{
-       if (req == WR_THINK)
-       {
-               if (self.BUTTON_ATCK)
-               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, autocvar_g_balance_nexball_primary_animtime, w_ready);
-               }
-               else
-               {
-                       W_Nexball_Attack(-1);
-                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready);
-               }
-               if (self.BUTTON_ATCK2)
-               if (weapon_prepareattack(1, autocvar_g_balance_nexball_secondary_refire))
-               {
-                       W_Nexball_Attack2();
-                       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, autocvar_g_balance_nexball_primary_animtime, w_ready);
-               }
-       }
-       else if (req == WR_PRECACHE)
-       {
-               precache_model ("models/weapons/g_porto.md3");
-               precache_model ("models/weapons/v_porto.md3");
-               precache_model ("models/weapons/h_porto.iqm");
-               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);
-       else if (req == WR_SUICIDEMESSAGE)
-       {
-               w_deathtypestring = "is a weirdo";
-       }
-       else if (req == WR_KILLMESSAGE)
-       {
-               w_deathtypestring = "got killed by #'s black magic";
-       }
-       // No need to check WR_CHECKAMMO* or WR_AIM, it should always return TRUE
-       return TRUE;
-}
index 4ce318377e997810b886110e39a987bf4abb8d0e..0dbe5378186ab296c6cff094d0dfce718d9dfdd4 100644 (file)
@@ -30,6 +30,7 @@ defs.qh               // Should rename this, it has fields and globals
 mutators/base.qh
 mutators/mutators.qh
 mutators/gamemode_keyhunt.qh // TODO fix this
+mutators/gamemode_nexball.qh 
 mutators/mutator_dodging.qh
 
 //// tZork Turrets ////
@@ -140,7 +141,7 @@ antilag.qc
 ctf.qc
 domination.qc
 mode_onslaught.qc
-nexball.qc
+//nexball.qc
 g_hook.qc
 
 t_swamp.qc
@@ -204,6 +205,7 @@ playerstats.qc
 ../common/explosion_equation.qc
 
 mutators/base.qc
+mutators/gamemode_nexball.qc
 mutators/gamemode_keyhunt.qc
 mutators/gamemode_freezetag.qc
 mutators/gamemode_keepaway.qc
index f0ce8fd142ec4027b10c524db8b97297a90a8968..960e59d67492f8ddf5ad3959515d303932c9f043 100644 (file)
@@ -71,7 +71,6 @@ void dom_init();
 void ctf_init();
 void runematch_init();
 void tdm_init();
-void nb_init();
 void entcs_init();
 
 void LogTeamchange(float player_id, float team_number, float type)
@@ -257,13 +256,13 @@ void InitGameplayMode()
 
        if(g_nexball)
        {
-               fraglimit_override = autocvar_g_nexball_goallimit;
-               leadlimit_override = autocvar_g_nexball_goalleadlimit;
-               ActivateTeamplay();
-               nb_init();
-               have_team_spawns = -1; // request team spawns
+        fraglimit_override = autocvar_g_nexball_goallimit;
+        leadlimit_override = autocvar_g_nexball_goalleadlimit;
+        ActivateTeamplay();
+        have_team_spawns = -1; // request team spawns
+           MUTATOR_ADD(gamemode_nexball);
        }
-
+        
        if(g_keepaway)
        {
                MUTATOR_ADD(gamemode_keepaway);
index b66386d50a59229309d6f1409648b895b3e93e68..d8dc33ec662a32feae2245b8d407b7daf008157a 100644 (file)
@@ -86,22 +86,25 @@ void W_MinstaNex_Attack (void)
 
 .float minstagib_nextthink;
 .float minstagib_needammo;
-void minstagib_stop_countdown(void)
+void minstagib_stop_countdown(entity e)
 {
-       if (self.minstagib_needammo)
-       {
-               self.health = 100;
-               Send_CSQC_Centerprint_Generic_Expire(self, CPID_MINSTA_FINDAMMO);
-       }
-       self.minstagib_needammo = FALSE;
+       if (!e.minstagib_needammo)
+               return;
+       Send_CSQC_Centerprint_Generic_Expire(e, CPID_MINSTA_FINDAMMO);
+       e.minstagib_needammo = FALSE;
 }
 void minstagib_ammocheck(void)
 {
        if (time < self.minstagib_nextthink)
                return;
 
-       if (self.deadflag || gameover || self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
-               minstagib_stop_countdown();
+       if (self.deadflag || gameover)
+               minstagib_stop_countdown(self);
+       else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
+       {
+               minstagib_stop_countdown(self);
+               self.health = 100;
+       }
        else
        {
                self.minstagib_needammo = TRUE;
index dfc30bdfd569868c8d3f96f569fd521bae877e80..89c4b72b5f59b15df29024fa07507a3de314d40b 100644 (file)
@@ -302,7 +302,7 @@ float WarpZone_Camera_Send(entity to, float sendflags)
        return TRUE;
 }
 
-#ifndef WARPZONELIB_KEEPDEBUG
+#ifdef WARPZONELIB_KEEPDEBUG
 float WarpZone_CheckProjectileImpact(entity player)
 {
        vector o0, v0;
@@ -372,7 +372,6 @@ float WarpZone_CheckProjectileImpact(entity player)
 
 float WarpZone_Projectile_Touch()
 {
-       float f;
        if(other.classname == "trigger_warpzone")
                return TRUE;
 
@@ -385,7 +384,7 @@ float WarpZone_Projectile_Touch()
        if(time == self.warpzone_teleport_time)
                return TRUE;
 
-#ifndef WARPZONELIB_KEEPDEBUG
+#ifdef WARPZONELIB_KEEPDEBUG
        // this SEEMS to not happen at the moment, but if it did, it would be more reliable
        {
                float save_dpstartcontents;
@@ -414,6 +413,7 @@ float WarpZone_Projectile_Touch()
                save_ent = trace_ent;
                save_inopen = trace_inopen;
                save_inwater = trace_inwater;
+               float f;
                if((f = WarpZone_CheckProjectileImpact(self)) != 0)
                        return (f > 0);
                trace_dpstartcontents = save_dpstartcontents;
diff --git a/scripts/ok_player.shader b/scripts/ok_player.shader
new file mode 100644 (file)
index 0000000..2d48856
--- /dev/null
@@ -0,0 +1,9 @@
+okplayer
+{
+       dpglossexponentmod  8
+       dpreflectcube env/exomorph/exomorph
+       {
+               map models/ok_player/okplayer.tga
+               rgbgen lightingDiffuse
+       }
+}
diff --git a/scripts/okweapons.shader b/scripts/okweapons.shader
new file mode 100644 (file)
index 0000000..8873bf2
--- /dev/null
@@ -0,0 +1,31 @@
+minsta
+{
+       dpglossexponentmod  64
+       dpreflectcube env/exomorph/exomorph
+       {
+               map models/weapons/okweapons.tga
+               rgbgen lightingDiffuse
+       }
+}
+
+okrocketthrust
+{
+       deformVertexes autosprite2
+       cull none
+       {
+               map models/weapons/okrocketthrust.tga
+               tcmod page 4 4 0.01
+               blendfunc add
+       }
+}
+
+okrocketthrust2
+{
+       deformVertexes autosprite
+       {
+               map models/weapons/okrocketthrust.tga
+               tcmod page 4 4 0.01
+               blendfunc add
+       }
+       
+}
index 5a2532e6408eece8229a61845602b289da8f2212..9749b51cc2d22f2dcc5781507c20a8a7d7a78411 100644 (file)
@@ -9,6 +9,7 @@ electro
 nexgun
 {
        dpreflectcube cubemaps/default/sky
+       dpoffsetmapping - 0.3 match8 64
        {
                map textures/nexgun.tga
                rgbgen lightingDiffuse
diff --git a/sound/overkill/grenadebip.ogg b/sound/overkill/grenadebip.ogg
new file mode 100644 (file)
index 0000000..54cdea4
Binary files /dev/null and b/sound/overkill/grenadebip.ogg differ
diff --git a/sound/player/robot/coms/attack.ogg b/sound/player/robot/coms/attack.ogg
new file mode 100644 (file)
index 0000000..6523c3e
Binary files /dev/null and b/sound/player/robot/coms/attack.ogg differ
diff --git a/sound/player/robot/coms/attackinfive.ogg b/sound/player/robot/coms/attackinfive.ogg
new file mode 100644 (file)
index 0000000..e0095d0
Binary files /dev/null and b/sound/player/robot/coms/attackinfive.ogg differ
diff --git a/sound/player/robot/coms/coverme.ogg b/sound/player/robot/coms/coverme.ogg
new file mode 100644 (file)
index 0000000..16d5716
Binary files /dev/null and b/sound/player/robot/coms/coverme.ogg differ
diff --git a/sound/player/robot/coms/defend.ogg b/sound/player/robot/coms/defend.ogg
new file mode 100644 (file)
index 0000000..9f221bb
Binary files /dev/null and b/sound/player/robot/coms/defend.ogg differ
diff --git a/sound/player/robot/coms/freelance1.ogg b/sound/player/robot/coms/freelance1.ogg
new file mode 100644 (file)
index 0000000..602a443
Binary files /dev/null and b/sound/player/robot/coms/freelance1.ogg differ
diff --git a/sound/player/robot/coms/freelance2.ogg b/sound/player/robot/coms/freelance2.ogg
new file mode 100644 (file)
index 0000000..f197e72
Binary files /dev/null and b/sound/player/robot/coms/freelance2.ogg differ
diff --git a/sound/player/robot/coms/incoming.ogg b/sound/player/robot/coms/incoming.ogg
new file mode 100644 (file)
index 0000000..ab44b45
Binary files /dev/null and b/sound/player/robot/coms/incoming.ogg differ
diff --git a/sound/player/robot/coms/meet.ogg b/sound/player/robot/coms/meet.ogg
new file mode 100644 (file)
index 0000000..971a311
Binary files /dev/null and b/sound/player/robot/coms/meet.ogg differ
diff --git a/sound/player/robot/coms/needhelp1.ogg b/sound/player/robot/coms/needhelp1.ogg
new file mode 100644 (file)
index 0000000..bb71c34
Binary files /dev/null and b/sound/player/robot/coms/needhelp1.ogg differ
diff --git a/sound/player/robot/coms/needhelp2.ogg b/sound/player/robot/coms/needhelp2.ogg
new file mode 100644 (file)
index 0000000..3ac2191
Binary files /dev/null and b/sound/player/robot/coms/needhelp2.ogg differ
diff --git a/sound/player/robot/coms/seenflag.ogg b/sound/player/robot/coms/seenflag.ogg
new file mode 100644 (file)
index 0000000..13b3e3d
Binary files /dev/null and b/sound/player/robot/coms/seenflag.ogg differ
diff --git a/sound/player/robot/coms/taunt1.ogg b/sound/player/robot/coms/taunt1.ogg
new file mode 100644 (file)
index 0000000..25dccee
Binary files /dev/null and b/sound/player/robot/coms/taunt1.ogg differ
diff --git a/sound/player/robot/coms/taunt2.ogg b/sound/player/robot/coms/taunt2.ogg
new file mode 100644 (file)
index 0000000..624d561
Binary files /dev/null and b/sound/player/robot/coms/taunt2.ogg differ
diff --git a/sound/player/robot/coms/taunt3.ogg b/sound/player/robot/coms/taunt3.ogg
new file mode 100644 (file)
index 0000000..12f4aa2
Binary files /dev/null and b/sound/player/robot/coms/taunt3.ogg differ
diff --git a/sound/player/robot/coms/teamshoot1.ogg b/sound/player/robot/coms/teamshoot1.ogg
new file mode 100644 (file)
index 0000000..3e152f4
Binary files /dev/null and b/sound/player/robot/coms/teamshoot1.ogg differ
diff --git a/sound/player/robot/coms/teamshoot2.ogg b/sound/player/robot/coms/teamshoot2.ogg
new file mode 100644 (file)
index 0000000..7735188
Binary files /dev/null and b/sound/player/robot/coms/teamshoot2.ogg differ
diff --git a/sound/player/robot/coms/teamshoot3.ogg b/sound/player/robot/coms/teamshoot3.ogg
new file mode 100644 (file)
index 0000000..8ecffab
Binary files /dev/null and b/sound/player/robot/coms/teamshoot3.ogg differ
diff --git a/sound/player/robot/player/death1.ogg b/sound/player/robot/player/death1.ogg
new file mode 100644 (file)
index 0000000..f95bb68
Binary files /dev/null and b/sound/player/robot/player/death1.ogg differ
diff --git a/sound/player/robot/player/death2.ogg b/sound/player/robot/player/death2.ogg
new file mode 100644 (file)
index 0000000..6c5d641
Binary files /dev/null and b/sound/player/robot/player/death2.ogg differ
diff --git a/sound/player/robot/player/death3.ogg b/sound/player/robot/player/death3.ogg
new file mode 100644 (file)
index 0000000..db108b8
Binary files /dev/null and b/sound/player/robot/player/death3.ogg differ
diff --git a/sound/player/robot/player/drown.ogg b/sound/player/robot/player/drown.ogg
new file mode 100644 (file)
index 0000000..76e6488
Binary files /dev/null and b/sound/player/robot/player/drown.ogg differ
diff --git a/sound/player/robot/player/fall.ogg b/sound/player/robot/player/fall.ogg
new file mode 100644 (file)
index 0000000..6120628
Binary files /dev/null and b/sound/player/robot/player/fall.ogg differ
diff --git a/sound/player/robot/player/falling.ogg b/sound/player/robot/player/falling.ogg
new file mode 100644 (file)
index 0000000..b86257a
Binary files /dev/null and b/sound/player/robot/player/falling.ogg differ
diff --git a/sound/player/robot/player/gasp.ogg b/sound/player/robot/player/gasp.ogg
new file mode 100644 (file)
index 0000000..e5d848a
Binary files /dev/null and b/sound/player/robot/player/gasp.ogg differ
diff --git a/sound/player/robot/player/jump.ogg b/sound/player/robot/player/jump.ogg
new file mode 100644 (file)
index 0000000..5b04c29
Binary files /dev/null and b/sound/player/robot/player/jump.ogg differ
diff --git a/sound/player/robot/player/pain100.ogg b/sound/player/robot/player/pain100.ogg
new file mode 100644 (file)
index 0000000..b6e799a
Binary files /dev/null and b/sound/player/robot/player/pain100.ogg differ
diff --git a/sound/player/robot/player/pain25.ogg b/sound/player/robot/player/pain25.ogg
new file mode 100644 (file)
index 0000000..0a1878f
Binary files /dev/null and b/sound/player/robot/player/pain25.ogg differ
diff --git a/sound/player/robot/player/pain50.ogg b/sound/player/robot/player/pain50.ogg
new file mode 100644 (file)
index 0000000..677fc4b
Binary files /dev/null and b/sound/player/robot/player/pain50.ogg differ
diff --git a/sound/player/robot/player/pain75.ogg b/sound/player/robot/player/pain75.ogg
new file mode 100644 (file)
index 0000000..66d0311
Binary files /dev/null and b/sound/player/robot/player/pain75.ogg differ
index edc75b504675db5ff289c19364aa54b2a202ae01..180076f7719061b60d2b74d6d3c6c799b8ddde8b 100644 (file)
 \vid_bitsperpixel\Bit per pixel (BPP) per il rendering, 32 è raccomandato
 \vid_fullscreen\Abilita modalità a tutto schermo (predefinito: abilitato)
 \vid_vsync\Abilita la sincronizzazione verticale per prevenire la lacrimazione (tearing), imposta il limite massimo di fps alla velocità di aggiornamento dello schermo (predefinito: disabilitato)
+\gl_texture_anisotropy\Qualità del filtro anisotropico (predefinito: 1x)
 \r_glsl\Abilita i pixel shader OpenGL 2.0 per l'illuminazione (predefinito: abilitato)
 \gl_vbo\Fai uso dei Vertex Buffer Objects per salvare nella memoria grafica la geometria statica per un rendering più veloce (predefinito: Vertici e Triangoli)
 \r_depthfirst\Elimina eccesso di disegno (overdraw) eseguendo il rendering della sola profondità della scena prima di iniziare il rendering "standard" (predefinito: disabilitato)
 \cl_gentle\Sostituisci il sangue e i gib con contenuti che non hanno alcun effetto di sangue (predefinito: disabilitato)
 \cl_nogibs\Riduci il numero di gib o rimuovili completamente (predefinito: parecchi)
 \v_kicktime\Quanto dura un colpo alla visuale per il danno (predefinito: 0)
-\gl_texture_anisotropy\Qualità del filtro anisotropico (predefinito: 1x)
 \r_glsl_deluxemapping\Usa gli effetti di illuminazione pixel per pixel (predefinito: abilitati)
 \r_shadow_gloss\Abilita l'uso della lucentezza delle mappe sulle texture che la supportano (predefinito: abilitati)
 \gl_flashblend\Abilita luci dinamiche più veloci ma meno gradevoli tramite il rendering di corone luminose invece di luci dinamiche reali (predefinito: disabilitato)
 \r_coronas_occlusionquery\Dissolvi corone rispetto a visibilità (predefinito: abilitato)
 \r_bloom\Abilita effetti bloom, che illuminano i pixel più vicini a pixel molto luminosi. Hanno un grosso impatto sulle performance. (predefinito: disabilitato)
 \r_hdr\Versione a più alta qualità dei bloom, che hanno un enorme impatto sulle performance. (predefinito: disabilitato)
-\r_motionblur\Forza della sfocatura da movimento - raccomandato a 0.5
-\r_damageblur\Ammontare della sfocatura da movimento quando si è colpiti - raccomandato a 0.4
+\r_motionblur\Intensità della sfocatura da movimento - raccomandato a 0.4
 
 \XonoticSettingsDialog/Audio\Impostazioni audio
 \mastervolume\-
 \g_waypointsprite_alpha\Controlla la trasparenza dei waypoint
 \cl_shownames\Mostra il nome del giocatore a cui stai mirando
 
-\crosshair_hittest\Nessuno: non fare il test di colpire per il mirino; TrueAim: sfoca il mirino quando non colpiresti il muro; Nemici: allarga anche il mirino quando colpiresti un nemico
+\crosshair_hittest\Nessuno: non fare test di colpo a segno per il mirino; VeraMira: sfoca il mirino quando non colpiresti il muro; Nemici: allarga anche il mirino quando colpiresti un nemico
index ec2d299a80928cfd63bb5b59af455ebf95036ee1..aa9e2906a9cde275327510f9c5424dad11cb4629 100644 (file)
@@ -4,9 +4,9 @@ Rudolf "divVerent" Polzer
 Tyler "-z-" Mulligan
 Merlijn Hofstra
 morphed
-mand1nga
-tZork
-
+Samual "Ares" Lenks
+Saulo "mand1nga" Gil
+Jakob "tZork" Markström Gröhn
 
 **Dévlopeurs secondaires
 
@@ -24,15 +24,22 @@ morphed
 LJFHutch
 Pearce "theShadow" Michal
 
+*Animation (FIXME)
+Sahil "DiaboliK" Singhal
+nifrek
+
 *Création des cartes
 FruitieX
 MirceaKitsune
+Jakob "tZork" Markström Gröhn
 Ruszkai "C.Brutail" Ákos
 
 *Musique / Sons
 mand1nga
 Merlijn Hofstra
 remaxim
+Stephan
+Independent.nu
 
 *Améliorations du moteur et QA
 Rudolf "divVerent" Polzer
@@ -40,7 +47,7 @@ Rudolf "divVerent" Polzer
 *Code source du jeu
 Rudolf "divVerent" Polzer
 FruitieX
-tZork
+Jakob "tZork" Markström Gröhn
 
 *Marketing / Management du Projet
 Tyler "-z-" Mulligan
@@ -57,6 +64,10 @@ by Forest "LordHavoc" Hale
 
 **Traducteurs
 
+*Dutch (FIXME)
+Alexander "freefang" van Dam
+PinkRobot
+
 *Allemand
 Rudolf "divVerent" Polzer
 
@@ -65,6 +76,14 @@ Henry "Exitium" Sanmark
 
 *Français
 Calinou
+Maxime "Taximus" Paradis
+
+*Greek (FIXME)
+Γιάννης Α.
+
+*Hungarian (FIXME)
+xaN1C4n3
+Ruszkai "C.Brutail" Ákos
 
 *Italien
 Antonio "terencehill" Piu
@@ -80,19 +99,46 @@ MirceaKitsune
 Lord Canistra
 Nikoli
 
+*Spanish (FIXME)
+Rodrigo Mouton Laudin
+
+*Swedish (FIXME)
+marcus256
+
+*Ukrainian (FIXME)
+Vasyl "Harmata" Melnyk
+
 **Contribueurs actifs
+Akari
+Ant "Antibody" Zucaro
 Antonio "terencehill" Piu
+atheros
 Ben "MooKow" Banker
+blkrbt
 Calinou
 chooksta
+cortez
 Cuinn "Cuinnton" Herrick
-Kristian "morfar" Johansson
+Florian Paul "lda17h" Schmidt
+Jope “Sless” Withers
 kojn
+Kristian "morfar" Johansson
+kuniuthefrogg
+magorian
 Maik "SavageX" Merten
+Marvin "Mirio" Beck
+Mepper
+Mick Rippon
 MrBougo
-Samual Lenks
+parasti
+Paul Scott
+PlasmaSheep
+Przemysław "atheros" Grzywacz
+{SC0RP} - Ian "ID" Dorrell
 Severin "sev" Meyer
+SoulKeeper_p
 Stephan "esteel" Stahl
+The player with the unnecessarily long name
 Wolfgang "Blub\0" Bumiller
 
 **Anciens contribueurs
@@ -101,7 +147,6 @@ Amos "torus" Dudley
 Andreas "Black" Kirsch
 Attila "WW3" Houtkooper
 BigMac
-blkrbt
 Braden "meoblast001" Walters
 Brain Younds
 Chris "amethyst7" Matz
@@ -152,7 +197,6 @@ Rick "Rat" Kelley
 Robert "ai" Kuroto
 Ronan
 Sajt
-Severin "sev" Meyer
 Shaggy
 Shank
 Simon O'Callaghan
@@ -162,7 +206,6 @@ Spirit
 Steve Vermeulen
 Supajoe
 Tei
-terencehill
 Tomaz
 Ulrich Galbraith
 Vortex
index faf205bce3fd8fada5c7d00b880d1183b2e43475..28fa0dd8bc87bced3279bc9837a2d313127cfd2f 100644 (file)
@@ -39,6 +39,7 @@ mand1nga
 Merlijn Hofstra
 remaxim
 Stephan
+Independent.nu
 
 *Játék motor kiegészitések
 Rudolf "divVerent" Polzer
@@ -61,9 +62,15 @@ Merlijn Hofstra
 DarkPlaces
 by Forest "LordHavoc" Hale
 
-
 **Fordítók
 
+*Holland
+Alexander "freefang" van Dam
+PinkRobot
+
+*Német
+Rudolf "divVerent" Polzer
+
 *Finn
 Henry "Exitium" Sanmark
 
@@ -71,37 +78,36 @@ Henry "Exitium" Sanmark
 Calinou
 Maxime "Taximus" Paradis
 
-*Holland
-Alexander "freefang" van Dam
-PinkRobot
+*Greek (FIXME)
+Γιάννης Α.
 
 *Magyar
 xaN1C4n3
 Ruszkai "C.Brutail" Ákos
 
-*Német
-Rudolf "divVerent" Polzer
-
 *Olasz
 Antonio "terencehill" Piu
 Felice "MaidenBeast" Sallustio
 
-*Orosz
-Lord Canistra
-Nikoli
-
 *Portugál
 Ricardo "Hellgardia" Silva
 
 *Román
 MirceaKitsune
 
+*Orosz
+Lord Canistra
+Nikoli
+
 *Spanyol
 Rodrigo Mouton Laudin
 
 *Svéd
 marcus256
 
+*Ukrainian (FIXME)
+Vasyl "Harmata" Melnyk
+
 **További aktív résztvevők
 Akari
 Ant "Antibody" Zucaro
@@ -114,12 +120,14 @@ chooksta
 cortez
 Cuinn "Cuinnton" Herrick
 Florian Paul "lda17h" Schmidt
+Jope “Sless” Withers
 kojn
 Kristian "morfar" Johansson
 kuniuthefrogg
 magorian
 Maik "SavageX" Merten
 Marvin "Mirio" Beck
+Mepper
 Mick Rippon
 MrBougo
 parasti
index f0ace068124096c5efa1edb1525eb2a97562f67a..76c12ec1fcb7e197ae846f182c7d9000b050bc2f 100644 (file)
@@ -4,7 +4,8 @@ Rudolf "divVerent" Polzer
 Tyler "-z-" Mulligan
 Merlijn Hofstra
 morphed
-mand1nga
+Samual "Ares" Lenks
+Saulo "mand1nga" Gil
 Jakob "tZork" Markström Gröhn
 
 **Coordinatori
@@ -31,12 +32,14 @@ nifrek
 FruitieX
 MirceaKitsune
 Jakob "tZork" Markström Gröhn
+Ruszkai "C.Brutail" Ákos
 
 *Musiche / Effetti sonori
 mand1nga
 Merlijn Hofstra
 remaxim
 Stephan
+Independent.nu
 
 *Aggiunte al codice del motore e QA
 Rudolf "divVerent" Polzer
@@ -49,6 +52,7 @@ Jakob "tZork" Markström Gröhn
 *Marketing / Pubbliche Relazioni
 Tyler "-z-" Mulligan
 mand1nga
+Ruszkai "C.Brutail" Ákos
 
 *Aspetti legali
 Rudolf "divVerent" Polzer
@@ -60,6 +64,10 @@ by Forest "LordHavoc" Hale
 
 **Traduttori
 
+*Dutch
+Alexander "freefang" van Dam
+PinkRobot
+
 *Tedesco
 Rudolf "divVerent" Polzer
 
@@ -68,6 +76,14 @@ Henry "Exitium" Sanmark
 
 *Francese
 Calinou
+Maxime "Taximus" Paradis
+
+*Greco
+Γιάννης Α.
+
+*Ungherese
+xaN1C4n3
+Ruszkai "C.Brutail" Ákos
 
 *Italiano
 Antonio "terencehill" Piu
@@ -83,26 +99,47 @@ MirceaKitsune
 Lord Canistra
 Nikoli
 
-**Contributori attivi
+*Spagnolo
+Rodrigo Mouton Laudin
+
+*Svedese
+marcus256
+
+*Ucraino
+Vasyl "Harmata" Melnyk
+
+**Altri contributori attivi
+Akari
 Ant "Antibody" Zucaro
 Antonio "terencehill" Piu
+atheros
 Ben "MooKow" Banker
 blkrbt
 Calinou
 chooksta
+cortez
 Cuinn "Cuinnton" Herrick
 Florian Paul "lda17h" Schmidt
-Kristian "morfar" Johansson
+Jope “Sless” Withers
 kojn
+Kristian "morfar" Johansson
+kuniuthefrogg
+magorian
 Maik "SavageX" Merten
+Marvin "Mirio" Beck
+Mepper
+Mick Rippon
 MrBougo
+parasti
+Paul Scott
+PlasmaSheep
 Przemysław "atheros" Grzywacz
-Ruszkai "C.Brutail" Ákos
-Samual Lenks
+{SC0RP} - Ian "ID" Dorrell
 Severin "sev" Meyer
+SoulKeeper_p
 Stephan "esteel" Stahl
+The player with the unnecessarily long name
 Wolfgang "Blub\0" Bumiller
-SoulKeeper_p
 
 **Contributori passati
 Alexander "motorsep" Zubov
index 1b3351d4f8e3e3b6c80b8b3ed6e33ee4d360f898..26320bb97b08bac0e6ac752d9c873da65a0de7c0 100644 (file)
@@ -39,6 +39,7 @@ mand1nga
 Merlijn Hofstra
 remaxim
 Stephan
+Independent.nu
 
 *Додатки до коду рушія та контроль якості
 Rudolf "divVerent" Polzer
@@ -77,8 +78,12 @@ Henry "Exitium" Sanmark
 Calinou
 Maxime "Taximus" Paradis
 
+*Greek (FIXME)
+Γιάννης Α.
+
 *Угорська мова
 xaN1C4n3
+Ruszkai "C.Brutail" Ákos
 
 *Італійська мова
 Antonio "terencehill" Piu
@@ -115,12 +120,14 @@ chooksta
 cortez
 Cuinn "Cuinnton" Herrick
 Florian Paul "lda17h" Schmidt
+Jope “Sless” Withers
 kojn
 Kristian "morfar" Johansson
 kuniuthefrogg
 magorian
 Maik "SavageX" Merten
 Marvin "Mirio" Beck
+Mepper
 Mick Rippon
 MrBougo
 parasti