]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/megaerebus_glow' into 'master'
authorMario <zacjardine@y7mail.com>
Sun, 11 Aug 2019 10:54:25 +0000 (10:54 +0000)
committerMario <zacjardine@y7mail.com>
Sun, 11 Aug 2019 10:54:25 +0000 (10:54 +0000)
Fix glowing of megaerebus, erebus fullbright and nyx fullbright

Closes #2018

See merge request xonotic/xonotic-data.pk3dir!651

147 files changed:
.gitlab-ci.yml
.tx/merge-base
_hud_common.cfg
bal-wep-mario.cfg
bal-wep-nexuiz25.cfg
bal-wep-samual.cfg
bal-wep-xdf.cfg
bal-wep-xonotic.cfg
bal-wep-xpm.cfg
common.el.po
common.en_AU.po
common.es.po
common.fr.po
common.nl.po
common.pt_BR.po
common.ro.po
common.ru.po
common.sr.po
common.zh_CN.po
common.zh_TW.po
gfx/hud/luma/notify_teamkill_blue.tga
gfx/hud/luma/notify_teamkill_neutral.tga
gfx/hud/luma/notify_teamkill_pink.tga
gfx/hud/luma/notify_teamkill_red.tga
gfx/hud/luma/notify_teamkill_yellow.tga
gfx/menu/wickedx/background_ingame.tga
gfx/menu/wickedx/background_l2.tga
gfx/menu/wickedx/skinpreview.jpg
languages.txt
mutators.cfg
qcsrc/client/autocvars.qh
qcsrc/client/hud/panel/modicons.qc
qcsrc/client/hud/panel/modicons.qh
qcsrc/client/main.qh
qcsrc/client/view.qc
qcsrc/client/view.qh
qcsrc/common/deathtypes/all.qh
qcsrc/common/effects/qc/damageeffects.qc
qcsrc/common/gamemodes/gamemode/assault/sv_assault.qc
qcsrc/common/gamemodes/gamemode/ctf/_mod.inc
qcsrc/common/gamemodes/gamemode/ctf/_mod.qh
qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qh
qcsrc/common/gamemodes/gamemode/domination/_mod.inc
qcsrc/common/gamemodes/gamemode/domination/_mod.qh
qcsrc/common/gamemodes/gamemode/domination/cl_domination.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/domination/cl_domination.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc
qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh
qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc
qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh
qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/keyhunt/sv_keyhunt.qc
qcsrc/common/gamemodes/gamemode/keyhunt/sv_keyhunt.qh
qcsrc/common/gamemodes/gamemode/nexball/_mod.inc
qcsrc/common/gamemodes/gamemode/nexball/_mod.qh
qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/nexball.qc [deleted file]
qcsrc/common/gamemodes/gamemode/nexball/nexball.qh [deleted file]
qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/weapon.qh
qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc
qcsrc/common/mapobjects/misc/corner.qc
qcsrc/common/mapobjects/misc/dynlight.qc
qcsrc/common/mapobjects/target/music.qc
qcsrc/common/mapobjects/trigger/counter.qc
qcsrc/common/mapobjects/trigger/heal.qc
qcsrc/common/mapobjects/trigger/magicear.qc
qcsrc/common/mapobjects/trigger/swamp.qc
qcsrc/common/mapobjects/trigger/swamp.qh
qcsrc/common/minigames/minigame/bd.qc
qcsrc/common/minigames/minigame/c4.qc
qcsrc/common/minigames/minigame/nmm.qc
qcsrc/common/minigames/minigame/pong.qc
qcsrc/common/minigames/minigame/pp.qc
qcsrc/common/minigames/minigame/ps.qc
qcsrc/common/minigames/minigame/ttt.qc
qcsrc/common/models/model.qh
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_spawner.qc
qcsrc/common/mutators/base.qh
qcsrc/common/mutators/mutator/buffs/buffs.qh
qcsrc/common/mutators/mutator/damagetext/cl_damagetext.qc
qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/itemstime/itemstime.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/overkill/sv_overkill.qc
qcsrc/common/mutators/mutator/vampire/sv_vampire.qc
qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh
qcsrc/common/sounds/all.inc
qcsrc/common/sounds/sound.qh
qcsrc/common/t_items.qc
qcsrc/common/turrets/checkpoint.qc
qcsrc/common/turrets/cl_turrets.qc
qcsrc/common/turrets/sv_turrets.qc
qcsrc/common/vehicles/vehicle/spiderbot_weapons.qc
qcsrc/common/weapons/weapon.qh
qcsrc/common/weapons/weapon/blaster.qh
qcsrc/common/weapons/weapon/hook.qh
qcsrc/common/weapons/weapon/machinegun.qc
qcsrc/common/weapons/weapon/machinegun.qh
qcsrc/common/weapons/weapon/mortar.qh
qcsrc/common/weapons/weapon/porto.qc
qcsrc/common/weapons/weapon/porto.qh
qcsrc/common/weapons/weapon/tuba.qc
qcsrc/common/weapons/weapon/tuba.qh
qcsrc/common/wepent.qc
qcsrc/lib/registry.qh
qcsrc/lib/spawnfunc.qh
qcsrc/menu/xonotic/util.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/api.qh
qcsrc/server/bot/default/havocbot/havocbot.qc
qcsrc/server/bot/default/havocbot/havocbot.qh
qcsrc/server/bot/default/havocbot/roles.qc
qcsrc/server/bot/default/havocbot/roles.qh
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/client.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_hook.qh
qcsrc/server/g_world.qc
qcsrc/server/handicap.qc
qcsrc/server/impulse.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/events.qh
qcsrc/server/player.qc
qcsrc/server/race.qc
qcsrc/server/race.qh
qcsrc/server/steerlib.qc
qcsrc/server/sv_main.qc
qcsrc/server/sv_main.qh
qcsrc/server/teamplay.qc
qcsrc/server/weapons/tracing.qc
xonotic-client.cfg
xonotic-common.cfg
xonotic-server.cfg

index 81af16137d5ca6d759caf2ff94c2c7830e6f8a2f..dd18ca4a7041e35163701c56fb6106220555bf9b 100644 (file)
@@ -29,7 +29,7 @@ test_sv_game:
     - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints
     - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache
     - make
-    - EXPECT=6e591fe90a6b90e62fdfd531636dd6eb
+    - EXPECT=0bff07a368ae61253bf725b0a7e794e7
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index d795790ea67bc092e05c23ce192699edd502f2d3..27d0db5ace70b7062d64d3138ea86384f87ba81f 100644 (file)
@@ -1 +1 @@
-Fri May 24 07:24:30 CEST 2019
+Tue Jul 30 07:24:47 CEST 2019
index 9c29d18921f3d8862b2c4d79ad5a74ae7d23da51..c860be99cebd39ff846ded8cba3cdcbc790fb8b9 100644 (file)
@@ -117,7 +117,7 @@ seta hud_panel_scoreboard_minwidth 0.6 "minimum width of the scoreboard"
 
 seta hud_panel_scoreboard_accuracy_showdelay 2 "how long to delay displaying accuracy below the scoreboard if it's too far down"
 seta hud_panel_scoreboard_accuracy_showdelay_minpos 0.75 "delay displaying the accuracy panel only if its position is lower than this percentage of the screen height from the top"
-seta hud_panel_scoreboard_team_size_position 0 "where to show the team size (0 = do not show, 1 = left of scoreboard, 2 = right of scoreboard, and move team scores to the right)"
+seta hud_panel_scoreboard_team_size_position 0 "where to show the team size (0 = do not show, 1 = left of scoreboard, 2 = right of scoreboard), will move team scores to the other side if necessary"
 
 // hud panel aliases
 alias quickmenu "cl_cmd hud quickmenu ${* ?}"
index 45a75349be2cfba6658cd4199f6a25aba847350c..c838e00586b8cd44a28cf9486642db34dbc696d6 100644 (file)
@@ -71,7 +71,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.3
 set g_balance_machinegun_burst_refire 0.06
 set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 14
index b1a83000f6f41d18345045cfd9d7b44c9c41442f..a27427305ceb05b635fc0c1da19729a3b50ab024 100644 (file)
@@ -71,7 +71,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.75
 set g_balance_machinegun_burst_refire 0.05
 set g_balance_machinegun_burst_refire2 0.75
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 30
index 1816f3f2e921ce4de93ceabcc2bad978861fcdd4..4a5827d2b0af7e44386487b9546a196d5c38ecff 100644 (file)
@@ -86,7 +86,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.3
 set g_balance_machinegun_burst_refire 0.06
 set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 14
index 13bdc529a9f7364e36ce66ec85b596732e2b0f7b..a9592ac1f5bb8befcd420c3b84c2bf0c0bc9a0d7 100644 (file)
@@ -71,7 +71,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.3
 set g_balance_machinegun_burst_refire 0.06
 set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 14
index 5c6ace7abd7c6649f82b9998570e562154431a8e..c730ebc1eddacbfa232720d97ec190efc4ba6568 100644 (file)
@@ -71,7 +71,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.3
 set g_balance_machinegun_burst_refire 0.06
 set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 14
index a5438d1b7c65a39ebe33f27da62dfb47e3c5e359..6dea1ed6ea76749b5c27be685392be7b91ea69e5 100644 (file)
@@ -71,7 +71,7 @@ set g_balance_machinegun_burst_ammo 3
 set g_balance_machinegun_burst_animtime 0.3
 set g_balance_machinegun_burst_refire 0.06
 set g_balance_machinegun_burst_refire2 0.45
-set g_balance_machinegun_burst_speed 0
+set g_balance_machinegun_burst_spread 0
 set g_balance_machinegun_first 1
 set g_balance_machinegun_first_ammo 1
 set g_balance_machinegun_first_damage 14
index 5d226bf32be88b34ed728e843cdfece5c7318ee5..c32867dc4cf0b81fd6e3f8f46a498a6a25a06079 100644 (file)
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
+# Hector Champipis <hector-hab@hotmail.com>, 2019
 # MasterWord, 2016
 # Vindex <kon14.inside@gmail.com>, 2014
 # Konstantinos Mihalenas <ldinos99@gmail.com>, 2014
@@ -17,8 +18,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-05-28 16:16+0000\n"
+"Last-Translator: Hector Champipis <hector-hab@hotmail.com>\n"
 "Language-Team: Greek (http://www.transifex.com/team-xonotic/xonotic/language/"
 "el/)\n"
 "Language: el\n"
@@ -30,7 +31,7 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:243
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr ""
+msgstr "^2Επιτυχώς εξήχθη στο %s! (Σημείωση: Αποθηκεύθη στο data/data/)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
@@ -41,6 +42,8 @@ msgstr "^1Δεν μπορεις να γραψείς στο %s"
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
 msgstr ""
+"^3Μήνυμα αντίστροφης μέτρησης στη στιγμή %s, δευτερόλεπτα που απομένουν: "
+"^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -48,15 +51,17 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Μήνυμα πολλαπλών σειρών στη στιγμή %s το οποίο\n"
+"^1διαρκεί περισσότερο του κανονικού"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Μήνυμα στη στιγμή %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "Κοινότυπο μήνυμα"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -84,7 +89,7 @@ msgstr "^1Πατήστε ^3%s^1 για παρακολούθηση"
 #: qcsrc/client/hud/panel/infomessages.qc:102
 #: qcsrc/menu/xonotic/keybinder.qc:47
 msgid "primary fire"
-msgstr "πρωταρχικά πυρά "
+msgstr "βασική λειτουργία όπλου"
 
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #, c-format
@@ -109,7 +114,7 @@ msgstr "^1Χρησιμοποιήστε ^3%s^1 ή ^3%s^1 για αλλαγή τα
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #, c-format
 msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
-msgstr ""
+msgstr "^1Πιέστε^3%s^1 για παρατήρηση, ^3%s^1 για αλλαγή λειτουργίας κάμερας"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
@@ -119,7 +124,7 @@ msgstr "ρίξτε το όπλο"
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/menu/xonotic/keybinder.qc:48
 msgid "secondary fire"
-msgstr "δεÏ\85Ï\84εÏ\81εÏ\8dονÏ\84α Ï\80Ï\85Ï\81ά"
+msgstr "εναλλακÏ\84ική Î»ÎµÎ¹Ï\84οÏ\85Ï\81γία Ï\8cÏ\80λοÏ\85"
 
 #: qcsrc/client/hud/panel/infomessages.qc:113
 #, c-format
@@ -169,12 +174,12 @@ msgstr "%sΠατήστε ^3%s%s για να τελειώσετε την προθ
 #: qcsrc/client/hud/panel/infomessages.qc:177
 #: qcsrc/menu/xonotic/keybinder.qc:101
 msgid "ready"
-msgstr "έτοιμος"
+msgstr "έτοιμος"
 
 #: qcsrc/client/hud/panel/infomessages.qc:164
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr "%sΠατήστε ^3%s%s μόλις είστε έτοιμος"
+msgstr "%sΠατήστε ^3%s%s μόλις είστε έτοιμος"
 
 #: qcsrc/client/hud/panel/infomessages.qc:169
 msgid "^2Waiting for others to ready up to end warmup..."
@@ -191,12 +196,12 @@ msgstr "^2Πατήστε ^3%s^2 για να τελειώσετε την προθ
 
 #: qcsrc/client/hud/panel/infomessages.qc:198
 msgid "Teamnumbers are unbalanced!"
-msgstr ""
+msgstr "Οι πληθυσμοί των ομάδων είναι εκτός ισορροπίας!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #, c-format
 msgid " Press ^3%s%s to adjust"
-msgstr ""
+msgstr "Πατήστε ^3%s%s για ρύθμιση"
 
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #: qcsrc/menu/xonotic/keybinder.qc:117
@@ -205,27 +210,31 @@ msgstr "μενού ομάδας"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating this player:"
-msgstr "^1ΠαÏ\81ακολοÏ\85θήÏ\82 αυτόν τον παίκτη:"
+msgstr "^1ΠαÏ\81ακολοÏ\85θείÏ\84ε αυτόν τον παίκτη:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating you:"
-msgstr "^1Î\95Ï\83Ï\8d Ï\80αÏ\81ακοÏ\85λοÏ\85θήÏ\82:"
+msgstr "^1Σε Ï\80αÏ\81ακολοÏ\85θοÏ\8dν:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:227
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr ""
+"^7Πατήστε ^3ESC ^7για να δείτε τις επιλογές προβολής στοιχείων στην οθόνη."
 
 #: qcsrc/client/hud/panel/infomessages.qc:228
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr ""
+"^3Κάντε διπλό κλικ ^7σε κάποιο ταμπλό για επιλογές ειδικευμένες για αυτό το "
+"ταμπλό."
 
 #: qcsrc/client/hud/panel/infomessages.qc:229
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr ""
+"^3CTRL ^7για να απενεργοποιήσετε την δοκιμασία σύγκρουσης, ^3SHIFT ^7 και"
 
 #: qcsrc/client/hud/panel/infomessages.qc:230
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
-msgstr ""
+msgstr "^3ALT ^7+ ^3ΚΑΤΕΥΘΗΝΤΗΡΙΑ ΒΕΛΗ ^7για λεπτομερείς ρυθμίσεις."
 
 #: qcsrc/client/hud/panel/modicons.qc:576
 msgid "Personal best"
@@ -245,12 +254,12 @@ msgstr "Παίχτης %d"
 #: qcsrc/client/hud/panel/quickmenu.qc:593
 #, c-format
 msgid "Submenu%d"
-msgstr ""
+msgstr "Υπό - μενού%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:598
 #, c-format
 msgid "Command%d"
-msgstr ""
+msgstr "Εντολή%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:624
 msgid "Continue..."
@@ -259,23 +268,23 @@ msgstr "Συνέχεια..."
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr "ΣÏ\85ζήÏ\84ηÏ\83η"
+msgstr "ΣÏ\85νομιλία"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^Στείλτε δημόσιο μήνυμα σε"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
-msgstr ""
+msgstr "QMCMD^:-) / καλό!"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^nice one"
-msgstr ""
+msgstr "QMCMD^καλό!"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:784
 msgid "QMCMD^good game"
-msgstr "QMCMD^Ωραίο παιχνίδι"
+msgstr "QMCMD^ωραίο παιχνίδι"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck"
@@ -283,7 +292,7 @@ msgstr "QMCMD^γεια / καλή τύχη"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:785
 msgid "QMCMD^hi / good luck and have fun"
-msgstr "QMCMD^γεια / ÎºÎ±Î»Î® Ï\84Ï\8dÏ\87η ÎºÎ±Î¹ ÎºÎ±Î»Î¬ Î½Î± Ï\80εÏ\81άÏ\83οÏ\85με"
+msgstr "QMCMD^γεια / ÎºÎ±Î»Î® Ï\84Ï\8dÏ\87η ÎºÎ±Î¹ ÎºÎ±Î»Î® Î´Î¹Î±Ï\83κέδαÏ\83η"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
@@ -292,11 +301,11 @@ msgstr "QMCMD^Στέιλε στα αγγλικά"
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^Team chat"
-msgstr "QMCMD^ΣÏ\85ζήÏ\84ηÏ\83η ομάδας"
+msgstr "QMCMD^ΣÏ\85νομιλία ομάδας"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
-msgstr ""
+msgstr "QMCMD^τετραπλασιασμός προσεχώς"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item %x^7 (l:%y^7)"
@@ -304,15 +313,15 @@ msgstr "QMCMD^Ελέυθερο αντικείμενο %x^7 (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item, icon"
-msgstr ""
+msgstr "QMCMD^Ελέυθερο αντικείμενο, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^αντικείμενο πάρθηκε (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item, icon"
-msgstr ""
+msgstr "QMCMD^αντικείμενο πάρθηκε, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:796
 msgid "QMCMD^negative"
@@ -324,7 +333,7 @@ msgstr "QMCMD^θετικό"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^χρειάζομαι βοήθεια (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 msgid "QMCMD^need help, icon"
@@ -332,43 +341,43 @@ msgstr "QMCMD^χρειάζομαι βοήθεια, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^εχθρός εθεάθη (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^enemy seen, icon"
-msgstr ""
+msgstr "QMCMD^εχθρός εθεάθη, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^η σημαία εθεάθη (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^flag seen, icon"
-msgstr ""
+msgstr "QMCMD^η σημαία εθεάθη, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^αμυνόμενος/η (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending, icon"
-msgstr ""
+msgstr "QMCMD^αμυνόμενος/η, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^περιπλανώμενος/η (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming, icon"
-msgstr ""
+msgstr "QMCMD^περιπλανώμενος/η, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^επιτιθέμενος/η (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking, icon"
-msgstr "QMCMD^μαÏ\87ειÏ\84ικÏ\8c, εικονίδιο"
+msgstr "QMCMD^εÏ\80ιÏ\84ιθέμενοÏ\82/η, εικονίδιο"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier (l:%y^7)"
index 26f514a62f780c97c6065c02513d23ed0c7b0ed5..bc067da03474d1113932f92c5f45d34860db6af9 100644 (file)
@@ -6,14 +6,15 @@
 # Laurene Albrand, 2015
 # Laurene Albrand, 2015
 # Laurene Albrand, 2015
+# Matthew Wu <matthewwu2003.1@gmail.com>, 2019
 # Stuart Young <cefiar@gmail.com>, 2016
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-06-20 16:11+0000\n"
+"Last-Translator: Matthew Wu <matthewwu2003.1@gmail.com>\n"
 "Language-Team: English (Australia) (http://www.transifex.com/team-xonotic/"
 "xonotic/language/en_AU/)\n"
 "Language: en_AU\n"
@@ -89,12 +90,12 @@ msgstr "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #: qcsrc/client/hud/panel/infomessages.qc:108
 msgid "next weapon"
-msgstr ""
+msgstr "next weapon"
 
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #: qcsrc/client/hud/panel/infomessages.qc:108
 msgid "previous weapon"
-msgstr ""
+msgstr "previous weapon"
 
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #, c-format
@@ -594,7 +595,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "Number of deaths"
-msgstr ""
+msgstr "Number of deaths"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
@@ -682,7 +683,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "Number of goals scored"
-msgstr ""
+msgstr "Number of goals scored"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "SCO^goals"
@@ -716,7 +717,7 @@ msgstr "SCO^kdratio"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "Number of kills"
-msgstr ""
+msgstr "Number of kills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^kills"
index 5aec45841d4cdbce84ec0559bee7a7fc93d1c88e..f303f41b510c840cffd7aaea0b23d5ec645fab74 100644 (file)
@@ -8,16 +8,16 @@
 # Ari_tent <xonotic@outlook.com>, 2014
 # brunodeleo <bruno.laurenzano@gmail.com>, 2014
 # brunodeleo <bruno.laurenzano@gmail.com>, 2014
-# starfire24680 <starfire24680@gmail.com>, 2017
+# Damian Kurek <starfire24680@gmail.com>, 2017-2019
 # roader_gentoo <ivanviso123@gmail.com>, 2014
 # kammy smb <kammysmb@gmail.com>, 2013
 # kammy smb <kammysmb@gmail.com>, 2013
 # roader_gentoo <ivanviso123@gmail.com>, 2014
 # Rodrigo Mouton Laudin <ratogenesis@gmail.com>, 2011
 # Simon <inactive+0000simon@transifex.com>, 2014-2015
-# starfire24680 <starfire24680@gmail.com>, 2018
-# starfire24680 <starfire24680@gmail.com>, 2017-2018
-# starfire24680 <starfire24680@gmail.com>, 2017
+# Damian Kurek <starfire24680@gmail.com>, 2018
+# Damian Kurek <starfire24680@gmail.com>, 2017-2018
+# Damian Kurek <starfire24680@gmail.com>, 2017
 # Vitama Piru Leta <vitamanrules@gmail.com>, 2017
 # Ari_tent <xonotic@outlook.com>, 2014
 # Yllelder, 2016
@@ -27,8 +27,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-06-12 20:28+0000\n"
+"Last-Translator: Damian Kurek <starfire24680@gmail.com>\n"
 "Language-Team: Spanish (http://www.transifex.com/team-xonotic/xonotic/"
 "language/es/)\n"
 "Language: es\n"
@@ -40,17 +40,17 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:243
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr ""
+msgstr "^2¡Exportado con éxito a %s! (Nota: Está guardado en data/data/) "
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
 msgid "^1Couldn't write to %s"
-msgstr ""
+msgstr "^1No se pudo escribir a %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3Mensaje de cuenta atrás a la hora %s, segundos restantes: ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -58,15 +58,17 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Mensaje de multiples líneas a la hora %s que\n"
+"^1dura mas de lo normal"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Mensaje a la hora %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "Mensaje genérico"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -270,11 +272,11 @@ msgstr "Continuar..."
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^Enviar mensaje público a"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
@@ -298,7 +300,7 @@ msgstr "QMCMD^hola / buena suerte y diviértete"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
-msgstr ""
+msgstr "QMCMD^Enviar en inglés"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
@@ -562,23 +564,23 @@ msgstr "Intermedio %d"
 #: qcsrc/client/hud/panel/racetimer.qc:262
 #, c-format
 msgid "PENALTY: %.1f (%s)"
-msgstr ""
+msgstr "SANCION: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
-msgstr ""
+msgstr "falta un punto de control"
 
 #: qcsrc/client/hud/panel/radar.qc:373
 msgid "Click to select teleport destination"
-msgstr ""
+msgstr "Haz click para seleccionar el destino de teletransporte"
 
 #: qcsrc/client/hud/panel/radar.qc:377
 msgid "Click to select spawn location"
-msgstr ""
+msgstr "Haz click para seleccionar el lugar de reaparición"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "Number of ball carrier kills"
-msgstr ""
+msgstr "Número de asesinatos de portadores de pelotas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "SCO^bckills"
@@ -590,11 +592,12 @@ msgstr "SCO^bctime"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "Total amount of time holding the ball in Keepaway"
-msgstr ""
+msgstr "Tiempo total reteniendo la pelota en Keepaway"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
 msgstr ""
+"Frecuencia con la que una bandera(CTF) o llave (KeyHunt) ha sido capturada"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "SCO^caps"
@@ -606,11 +609,11 @@ msgstr "SCO^tiempo de captura"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "Time of fastest capture (CTF)"
-msgstr ""
+msgstr "Tiempo de la captura mas rápida (CTF)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "Number of deaths"
-msgstr ""
+msgstr "Número de muertes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
@@ -618,7 +621,7 @@ msgstr "SCO^muertes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "Number of keys destroyed by pushing them into void"
-msgstr ""
+msgstr "Número de llaves destruidas arrojándolas al vacío"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "SCO^destroyed"
@@ -630,7 +633,7 @@ msgstr "SCO^daño"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
-msgstr ""
+msgstr "Daño total realizado"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
@@ -638,11 +641,11 @@ msgstr "SCO^daño recibido"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "The total damage taken"
-msgstr ""
+msgstr "Daño total recibido"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "Number of flag drops"
-msgstr ""
+msgstr "Número de banderas soltadas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "SCO^drops"
@@ -650,23 +653,23 @@ msgstr "SCO^caidas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "Player ELO"
-msgstr ""
+msgstr "ELO del jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:96
 msgid "SCO^elo"
-msgstr ""
+msgstr "elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "SCO^fastest"
-msgstr ""
+msgstr "el mas rápido"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:97
 msgid "Time of fastest lap (Race/CTS)"
-msgstr ""
+msgstr "Tiempo de la vuelta mas rápida (Race/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:98
 msgid "Number of faults committed"
-msgstr ""
+msgstr "Número de faltas cometidas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:98
 msgid "SCO^faults"
@@ -674,7 +677,7 @@ msgstr "SCO^faltas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:99
 msgid "Number of flag carrier kills"
-msgstr ""
+msgstr "Número de asesinatos de portadores de bandera"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:99
 msgid "SCO^fckills"
@@ -682,23 +685,23 @@ msgstr "SCO^fckills"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "FPS"
-msgstr ""
+msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "SCO^fps"
-msgstr ""
+msgstr "fps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "Number of kills minus suicides"
-msgstr ""
+msgstr "Número de asesinatos menos suicidios"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "SCO^frags"
-msgstr ""
+msgstr "eliminaciones"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "Number of goals scored"
-msgstr ""
+msgstr "Número de goles marcados"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "SCO^goals"
@@ -706,7 +709,7 @@ msgstr "SCO^metas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "Number of keys carrier kills"
-msgstr ""
+msgstr "Número de asesinatos de portadores de llaves"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "SCO^kckills"
@@ -720,7 +723,7 @@ msgstr "SCO^k/d"
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "The kill-death ratio"
-msgstr ""
+msgstr "La razón asesinato-muerte"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^kdr"
@@ -732,7 +735,7 @@ msgstr "SCO^kdratio"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "Number of kills"
-msgstr ""
+msgstr "Número de asesinatos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^kills"
@@ -740,7 +743,7 @@ msgstr "SCO^muertes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "Number of laps finished (Race/CTS)"
-msgstr ""
+msgstr "Número de vueltas terminadas (carrera/cts)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "SCO^laps"
@@ -748,7 +751,7 @@ msgstr "SCO^vueltas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "Number of lives (LMS)"
-msgstr ""
+msgstr "Número de vidas (LMS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "SCO^lives"
@@ -756,7 +759,7 @@ msgstr "SCO^vidas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of times a key was lost"
-msgstr ""
+msgstr "Número de veces que se perdió la llave"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "SCO^losses"
@@ -765,7 +768,7 @@ msgstr "SCO^derrotas"
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "Player name"
-msgstr ""
+msgstr "Nombre del jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "SCO^name"
@@ -777,7 +780,7 @@ msgstr "SCO^nick"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of objectives destroyed"
-msgstr ""
+msgstr "Número de objetivos destruidos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^objectives"
@@ -787,6 +790,8 @@ msgstr "SCO^objetivos"
 msgid ""
 "How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up"
 msgstr ""
+"Frecuencia con que una bandera (CTF) o llave(KeyHunt) o bola (Keepaway) fue "
+"tomada"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid "SCO^pickups"
@@ -794,7 +799,7 @@ msgstr "SCO^recogidas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "Ping time"
-msgstr ""
+msgstr "Tiempo del ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "SCO^ping"
@@ -802,7 +807,7 @@ msgstr "SCO^ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "Packet loss"
-msgstr ""
+msgstr "Pérdida de paquetes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "SCO^pl"
@@ -810,7 +815,7 @@ msgstr "SCO^pl"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of players pushed into void"
-msgstr ""
+msgstr "Número de jugadores empujados al vacío"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^pushes"
@@ -818,7 +823,7 @@ msgstr "SCO^ofensivas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "Player rank"
-msgstr ""
+msgstr "Rango del jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "SCO^rank"
@@ -826,7 +831,7 @@ msgstr "SCO^rango"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of flag returns"
-msgstr ""
+msgstr "Número de retornos de banderas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "SCO^returns"
@@ -834,7 +839,7 @@ msgstr "SCO^devoluciones"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "Number of revivals"
-msgstr ""
+msgstr "Número de reanimaciones"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "SCO^revivals"
@@ -842,7 +847,7 @@ msgstr "SCO^reanimaciones"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of rounds won"
-msgstr ""
+msgstr "Número de rondas ganadas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^rounds won"
@@ -854,11 +859,11 @@ msgstr "SCO^puntuación"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "Total score"
-msgstr ""
+msgstr "Puntuación total"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "Number of suicides"
-msgstr ""
+msgstr "Número de suicidios"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^suicides"
@@ -866,7 +871,7 @@ msgstr "SCO^suicidios"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "Number of kills minus deaths"
-msgstr ""
+msgstr "Número de asesinatos menos muertes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^sum"
@@ -874,7 +879,7 @@ msgstr "SCO^suma"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of domination points taken (Domination)"
-msgstr ""
+msgstr "Número de puntos de dominación tomados (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^takes"
@@ -882,15 +887,15 @@ msgstr "SCO^tomas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of teamkills"
-msgstr ""
+msgstr "Número de asesinatos de compañeros"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^teamkills"
-msgstr ""
+msgstr "asesinatos de compañeros"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "Number of ticks (Domination)"
-msgstr ""
+msgstr "Número de ticks (Domination)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^ticks"
@@ -898,50 +903,57 @@ msgstr "SCO^ticks"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^time"
-msgstr ""
+msgstr "tiempo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "Total time raced (Race/CTS)"
-msgstr ""
+msgstr "Tiempo total de carrera (Race/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:312
 msgid ""
 "You can modify the scoreboard using the ^2scoreboard_columns_set command."
-msgstr ""
+msgstr "Puedes modificar el marcador con el comando ^2scoreboard_columns_set "
 
 #: qcsrc/client/hud/panel/scoreboard.qc:313
 msgid "Usage:"
-msgstr ""
+msgstr "Uso:"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:315
 msgid "^2scoreboard_columns_set ^3field1 field2 ..."
-msgstr ""
+msgstr "^2scoreboard_columns_set ^3field1 field2 ..."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:316
 msgid ""
 "^2scoreboard_columns_set ^7without arguments reads the arguments from the "
 "cvar scoreboard_columns"
 msgstr ""
+"^2scoreboard_columns_set ^7sin argumentos lee los argumentos del cvar "
+"scoreboard_columns"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:317
 msgid ""
 "  ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
 "map start"
 msgstr ""
+"  ^5Note: ^7scoreboard_columns_set sin argumentos es ejecutado en el "
+"comienzo de cada partida"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:318
 msgid ""
 "^2scoreboard_columns_set ^3expand_default ^7loads default layout and expands "
 "it into the cvar scoreboard_columns so you can edit it"
 msgstr ""
+"^2scoreboard_columns_set ^3expand_default ^7carga el diseño actual y lo "
+"expande en la cvar scoreboard_columns para que lo puedas editar"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:319
 msgid "You can use a ^3|^7 to start the right-aligned fields."
-msgstr ""
+msgstr "Puedes usar un ^3|^7 para empezar los campos alineados a la derecha."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:320
 msgid "The following field names are recognized (case insensitive):"
 msgstr ""
+"Los siguientes nombres de campo son reconocidos (sensible a mayúsculas): "
 
 #: qcsrc/client/hud/panel/scoreboard.qc:326
 msgid ""
@@ -950,28 +962,41 @@ msgid ""
 "or in all but these game types. You can also specify 'all' as a\n"
 "field to show all fields available for the current game mode."
 msgstr ""
+"Después de un campo puedes poner un signo + o - , y luego una lista \n"
+"de tipos de juego separados por comas, luego una barra diagonal, \n"
+"para hacer que el campo se muestre solo en esos o en todos menos en\n"
+"esos tipos de juegos. También puedes especificar 'all' como campo \n"
+"para mostrar todos los campos disponibles para el modo de juego \n"
+"actual."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:332
 msgid ""
 "The special game type names 'teams' and 'noteams' can be used to\n"
 "include/exclude ALL teams/noteams game modes."
 msgstr ""
+"Los nombres especiales de tipo de juego 'teams' y 'noteams' pueden \n"
+"ser usados para incluir/excluir TODOS los modos de juego\n"
+"teams/noteams."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:336
 msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
-msgstr ""
+msgstr "Ejemplo: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:337
 msgid ""
 "will display name, ping and pl aligned to the left, and the fields\n"
 "right of the vertical bar aligned to the right."
 msgstr ""
+"mostrará el nombre, ping y pl alinieados a la izquierda, y los campos a la\n"
+"derecha de la barra vertical alineada a la derecha."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:339
 msgid ""
 "'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
 "other gamemodes except DM."
 msgstr ""
+"'field3' solo será mostrado en CTF, y 'field4' será mostrado en todos los\n"
+"demás modos de juego excepto DM."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:603
 #: qcsrc/client/hud/panel/scoreboard.qc:610
@@ -1013,13 +1038,13 @@ msgstr "Clasificaciones"
 #: qcsrc/client/hud/panel/scoreboard.qc:1613
 #, c-format
 msgid "^3%1.0f minutes"
-msgstr ""
+msgstr "^3%1.0f minutos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1622
 #: qcsrc/client/hud/panel/scoreboard.qc:1629
 #, c-format
 msgid "^5%s %s"
-msgstr ""
+msgstr "^5%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1623
 #: qcsrc/client/hud/panel/scoreboard.qc:1630
@@ -1039,12 +1064,12 @@ msgstr "SCO^es batido"
 #: qcsrc/client/hud/panel/scoreboard.qc:1648
 #, c-format
 msgid "^2+%s %s"
-msgstr ""
+msgstr "^2+%s %s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1659
 #, c-format
 msgid "^7Map: ^2%s"
-msgstr ""
+msgstr "^7Mapa: ^2%s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1798
 #, c-format
@@ -1078,11 +1103,12 @@ msgstr "Estás muerto, pulsa ^2%s^7 para reaparecer"
 
 #: qcsrc/client/hud/panel/timer.qc:67
 msgid "WARMUP"
-msgstr ""
+msgstr "CALENTAMIENTO"
 
 #: qcsrc/client/hud/panel/vote.qc:27
 msgid "^1You must answer before entering hud configure mode"
 msgstr ""
+"^1Debes de responder antes de entrar al modo de configuración de la interfaz"
 
 #: qcsrc/client/hud/panel/vote.qc:30
 msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
@@ -1187,15 +1213,15 @@ msgstr "%d segundos restantes"
 
 #: qcsrc/client/mapvoting.qc:505
 msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
-msgstr ""
+msgstr "mv_mapdownload: ^3¡No deberias usar esta orden por tu cuenta!"
 
 #: qcsrc/client/mapvoting.qc:515
 msgid "^1Error:^7 Couldn't find pak index."
-msgstr ""
+msgstr "^1Error:^7 No se pudo encontrar el índice pak."
 
 #: qcsrc/client/mapvoting.qc:524
 msgid "Requesting preview..."
-msgstr ""
+msgstr "Solicitando vista previa..."
 
 #: qcsrc/client/miscfunctions.qc:111
 msgid "Trying to remove a team which is not in the teamlist!"
@@ -1215,11 +1241,12 @@ msgstr "Progreso de reanimación"
 
 #: qcsrc/common/command/generic.qc:156
 msgid "error creating curl handle"
-msgstr ""
+msgstr "error creando el manejador curl"
 
 #: qcsrc/common/command/generic.qc:412
 msgid "Notification restart command only works with cl_cmd and sv_cmd."
 msgstr ""
+"El comando de reinicio de notificaciones solo funciona con cl_cmd y sv_cmd."
 
 #: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
 msgid "Ball Stealer"
@@ -1227,31 +1254,31 @@ msgstr "Ladrón de Bola"
 
 #: qcsrc/common/items/item/ammo.qh:66
 msgid "bullets"
-msgstr ""
+msgstr "balas"
 
 #: qcsrc/common/items/item/ammo.qh:96
 msgid "cells"
-msgstr ""
+msgstr "células"
 
 #: qcsrc/common/items/item/ammo.qh:126
 msgid "plasma"
-msgstr ""
+msgstr "plasma"
 
 #: qcsrc/common/items/item/ammo.qh:156
 msgid "rockets"
-msgstr ""
+msgstr "cohetes"
 
 #: qcsrc/common/items/item/ammo.qh:190
 msgid "shells"
-msgstr ""
+msgstr "proyectiles"
 
 #: qcsrc/common/items/item/armor.qh:42
 msgid "Small armor"
-msgstr ""
+msgstr "Armadura pequeña"
 
 #: qcsrc/common/items/item/armor.qh:80
 msgid "Medium armor"
-msgstr ""
+msgstr "Armadura mediana"
 
 #: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
 msgid "Big armor"
@@ -1263,11 +1290,11 @@ msgstr "Mega armadura"
 
 #: qcsrc/common/items/item/health.qh:42
 msgid "Small health"
-msgstr ""
+msgstr "Poción pequeña"
 
 #: qcsrc/common/items/item/health.qh:80
 msgid "Medium health"
-msgstr ""
+msgstr "Poción mediana"
 
 #: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
 msgid "Big health"
@@ -1281,15 +1308,15 @@ msgstr "Mega poción"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:213
 msgid "Jetpack"
-msgstr ""
+msgstr "Jetpack"
 
 #: qcsrc/common/items/item/jetpack.qh:71
 msgid "fuel"
-msgstr ""
+msgstr "combustible"
 
 #: qcsrc/common/items/item/jetpack.qh:96
 msgid "Fuel regenerator"
-msgstr ""
+msgstr "Regenerador de combustible"
 
 #: qcsrc/common/items/item/jetpack.qh:99
 msgid "Fuel regen"
@@ -1493,11 +1520,11 @@ msgstr "Sobrevive contra las oleadas de monstruos "
 
 #: qcsrc/common/mapinfo.qh:589
 msgid "Duel"
-msgstr ""
+msgstr "Duelo"
 
 #: qcsrc/common/mapinfo.qh:589
 msgid "Fight in a one versus one arena battle to decide the winner"
-msgstr ""
+msgstr "Lucha en una pelea de arena uno contra uno para decidir el ganador"
 
 #: qcsrc/common/minigames/cl_minigames.qc:383
 msgid "It's your turn"
@@ -1535,11 +1562,11 @@ msgstr "Minijuegos"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:567
 msgid "Minigame message"
-msgstr ""
+msgstr "Mensaje de minijuego"
 
 #: qcsrc/common/minigames/minigame/bd.qc:2
 msgid "Bulldozer"
-msgstr ""
+msgstr "Excavadora"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1092
 #: qcsrc/common/minigames/minigame/ps.qc:421
@@ -1549,7 +1576,7 @@ msgstr "¡Fin del juego!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr ""
+msgstr "¡Bien hecho! Haz click en 'Próximo Nivel' para continuar"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
@@ -1590,7 +1617,7 @@ msgstr "Guardar"
 
 #: qcsrc/common/minigames/minigame/c4.qc:2
 msgid "Connect Four"
-msgstr ""
+msgstr "Conecta Cuatro"
 
 #: qcsrc/common/minigames/minigame/c4.qc:311
 #: qcsrc/common/minigames/minigame/c4.qc:317
@@ -1600,7 +1627,7 @@ msgstr ""
 #: qcsrc/common/minigames/minigame/pp.qc:368
 #, c-format
 msgid "%s^7 won the game!"
-msgstr ""
+msgstr "%s^7 ha ganado la partida!"
 
 #: qcsrc/common/minigames/minigame/c4.qc:373
 #: qcsrc/common/minigames/minigame/pp.qc:438
@@ -1638,7 +1665,7 @@ msgstr "Haz clic en el tablero para colocar tu pieza"
 
 #: qcsrc/common/minigames/minigame/nmm.qc:7
 msgid "Nine Men's Morris"
-msgstr ""
+msgstr "Juego del Molino"
 
 #: qcsrc/common/minigames/minigame/nmm.qc:615
 msgid ""
@@ -1659,7 +1686,7 @@ msgstr "Puedes coger una de las piezas del oponente"
 
 #: qcsrc/common/minigames/minigame/pong.qc:2
 msgid "Pong"
-msgstr ""
+msgstr "Pong"
 
 #: qcsrc/common/minigames/minigame/pong.qc:589
 #: qcsrc/common/minigames/minigame/ttt.qc:299
@@ -1685,12 +1712,12 @@ msgstr "Eliminar jugador IA"
 
 #: qcsrc/common/minigames/minigame/pp.qc:2
 msgid "Push-Pull"
-msgstr ""
+msgstr "Empujar-Halar"
 
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
 msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr ""
+msgstr "¡Selecciona \"^1Next Match^7\" en el menú para una revancha!"
 
 #: qcsrc/common/minigames/minigame/pp.qc:444
 #: qcsrc/common/minigames/minigame/pp.qc:450
@@ -1712,15 +1739,15 @@ msgstr "Siguiente Partida"
 
 #: qcsrc/common/minigames/minigame/ps.qc:2
 msgid "Peg Solitaire"
-msgstr ""
+msgstr "Uno Solo"
 
 #: qcsrc/common/minigames/minigame/ps.qc:414
 msgid "All pieces cleared!"
-msgstr ""
+msgstr "Todas las piezas despejadas!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:416
 msgid "Remaining pieces:"
-msgstr ""
+msgstr "Piezas restantes:"
 
 #: qcsrc/common/minigames/minigame/ps.qc:481
 #, c-format
@@ -1741,7 +1768,7 @@ msgstr "Salta una pieza sobre otra para capturarla"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:2
 msgid "Tic Tac Toe"
-msgstr ""
+msgstr "Tres en línea"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:665
 msgid "Single Player"
@@ -1892,7 +1919,7 @@ msgstr "Dibujar números de daño para el fuego amigo"
 
 #: qcsrc/common/mutators/mutator/instagib/items.qh:33
 msgid "Vaporizer ammo"
-msgstr ""
+msgstr "Munición de Vaporizador"
 
 #: qcsrc/common/mutators/mutator/instagib/items.qh:59
 #: qcsrc/common/mutators/mutator/instagib/items.qh:62
@@ -1934,7 +1961,7 @@ msgstr "Granada trampa"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:74
 msgid "Veil grenade"
-msgstr ""
+msgstr "Granada velo"
 
 #: qcsrc/common/mutators/mutator/nades/nades.qh:34
 msgid "Grenade"
@@ -1942,23 +1969,23 @@ msgstr "Granada"
 
 #: qcsrc/common/mutators/mutator/overkill/okhmg.qh:20
 msgid "Overkill Heavy Machine Gun"
-msgstr ""
+msgstr "Ametralladora Pesada Overkill"
 
 #: qcsrc/common/mutators/mutator/overkill/okmachinegun.qh:18
 msgid "Overkill MachineGun"
-msgstr ""
+msgstr "Ametralladora Overkill"
 
 #: qcsrc/common/mutators/mutator/overkill/oknex.qh:19
 msgid "Overkill Nex"
-msgstr ""
+msgstr "Nex Overkill"
 
 #: qcsrc/common/mutators/mutator/overkill/okrpc.qh:20
 msgid "Overkill Rocket Propelled Chainsaw"
-msgstr ""
+msgstr "Motosierra Overkill Propulsada por Cohetes"
 
 #: qcsrc/common/mutators/mutator/overkill/okshotgun.qh:18
 msgid "Overkill Shotgun"
-msgstr ""
+msgstr "Escopeta Overkill"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:3
 msgid "Waypoint"
@@ -3010,7 +3037,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:424
 #, c-format
 msgid "^BG%s^F3 was kicked for excessive teamkilling"
-msgstr ""
+msgstr "^BG%s^F3 ha sido echado por matar a sus propios compañeros"
 
 #: qcsrc/common/notifications/all.inc:425
 #, c-format
@@ -3187,12 +3214,12 @@ msgstr "^BG%s%s^K1 se comió el misil de ^BG%s^K1%s%s"
 #: qcsrc/common/notifications/all.inc:463
 #, c-format
 msgid "^BG%s%s^K1 got too close to ^BG%s^K1's rocket%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 se acercó demasiado al cohete de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:464
 #, c-format
 msgid "^BG%s^K1 blew themself up with their Devastator%s%s"
-msgstr "^BG%s^K1 se explotó a si mismo con su Devastator%s%s"
+msgstr "^BG%s^K1 se explotó a si mismo con su Devastatora%s%s"
 
 #: qcsrc/common/notifications/all.inc:465
 #, c-format
@@ -3336,23 +3363,27 @@ msgstr "^BG%s^K1 se exploto a si mismo con su propio Mortero%s%s"
 #, c-format
 msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
 msgstr ""
+"^BG%s%s^K1 fue baleado por la Ametralladora Pesada Overkill de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:492
 #, c-format
 msgid ""
 "^BG%s%s^K1 was torn to bits by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
 msgstr ""
+"^BG%s%s^K1 fue despedazado a trozos por la Ametralladora Pesada Overkill de "
+"^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:493
 #, c-format
 msgid ""
 "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Overkill Machine Gun%s%s"
 msgstr ""
+"^BG%s%s^K1 fue acribillado por la Ametralladora Overkill de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:494
 #, c-format
 msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Overkill Nex%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 ha sido vaporizado por el Nex Overkill de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:495
 #, c-format
@@ -3360,29 +3391,37 @@ msgid ""
 "^BG%s%s^K1 was sawn in half by ^BG%s^K1's Overkill Rocket Propelled Chainsaw"
 "%s%s"
 msgstr ""
+"^BG%s%s^K1 fue aserrado por la mirad por la Motosierra Overkill Propulsada "
+"por Cohetes de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:496
 #, c-format
 msgid ""
 "^BG%s%s^K1 almost dodged ^BG%s^K1's Overkill Rocket Propelled Chainsaw%s%s"
 msgstr ""
+"^BG%s%s^K1 casi esquivó la Motosierra Overkill Propulsada por Cohetes de ^BG"
+"%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:497
 #, c-format
 msgid ""
 "^BG%s^K1 was sawn in half by their own Overkill Rocket Propelled Chainsaw%s%s"
 msgstr ""
+"^BG%s^K1 fue aserrado por la mirad por su propia Motosierra Overkill "
+"Propulsada por Cohetes%s%s"
 
 #: qcsrc/common/notifications/all.inc:498
 #, c-format
 msgid ""
 "^BG%s^K1 blew themself up with their Overkill Rocket Propelled Chainsaw%s%s"
 msgstr ""
+"^BG%s^K1 se explotó a si mismo con su Motosierra Overkill Propulsada por "
+"Cohetes%s%s"
 
 #: qcsrc/common/notifications/all.inc:500
 #, c-format
 msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Overkill Shotgun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 fue baleado por la Escopeta Overkill de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:501
 #, c-format
@@ -4031,7 +4070,7 @@ msgstr "^BGHas conseguido el ^F1Regenerador de combustible"
 
 #: qcsrc/common/notifications/all.inc:699
 msgid "^BGYou got the ^F1Jetpack"
-msgstr ""
+msgstr "^BGHas obtenido el ^F1Jetpack"
 
 #: qcsrc/common/notifications/all.inc:707
 msgid ""
@@ -4364,7 +4403,7 @@ msgstr "^F2Intruso detectado, desactivando escudos!"
 
 #: qcsrc/common/notifications/all.qh:194
 msgid "Notification dump command only works with cl_cmd and sv_cmd."
-msgstr ""
+msgstr "El comando de despliegue solo funciona con cl_cmd y sv_cmd."
 
 #: qcsrc/common/notifications/all.qh:404 qcsrc/common/notifications/all.qh:405
 #, c-format
@@ -4590,7 +4629,7 @@ msgstr ", perdiendo su cadena de %d eliminaciones"
 #: qcsrc/common/notifications/all.qh:642
 #, c-format
 msgid " with %d %s"
-msgstr ""
+msgstr " con %d %s"
 
 #: qcsrc/common/teams.qh:31
 msgid "TEAM^Red"
@@ -4666,7 +4705,7 @@ msgstr "Rosa"
 
 #: qcsrc/common/turrets/all.qh:96
 msgid "Turrets dump command only works with sv_cmd."
-msgstr ""
+msgstr "La orden de tirar torretas solo funciona con sv_cmd."
 
 #: qcsrc/common/turrets/cl_turrets.qc:125
 #, c-format
@@ -4786,144 +4825,144 @@ msgstr "No Revelar"
 
 #: qcsrc/common/util.qc:1452
 msgid "<KEY NOT FOUND>"
-msgstr ""
+msgstr "<KEY NOT FOUND>"
 
 #: qcsrc/common/util.qc:1453
 msgid "<UNKNOWN KEYNUM>"
-msgstr ""
+msgstr "<UNKNOWN KEYNUM>"
 
 #: qcsrc/common/util.qc:1458
 msgid "TAB"
-msgstr ""
+msgstr "TAB"
 
 #: qcsrc/common/util.qc:1459 qcsrc/common/util.qc:1530
 #, c-format
 msgid "ENTER"
-msgstr ""
+msgstr "ENTRAR"
 
 #: qcsrc/common/util.qc:1460
 msgid "ESCAPE"
-msgstr ""
+msgstr "ESCAPE"
 
 #: qcsrc/common/util.qc:1461
 msgid "SPACE"
-msgstr ""
+msgstr "ESPACIO"
 
 #: qcsrc/common/util.qc:1463
 msgid "BACKSPACE"
-msgstr ""
+msgstr "RETROCESO"
 
 #: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1521
 #, c-format
 msgid "UPARROW"
-msgstr ""
+msgstr "FLECHAARRIBA"
 
 #: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1516
 #, c-format
 msgid "DOWNARROW"
-msgstr ""
+msgstr "FLECHAABAJO"
 
 #: qcsrc/common/util.qc:1466 qcsrc/common/util.qc:1518
 #, c-format
 msgid "LEFTARROW"
-msgstr ""
+msgstr "FLECHAIZQUIERDA"
 
 #: qcsrc/common/util.qc:1467 qcsrc/common/util.qc:1519
 #, c-format
 msgid "RIGHTARROW"
-msgstr ""
+msgstr "FLECHADERECHA"
 
 #: qcsrc/common/util.qc:1469
 msgid "ALT"
-msgstr ""
+msgstr "ALT"
 
 #: qcsrc/common/util.qc:1470
 msgid "CTRL"
-msgstr ""
+msgstr "CTRL"
 
 #: qcsrc/common/util.qc:1471
 msgid "SHIFT"
-msgstr ""
+msgstr "SHIFT"
 
 #: qcsrc/common/util.qc:1473 qcsrc/common/util.qc:1514
 #, c-format
 msgid "INS"
-msgstr ""
+msgstr "INS"
 
 #: qcsrc/common/util.qc:1474 qcsrc/common/util.qc:1524
 #, c-format
 msgid "DEL"
-msgstr ""
+msgstr "SUPR"
 
 #: qcsrc/common/util.qc:1475 qcsrc/common/util.qc:1517
 #, c-format
 msgid "PGDN"
-msgstr ""
+msgstr "AVPÁG"
 
 #: qcsrc/common/util.qc:1476 qcsrc/common/util.qc:1522
 #, c-format
 msgid "PGUP"
-msgstr ""
+msgstr "REPÁG"
 
 #: qcsrc/common/util.qc:1477 qcsrc/common/util.qc:1520
 #, c-format
 msgid "HOME"
-msgstr ""
+msgstr "INICIO"
 
 #: qcsrc/common/util.qc:1478 qcsrc/common/util.qc:1515
 #, c-format
 msgid "END"
-msgstr ""
+msgstr "FIN"
 
 #: qcsrc/common/util.qc:1480
 msgid "PAUSE"
-msgstr ""
+msgstr "PAUSA"
 
 #: qcsrc/common/util.qc:1482
 msgid "NUMLOCK"
-msgstr ""
+msgstr "BLOQNUM"
 
 #: qcsrc/common/util.qc:1483
 msgid "CAPSLOCK"
-msgstr ""
+msgstr "BLOQMAYÚS"
 
 #: qcsrc/common/util.qc:1484
 msgid "SCROLLOCK"
-msgstr ""
+msgstr "BLOQDES"
 
 #: qcsrc/common/util.qc:1486
 msgid "SEMICOLON"
-msgstr ""
+msgstr "PUNTOYCOMA"
 
 #: qcsrc/common/util.qc:1487
 msgid "TILDE"
-msgstr ""
+msgstr "TILDE"
 
 #: qcsrc/common/util.qc:1488
 msgid "BACKQUOTE"
-msgstr ""
+msgstr "ACENTOGRAVE"
 
 #: qcsrc/common/util.qc:1489
 msgid "QUOTE"
-msgstr ""
+msgstr "COMILLA"
 
 #: qcsrc/common/util.qc:1490
 msgid "APOSTROPHE"
-msgstr ""
+msgstr "APÓSTROFO"
 
 #: qcsrc/common/util.qc:1491
 msgid "BACKSLASH"
-msgstr ""
+msgstr "BARRAINVERSA"
 
 #: qcsrc/common/util.qc:1499
 #, c-format
 msgid "F%d"
-msgstr ""
+msgstr "F%d"
 
 #: qcsrc/common/util.qc:1509
 #, c-format
 msgid "KP_%d"
-msgstr ""
+msgstr "TN_%d"
 
 #: qcsrc/common/util.qc:1514 qcsrc/common/util.qc:1515
 #: qcsrc/common/util.qc:1516 qcsrc/common/util.qc:1517
@@ -4936,74 +4975,74 @@ msgstr ""
 #: qcsrc/common/util.qc:1530 qcsrc/common/util.qc:1531
 #, c-format
 msgid "KP_%s"
-msgstr ""
+msgstr "TN_%s"
 
 #: qcsrc/common/util.qc:1523
 #, c-format
 msgid "PERIOD"
-msgstr ""
+msgstr "PUNTO"
 
 #: qcsrc/common/util.qc:1525
 #, c-format
 msgid "DIVIDE"
-msgstr ""
+msgstr "DIVIDIR"
 
 #: qcsrc/common/util.qc:1526
 #, c-format
 msgid "SLASH"
-msgstr ""
+msgstr "BARRA"
 
 #: qcsrc/common/util.qc:1527
 #, c-format
 msgid "MULTIPLY"
-msgstr ""
+msgstr "MULTIPLICAR"
 
 #: qcsrc/common/util.qc:1528
 #, c-format
 msgid "MINUS"
-msgstr ""
+msgstr "MENOS"
 
 #: qcsrc/common/util.qc:1529
 #, c-format
 msgid "PLUS"
-msgstr ""
+msgstr "MÁS"
 
 #: qcsrc/common/util.qc:1531
 #, c-format
 msgid "EQUALS"
-msgstr ""
+msgstr "IGUAL"
 
 #: qcsrc/common/util.qc:1536
 msgid "PRINTSCREEN"
-msgstr ""
+msgstr "CAPTURADEPANTALLA"
 
 #: qcsrc/common/util.qc:1539
 #, c-format
 msgid "MOUSE%d"
-msgstr ""
+msgstr "RATÓN%d"
 
 #: qcsrc/common/util.qc:1541
 msgid "MWHEELUP"
-msgstr ""
+msgstr "RRUEDAARRIBA"
 
 #: qcsrc/common/util.qc:1542
 msgid "MWHEELDOWN"
-msgstr ""
+msgstr "RRUEDAABAJO"
 
 #: qcsrc/common/util.qc:1545
 #, c-format
 msgid "JOY%d"
-msgstr ""
+msgstr "JOY%d"
 
 #: qcsrc/common/util.qc:1548
 #, c-format
 msgid "AUX%d"
-msgstr ""
+msgstr "AUX%d"
 
 #: qcsrc/common/util.qc:1555
 #, c-format
 msgid "DPAD_UP"
-msgstr ""
+msgstr "CRUCETA_ARRIBA"
 
 #: qcsrc/common/util.qc:1555 qcsrc/common/util.qc:1556
 #: qcsrc/common/util.qc:1557 qcsrc/common/util.qc:1558
@@ -5017,133 +5056,133 @@ msgstr ""
 #: qcsrc/common/util.qc:1573 qcsrc/common/util.qc:1574
 #, c-format
 msgid "X360_%s"
-msgstr ""
+msgstr "X360_%s"
 
 #: qcsrc/common/util.qc:1556
 #, c-format
 msgid "DPAD_DOWN"
-msgstr ""
+msgstr "CRUCETA_ABAJO"
 
 #: qcsrc/common/util.qc:1557
 #, c-format
 msgid "DPAD_LEFT"
-msgstr ""
+msgstr "CRUCETA_IZQUIERDA"
 
 #: qcsrc/common/util.qc:1558
 #, c-format
 msgid "DPAD_RIGHT"
-msgstr ""
+msgstr "CRUCETA_DERECHA"
 
 #: qcsrc/common/util.qc:1559
 #, c-format
 msgid "START"
-msgstr ""
+msgstr "INICIO"
 
 #: qcsrc/common/util.qc:1560
 #, c-format
 msgid "BACK"
-msgstr ""
+msgstr "ATRÁS"
 
 #: qcsrc/common/util.qc:1561
 #, c-format
 msgid "LEFT_THUMB"
-msgstr ""
+msgstr "PULGAR_IZQUIERDO"
 
 #: qcsrc/common/util.qc:1562
 #, c-format
 msgid "RIGHT_THUMB"
-msgstr ""
+msgstr "PULGAR_DERECHO"
 
 #: qcsrc/common/util.qc:1563
 #, c-format
 msgid "LEFT_SHOULDER"
-msgstr ""
+msgstr "HOMBRO_IZQUIERDO"
 
 #: qcsrc/common/util.qc:1564
 #, c-format
 msgid "RIGHT_SHOULDER"
-msgstr ""
+msgstr "HOMBRO_DERECHO"
 
 #: qcsrc/common/util.qc:1565
 #, c-format
 msgid "LEFT_TRIGGER"
-msgstr ""
+msgstr "GATILLO_IZQUIERDO"
 
 #: qcsrc/common/util.qc:1566
 #, c-format
 msgid "RIGHT_TRIGGER"
-msgstr ""
+msgstr "GATILLO_DERECHO"
 
 #: qcsrc/common/util.qc:1567
 #, c-format
 msgid "LEFT_THUMB_UP"
-msgstr ""
+msgstr "PULGAR_IZQUIERDO_ARRIBA"
 
 #: qcsrc/common/util.qc:1568
 #, c-format
 msgid "LEFT_THUMB_DOWN"
-msgstr ""
+msgstr "PULGAR_IZQUIERDO_ABAJO"
 
 #: qcsrc/common/util.qc:1569
 #, c-format
 msgid "LEFT_THUMB_LEFT"
-msgstr ""
+msgstr "PULGAR_IZQUIERDO_IZQUIERDA"
 
 #: qcsrc/common/util.qc:1570
 #, c-format
 msgid "LEFT_THUMB_RIGHT"
-msgstr ""
+msgstr "PULGAR_IZQUIERDO_DERECHA"
 
 #: qcsrc/common/util.qc:1571
 #, c-format
 msgid "RIGHT_THUMB_UP"
-msgstr ""
+msgstr "PULGAR_DERECHO_ARRIBA"
 
 #: qcsrc/common/util.qc:1572
 #, c-format
 msgid "RIGHT_THUMB_DOWN"
-msgstr ""
+msgstr "PULGAR_DERECHO_ABAJO"
 
 #: qcsrc/common/util.qc:1573
 #, c-format
 msgid "RIGHT_THUMB_LEFT"
-msgstr ""
+msgstr "PULGAR_DERECHO_IZQUIERDA"
 
 #: qcsrc/common/util.qc:1574
 #, c-format
 msgid "RIGHT_THUMB_RIGHT"
-msgstr ""
+msgstr "PULGAR_DERECHO_DERECHA"
 
 #: qcsrc/common/util.qc:1584 qcsrc/common/util.qc:1585
 #: qcsrc/common/util.qc:1586 qcsrc/common/util.qc:1587
 #, c-format
 msgid "JOY_%s"
-msgstr ""
+msgstr "JOY_%s"
 
 #: qcsrc/common/util.qc:1584
 #, c-format
 msgid "UP"
-msgstr ""
+msgstr "ARRIBA"
 
 #: qcsrc/common/util.qc:1585
 #, c-format
 msgid "DOWN"
-msgstr ""
+msgstr "ABAJO"
 
 #: qcsrc/common/util.qc:1586
 #, c-format
 msgid "LEFT"
-msgstr ""
+msgstr "IZQUIERDA"
 
 #: qcsrc/common/util.qc:1587
 #, c-format
 msgid "RIGHT"
-msgstr ""
+msgstr "DERECHA"
 
 #: qcsrc/common/util.qc:1593
 #, c-format
 msgid "MIDINOTE%d"
-msgstr ""
+msgstr "NOTAMIDI%d"
 
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
 #, c-format
@@ -5192,7 +5231,7 @@ msgstr "Robot araña"
 
 #: qcsrc/common/weapons/all.qh:77
 msgid "Weapons dump command only works with sv_cmd."
-msgstr ""
+msgstr "Armas sueltas solo funcionan con el comando sv_cmd."
 
 #: qcsrc/common/weapons/weapon/arc.qh:18
 msgid "Arc"
@@ -5208,7 +5247,7 @@ msgstr "Crylink"
 
 #: qcsrc/common/weapons/weapon/devastator.qh:18
 msgid "Devastator"
-msgstr "Devastador"
+msgstr "Devastadora"
 
 #: qcsrc/common/weapons/weapon/electro.qh:18
 msgid "Electro"
@@ -5500,27 +5539,30 @@ msgstr "%02d:%02d:%02d"
 
 #: qcsrc/menu/command/menu_cmd.qc:48
 msgid "Usage: menu_cmd command..., where possible commands are:"
-msgstr ""
+msgstr "Uso: menu_cmd orden..., las posibles órdenes son:"
 
 #: qcsrc/menu/command/menu_cmd.qc:49
 msgid "  sync - reloads all cvars on the current menu page"
-msgstr ""
+msgstr "  sync - recarga todas las cvar en la página del menú actual"
 
 #: qcsrc/menu/command/menu_cmd.qc:50
 msgid "  directmenu ITEM - select a menu item as main item"
 msgstr ""
+"  directmenu ITEM - selecciona un objeto del menú como objeto principal"
 
 #: qcsrc/menu/command/menu_cmd.qc:51
 msgid "  dumptree - dump the state of the menu as a tree to the console"
-msgstr ""
+msgstr "dumptree - vertir el estado del menú en forma de árbol a la consola"
 
 #: qcsrc/menu/command/menu_cmd.qc:81
 msgid "Available options:"
-msgstr ""
+msgstr "Opciones disponibles:"
 
 #: qcsrc/menu/command/menu_cmd.qc:130
 msgid "Invalid command. For a list of supported commands, try menu_cmd help."
 msgstr ""
+"Orden no válida. Para obtener una lista de órdenes válidas, escribe menu_cmd "
+"help."
 
 #: qcsrc/menu/item/listbox.qc:413
 #, c-format
@@ -5981,11 +6023,11 @@ msgstr "Desactivar"
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
 msgid "Enable spectating"
-msgstr ""
+msgstr "Habilitar espectador"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:18
 msgid "Enable even playing in warmup"
-msgstr ""
+msgstr "Habilitar incluso jugando en el calentamiento"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:29
 msgid "Reduced"
@@ -6042,15 +6084,15 @@ msgstr "Panel de notificaciones"
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:16
 #: qcsrc/menu/xonotic/util.qc:766
 msgid "Enable"
-msgstr ""
+msgstr "Habilitar"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
 msgid "Enable even observing"
-msgstr ""
+msgstr "Habilitar incluso observando"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
 msgid "Enable only in Race/CTS"
-msgstr ""
+msgstr "Habilitar solo en Race/CTS"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
 msgid "Status bar"
@@ -6137,7 +6179,7 @@ msgstr "Panel de poderes"
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
 msgid "Always enable"
-msgstr ""
+msgstr "Siempre habilitar"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
 msgid "Forced aspect:"
@@ -6157,7 +6199,7 @@ msgstr "Panel del cronómetro de carrera"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
 msgid "Enable in team games"
-msgstr ""
+msgstr "Habilitar en juegos de equipo"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
 msgid "Radar:"
@@ -6691,7 +6733,8 @@ msgid ""
 "Delete to clear; Enter when done."
 msgstr ""
 "Haz click aqui o presiona Ctrl-F para proveer una palabra clave para reducir "
-"la lista de mapas. Ctrl-Delete para despejar; Enter cuando esté hecho"
+"la lista de mapas. Ctrl-Suprimir para despejar; Presione entrar cuando haya "
+"acabado."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
 msgid "Add shown"
@@ -6823,7 +6866,7 @@ msgstr "En el aire"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:81
 msgid "Melee only"
-msgstr ""
+msgstr "Solo cuerpo a cuerpo"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:229
@@ -6864,7 +6907,7 @@ msgstr "Contacto explosivo"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
 msgid "Wall jumping"
-msgstr ""
+msgstr "Saltar paredes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:105
 msgid "MUT^None"
@@ -6884,7 +6927,7 @@ msgstr "Todos los jugadores son casi invisibles"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:179
 msgid "Only possible to inflict damage on your enemy while they're airborne"
-msgstr ""
+msgstr "Solo es posible infligir daño a tus enemigos mientras estén en el aire"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:183
 msgid "Damage done to your enemy gets added to your own health"
@@ -6934,6 +6977,8 @@ msgid ""
 "Players will be given a set of weapons at spawn as well as unlimited ammo, "
 "without weapon pickups"
 msgstr ""
+"A los jugadores se les dará un conjunto de armas al aparecer como también "
+"munición ilimitada sin recoger armas"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:243
 msgid "Weapon arenas:"
@@ -6941,7 +6986,7 @@ msgstr "Armas de arena:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:246
 msgid "Custom weapons"
-msgstr ""
+msgstr "Armas customizadas"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:268
 msgid "Most weapons"
@@ -6962,11 +7007,10 @@ msgid ""
 "to find some or if he fails to do so, face death. The secondary fire mode "
 "does not inflict any damage but is good for doing trickjumps."
 msgstr ""
-"Los jugadores recibirán solo una arma, la cual puede eliminar "
-"instantáneamente al oponente con un solo disparo. Si el jugador se queda sin "
-"munición, tiene 10 segundos para encontrar algo de munición, pero si falla, "
-"morirá. El modo disparo secundario no inflige ningún daño pero es bueno para "
-"hacer saltos."
+"Los jugadores recibirán una arma, la cual puede eliminar instantáneamente al "
+"oponente con un solo disparo. Si el jugador se queda sin munición, tiene 10 "
+"segundos para encontrar munición, pero si no lo logra, morirá. El modo "
+"disparo secundario no inflige ningún daño pero es bueno para hacer saltos."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:284
 msgid ""
@@ -6980,7 +7024,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:288
 msgid "with blaster"
-msgstr "con el blaster"
+msgstr "Con el blaster"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:289
 msgid "Always carry the blaster as an additional weapon in Nix"
@@ -7045,7 +7089,7 @@ msgstr "Desconectar"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:86
 msgid "Disconnect from the server"
-msgstr ""
+msgstr "Desconectarse del servidor"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:88
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:264
@@ -7108,7 +7152,7 @@ msgstr "Necesario (se cifrará)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
 msgid "Use the `crypto_aeslevel` cvar to change your preferences"
-msgstr ""
+msgstr "Usa la cvar `crypto_aeslevel` para cambiar tus preferencias"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
 msgid "Hostname:"
@@ -7177,7 +7221,7 @@ msgstr "Reproductor de Música"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:48
 msgid "Auto record demos"
-msgstr "Grabar automáticamente demos"
+msgstr "Automáticamente grabar demos"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:57
 msgid "Timedemo"
@@ -7311,11 +7355,11 @@ msgstr "Estadísticas "
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:129
 msgid "Allow player statistics to track your client"
-msgstr "Permitir estadistica de jugadores rastrear a su cliente"
+msgstr "Permitir a la estadística de jugadores rastrear a su cliente"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:133
 msgid "Allow player statistics to use your nickname"
-msgstr "Permitir estadistica de jugadores usar su sobrenombre"
+msgstr "Permitir a la estadística de jugadores usar su sobrenombre"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:149
 msgid "Country"
@@ -7323,7 +7367,7 @@ msgstr "País"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:153
 msgid "Select language..."
-msgstr ""
+msgstr "Selecciona lenguaje..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:169
 msgid "Gender:"
@@ -7732,11 +7776,11 @@ msgstr "Informacion de depuracion sobre sonidos"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
 msgid "Are you sure you want to reset all key bindings?"
-msgstr ""
+msgstr "¿Está seguro que desea reiniciar todas las asignaciones de teclas?"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
 msgid "Reset key bindings"
-msgstr ""
+msgstr "Reiniciar la asignación de teclas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
 msgid "Quality preset:"
@@ -7776,7 +7820,7 @@ msgstr "Detalles geométricos:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
 msgid "Change the smoothness of the curves on the map"
-msgstr ""
+msgstr "Cambiar la suavidad de las curvas en el mapa"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:68
 msgid "DET^Lowest"
@@ -7873,6 +7917,8 @@ msgid ""
 "Disable textures completely for very slow hardware. This gives a huge "
 "performance boost, but looks very ugly."
 msgstr ""
+"Desactivar texturas completamente para hardware muy lento. Esto aumentara el "
+"rendimiento en gran medida, pero se verá muy feo."
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:135
 msgid "Use lightmaps"
@@ -7883,6 +7929,8 @@ msgid ""
 "Use high resolution lightmaps, which will look pretty but use up some extra "
 "video memory"
 msgstr ""
+"Use mapas de alta resolución, hara que se vea bien pero reducirá la memoria "
+"de vídeo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:138
 msgid "Deluxe mapping"
@@ -7890,7 +7938,7 @@ msgstr "Mapeado Deluxe"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:139
 msgid "Use per-pixel lighting effects"
-msgstr ""
+msgstr "Usar efectos de iluminado por píxel"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:141
 msgid "Gloss"
@@ -7898,7 +7946,7 @@ msgstr "Brillo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:142
 msgid "Enable the use of glossmaps on textures supporting it"
-msgstr ""
+msgstr "Activar el uso de glossmaps en texturas que lo soporten"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:145
 msgid "Offset mapping"
@@ -7909,6 +7957,8 @@ msgid ""
 "Offset mapping effect that will make textures with bumpmaps appear like they "
 "\"pop out\" of the flat 2D surface"
 msgstr ""
+"Efecto de mapeado del desplazamiento, que hará que las texturas con mapas de "
+"relieve parezcan resaltadas de la superficie plana 2D"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:148
 msgid "Relief mapping"
@@ -7918,6 +7968,8 @@ msgstr "Mapeado Relief"
 msgid ""
 "Higher quality offset mapping, which also has a huge impact on performance"
 msgstr ""
+"Alta calidad de mapeado de desplazamiento, el cual también tiene un gran "
+"impacto en el rendimiento"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:152
 msgid "Reflections:"
@@ -7928,10 +7980,12 @@ msgid ""
 "Reflection and refraction quality, has a huge impact on performance on maps "
 "with reflecting surfaces"
 msgstr ""
+"Calidad de refleccion y refracción, tiene un gran impacto en el rendimiento "
+"en mapas con superficies reflectantes"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:156
 msgid "Resolution of reflections/refractions"
-msgstr ""
+msgstr "Resolución de reflecciones/refracciones"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:157
 msgid "Blurred"
@@ -7951,7 +8005,7 @@ msgstr "Calcomanía"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:164
 msgid "Enable decals (bullet holes and blood)"
-msgstr ""
+msgstr "Activar decals (agujeros de balas y sangre)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:165
 msgid "Decals on models"
@@ -7964,7 +8018,7 @@ msgstr "Distancia:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:172
 msgid "Decals further away than this will not be drawn"
-msgstr ""
+msgstr "Los decals que se alejen de esta distancia no se dibujarán"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:176
 msgid "Time:"
@@ -7972,11 +8026,11 @@ msgstr "Tiempo:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:179
 msgid "Time in seconds before decals fade away"
-msgstr ""
+msgstr "Tiempo en segundos antes de que los decals desaparezcan"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:183
 msgid "Damage effects:"
-msgstr "Effectos de daño:"
+msgstr "Efectos de daño:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:185
 msgid "DMGFX^Disabled"
@@ -7996,7 +8050,7 @@ msgstr "Sin iluminación dinámica"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:192
 msgid "Enable corona flares around certain lights"
-msgstr ""
+msgstr "Habilitar iluminación en corona alrededor de ciertas luces"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:194
 msgid "Fake corona lighting"
@@ -8007,6 +8061,8 @@ msgid ""
 "Enable faster but uglier dynamic lights by rendering bright coronas instead "
 "of real dynamic lights"
 msgstr ""
+"Activar las rápidas pero feas luces dinámicas por renderizado de coronas en "
+"vez de iluminación dinámica real"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:198
 msgid "Realtime dynamic lighting"
@@ -8015,6 +8071,7 @@ msgstr "Iluminación dinámica en tiempo real"
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:199
 msgid "Enable rendering of dynamic lights such as explosions and rocket lights"
 msgstr ""
+"Activar renderizado de luces dinámicas como explosiones y luces de cohete"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:201
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:207
@@ -8023,7 +8080,7 @@ msgstr "Sombras"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
 msgid "Enable rendering of shadows from dynamic lights"
-msgstr ""
+msgstr "Activar renderizado de sombras de luces dinámicas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:205
 msgid "Realtime world lighting"
@@ -8034,10 +8091,12 @@ msgid ""
 "Enable rendering of full realtime world lighting on maps that support it. "
 "Note that this might have a big impact on performance."
 msgstr ""
+"Activar renderizado de la iluminación del mundo en tiempo real en mapas que "
+"lo soporten. Note que esto puede tener un gran impacto en el rendimiento."
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
 msgid "Enable rendering of shadows from realtime world lights"
-msgstr ""
+msgstr "Activar renderizado de sombras de luces del mundo en tiempo real"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:212
 msgid "Use normal maps"
@@ -8045,7 +8104,7 @@ msgstr "Usar mapa de normales"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:213
 msgid "Enable use of directional shading on textures"
-msgstr ""
+msgstr "Activar el uso de sombreado direccional en texturas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:215
 msgid "Soft shadows"
@@ -8057,7 +8116,7 @@ msgstr "Desvanecimiento de destellos dependiendo de la visibilidad"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
 msgid "Fade coronas according to visibility"
-msgstr ""
+msgstr "Desvanecimiento de destellos dependiendo de la visibilidad"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:224
 msgid "Bloom"
@@ -8068,6 +8127,8 @@ msgid ""
 "Enable bloom effect, which brightens the neighboring pixels of very bright "
 "pixels. Has a big impact on performance."
 msgstr ""
+"Activar efecto bloom, que ilumina los píxeles vecinos de píxeles muy "
+"brillantes. Tiene un gran impacto en el rendimiento."
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:226
 msgid "Extra postprocessing effects"
@@ -8078,6 +8139,8 @@ msgid ""
 "Enables special postprocessing effects for when damaged or under water or "
 "using a powerup"
 msgstr ""
+"Habilita efectos especiales de postprocesamiento cuando se recibe daño o se "
+"esta bajo el agua o se usa un poder"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:232
 msgid "Motion blur strength - 0.4 recommended"
@@ -8111,10 +8174,12 @@ msgid ""
 "Multiplier for amount of particles. Less means less particles, which in turn "
 "gives for better performance"
 msgstr ""
+"Multiplicador de cantidad de partículas. Menos significa menos partículas, "
+"lo cual dará mejor rendimiento"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:256
 msgid "Particles further away than this will not be drawn"
-msgstr ""
+msgstr "Las partículas que se alejen de esto no se dibujarán"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:31
 msgid "No crosshair"
@@ -8216,7 +8281,7 @@ msgstr "Velocidad de desvanecimiento:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
 msgid "Enable rows / columns highlighting"
-msgstr "Habilitar destacación de filas / columnas"
+msgstr "Habilitar resaltado de filas / columnas"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
 msgid "Show accuracy underneath scoreboard"
@@ -8224,13 +8289,16 @@ msgstr "Mostrar precisión debajo de la tabla de puntuación"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
 msgid "Show team sizes:"
-msgstr ""
+msgstr "Mostrar el tamaño de los equipos:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:56
 msgid ""
 "Team size position: Off=do not show; Left=on the left side of the scoreboard "
 "and move team scores to the right; Right=on the right of the scoreboard"
 msgstr ""
+"Posición del tamaño de equipo: Off=no mostrar; Left=en la parte izquierda "
+"del marcador y mueve la puntuación del equipo a la derecha; Right=en la "
+"parte derecha del marcador"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
 msgid "Waypoints"
@@ -8265,7 +8333,7 @@ msgstr "Desvanecer al estar cerca del puntero"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
 msgid "Display names instead of icons"
-msgstr ""
+msgstr "Mostrar nombres en vez de íconos"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
 msgid "Damage"
@@ -8594,7 +8662,7 @@ msgstr "Campo de visión:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:72
 msgid "Field of vision in degrees"
-msgstr ""
+msgstr "Campo de visión en grados"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:76
 msgid "ZOOM^Zoom factor:"
@@ -9092,7 +9160,7 @@ msgstr "Deshabilitar efectos de sangre y lenguage ofensivo"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:75
 msgid "Replace blood and gibs with content that does not have any gore effects"
-msgstr ""
+msgstr "Reemplazar sangre y tripas por cosas que no tengan nada de gore"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
 msgid "While connected language changes will be applied only to the menu,"
@@ -9189,6 +9257,8 @@ msgid ""
 "Enable vertical synchronization to prevent tearing, will cap your fps to the "
 "screen refresh rate"
 msgstr ""
+"Habilitar sincronización vertical para prevenir rasgaduras en la imagen, "
+"limitará los fps a la tasa de refresco del monitor"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:67
 msgid "Flip view horizontally"
@@ -9196,7 +9266,7 @@ msgstr "Invertir vista horizontalmente"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:68
 msgid "Poor man's left handed mode"
-msgstr ""
+msgstr "Invertir la imagen horizontalmente"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:71
 msgid "Anisotropy:"
@@ -9204,7 +9274,7 @@ msgstr "Filtro Anisotrópico:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:73
 msgid "Anisotropic filtering quality"
-msgstr ""
+msgstr "Calidad de filtrado anisotrópico"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:74
 msgid "ANISO^Disabled"
@@ -9237,6 +9307,8 @@ msgid ""
 "Enable antialiasing, which smooths the edges of 3D geometry. Note that it "
 "might decrease performance by quite a lot"
 msgstr ""
+"Activar antialiasing, el cual suaviza los bordes de la geometría 3D. Note "
+"que esto puede disminuir bastante el rendimiento"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:85
 msgid "AA^Disabled"
@@ -9255,6 +9327,8 @@ msgid ""
 "Eliminate overdraw by rendering a depth-only version of the scene before the "
 "normal rendering starts"
 msgstr ""
+"Eliminar sobre-dibujado renderizando una versión de profundidad de la escena "
+"antes de que comience la renderización normal"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:100
 msgid "DF^Disabled"
@@ -9287,6 +9361,8 @@ msgid ""
 "Make use of Vertex Buffer Objects to store static geometry in video memory "
 "for faster rendering"
 msgstr ""
+"Haz uso de objetos de búfer de vertices para almacenar geometría estática en "
+"la memoria de video para acelerar el renderizado"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:113
 msgid "Vertices"
@@ -9302,7 +9378,7 @@ msgstr "Brillo:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:121
 msgid "Brightness of black"
-msgstr ""
+msgstr "Brillo en negros"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:123
 msgid "Contrast:"
@@ -9310,7 +9386,7 @@ msgstr "Contraste:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:125
 msgid "Brightness of white"
-msgstr ""
+msgstr "Brillo en blancos"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:127
 msgid "Gamma:"
@@ -9321,6 +9397,8 @@ msgid ""
 "Inverse gamma correction value, a brightness effect that does not affect "
 "white or black"
 msgstr ""
+"Valor de corrección de gama inverso, un efecto de brillo que no afecta a "
+"blancos o negros"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:133
 msgid "Contrast boost:"
@@ -9328,7 +9406,7 @@ msgstr "Resaltador de contraste"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:136
 msgid "By how much to multiply the contrast in dark areas"
-msgstr ""
+msgstr "Por cuanto multiplicar el contraste en areas oscuras"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:139
 msgid "Saturation:"
@@ -9339,6 +9417,8 @@ msgid ""
 "Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
 "requires GLSL color control"
 msgstr ""
+"Ajuste de saturación (0 = escala de grises, 1 = normal, 2 = sobresaturado), "
+"requiere el control de color GLSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:146
 msgid "LIT^Ambient:"
@@ -9349,6 +9429,8 @@ msgid ""
 "Ambient lighting, if set too high it tends to make light on maps look dull "
 "and flat"
 msgstr ""
+"Iluminación del ambiente, si se configura demasiado alto, tiende a hacer que "
+"la luz en los mapas se vea aburrida y plana"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:150
 msgid "Intensity:"
@@ -9356,7 +9438,7 @@ msgstr "Intensidad:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:152
 msgid "Global rendering brightness"
-msgstr ""
+msgstr "Brillo del renderizador global"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:155
 msgid "Wait for GPU to finish each frame"
@@ -9367,6 +9449,8 @@ msgid ""
 "Make the CPU wait for the GPU to finish each frame, can help with some "
 "strange input or video lag on some machines"
 msgstr ""
+"Hacer que la CPU espere a que la gpu termine cada marco, puede ayudar con "
+"algunas entradas extrañas o con el retraso de vídeo en algunas máquinas"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:158
 msgid "Use OpenGL 2.0 shaders (GLSL)"
@@ -9381,6 +9465,8 @@ msgid ""
 "Enable use of GLSL to apply gamma correction, note that it might decrease "
 "performance by a lot"
 msgstr ""
+"Habilita el uso de GLSL para aplicar en la corrección gama, note que esto "
+"podría disminuir mucho el rendimiento"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:168
 msgid "Psycho coloring (easter egg)"
@@ -9514,7 +9600,7 @@ msgstr "gancho"
 
 #: qcsrc/menu/xonotic/keybinder.qc:43
 msgid "jetpack"
-msgstr ""
+msgstr "jetpack"
 
 #: qcsrc/menu/xonotic/keybinder.qc:46
 msgid "Attacking"
@@ -9622,7 +9708,7 @@ msgstr "soltar llave / soltar bandera"
 
 #: qcsrc/menu/xonotic/keybinder.qc:122
 msgid "respawn"
-msgstr ""
+msgstr "reaparecer"
 
 #: qcsrc/menu/xonotic/keybinder.qc:123
 msgid "quick menu"
@@ -9648,6 +9734,8 @@ msgstr "¡No vuelva a presionar este boton!"
 msgid ""
 "Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
 msgstr ""
+"Huh? no puedes jugarlo (m es nulo). Reflitrando para que esto no vuelva a "
+"ocurrir."
 
 #: qcsrc/menu/xonotic/maplist.qc:296
 #, c-format
@@ -9659,6 +9747,8 @@ msgid ""
 "Huh? Can't play this (invalid game type). Refiltering so this won't happen "
 "again."
 msgstr ""
+"Huh? No puedes jugarlo (tipo de juego inválido). Reflitrado para que esto no "
+"vuelva a ocurrir."
 
 #: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
 msgid "spectator"
@@ -9823,6 +9913,9 @@ msgid ""
 "Change the sharpness of the textures. Lowering it will effectively reduce "
 "texture memory usage, but make the textures appear very blurry."
 msgstr ""
+"Cambiar la dureza de las texturas. Bajándolo efectivamente reducirá el uso "
+"de la memoria de la textura, pero hará que las texturas aparezcan muy "
+"borrosas."
 
 #: qcsrc/menu/xonotic/slider_resolution.qc:115
 msgid "Screen resolution"
@@ -9894,53 +9987,53 @@ msgstr "Unido:"
 
 #: qcsrc/menu/xonotic/statslist.qc:103
 msgid "Last match:"
-msgstr ""
+msgstr "Última partida:"
 
 #: qcsrc/menu/xonotic/statslist.qc:110
 msgid "Time played:"
-msgstr ""
+msgstr "Tiempo jugado:"
 
 #: qcsrc/menu/xonotic/statslist.qc:117 qcsrc/menu/xonotic/statslist.qc:230
 msgid "Favorite map:"
-msgstr ""
+msgstr "Mapa favorito:"
 
 #: qcsrc/menu/xonotic/statslist.qc:149 qcsrc/menu/xonotic/statslist.qc:201
 #: qcsrc/menu/xonotic/statslist.qc:244
 #, c-format
 msgid "Matches:"
-msgstr ""
+msgstr "Partidas:"
 
 #: qcsrc/menu/xonotic/statslist.qc:154
 #, c-format
 msgid "Wins/Losses:"
-msgstr ""
+msgstr "Victorias/Derrotas:"
 
 #: qcsrc/menu/xonotic/statslist.qc:155
 #, c-format
 msgid "Win percentage:"
-msgstr ""
+msgstr "Porcentaje de victorias:"
 
 #: qcsrc/menu/xonotic/statslist.qc:166
 #, c-format
 msgid "Kills/Deaths:"
-msgstr ""
+msgstr "Asesinatos/Muertes:"
 
 #: qcsrc/menu/xonotic/statslist.qc:172
 #, c-format
 msgid "Kill ratio:"
-msgstr ""
+msgstr "Razón de asesinatos:"
 
 #: qcsrc/menu/xonotic/statslist.qc:207
 msgid "ELO:"
-msgstr ""
+msgstr "ELO:"
 
 #: qcsrc/menu/xonotic/statslist.qc:214
 msgid "Rank:"
-msgstr ""
+msgstr "Rango:"
 
 #: qcsrc/menu/xonotic/statslist.qc:221
 msgid "Percentile:"
-msgstr ""
+msgstr "Porcentaje:"
 
 #: qcsrc/menu/xonotic/statslist.qc:246
 #, c-format
@@ -9949,7 +10042,7 @@ msgstr "%d (sin clasificar)"
 
 #: qcsrc/menu/xonotic/util.qc:417
 msgid "Update can be downloaded at:"
-msgstr ""
+msgstr "Actualización puede ser descargada en:"
 
 #: qcsrc/menu/xonotic/util.qc:525
 msgid "Autogenerating mapinfo for newly added maps..."
@@ -9970,6 +10063,8 @@ msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems."
 msgstr ""
+"^1ERROR: Se requiere la compresion de texturas, pero no es soportada.\n"
+"^1Pueden ocurrir posibles problemas visuales."
 
 #: qcsrc/menu/xonotic/util.qc:788
 msgid "Use default"
index 87938b49f11eab892ddd6be90d9e8f450ca900d7..065db416ce5e8107fa5bd02ad91982deb1ec90d2 100644 (file)
@@ -18,7 +18,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-20 09:04+0000\n"
+"PO-Revision-Date: 2019-07-14 15:44+0000\n"
 "Last-Translator: Yannick Le Guen <leguen.yannick@gmail.com>\n"
 "Language-Team: French (http://www.transifex.com/team-xonotic/xonotic/"
 "language/fr/)\n"
@@ -31,7 +31,7 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:243
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr "^2Exporté avec succès vers %s ! (note : enregistré dans data/data/)"
+msgstr "^2Exporté avec succès vers %s ! (note : enregistré dans data/data/)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
@@ -41,7 +41,7 @@ msgstr "^1Impossible d'écrire dans %s"
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr "^3Message de compte à rebours au temps %s, secondes restantes : ^COUNT"
+msgstr "^3Message de compte à rebours au temps %s, secondes restantes : ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -63,12 +63,12 @@ msgstr "Message générique"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
-msgstr "^3Joueur^7 : Ceci est la zone de tchat."
+msgstr "^3Joueur^7 : Ceci est la zone de tchat."
 
 #: qcsrc/client/hud/panel/engineinfo.qc:72
 #, c-format
 msgid "FPS: %.*f"
-msgstr "IPS : %.*f"
+msgstr "IPS : %.*f"
 
 #: qcsrc/client/hud/panel/infomessages.qc:89
 msgid "^1Observing"
@@ -77,7 +77,7 @@ msgstr "^1En observateur"
 #: qcsrc/client/hud/panel/infomessages.qc:91
 #, c-format
 msgid "^1Spectating: ^7%s"
-msgstr "^1En spectateur sur : ^7%s"
+msgstr "^1En spectateur sur : ^7%s"
 
 #: qcsrc/client/hud/panel/infomessages.qc:102
 #, c-format
@@ -163,7 +163,7 @@ msgstr "^1La partie démarre dans ^3%d^1 secondes"
 
 #: qcsrc/client/hud/panel/infomessages.qc:147
 msgid "^2Currently in ^1warmup^2 stage!"
-msgstr "^2Actuellement en mode ^1échauffement^2 !"
+msgstr "^2Actuellement en mode ^1échauffement^2 !"
 
 #: qcsrc/client/hud/panel/infomessages.qc:162
 #, c-format
@@ -197,7 +197,7 @@ msgstr "^2Appuyez sur ^3%s^2 pour terminer l'échauffement"
 
 #: qcsrc/client/hud/panel/infomessages.qc:198
 msgid "Teamnumbers are unbalanced!"
-msgstr "Les équipes ne sont pas équilibrées !"
+msgstr "Les équipes ne sont pas équilibrées !"
 
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #, c-format
@@ -211,11 +211,11 @@ msgstr "sélection d'équipe"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating this player:"
-msgstr "^1En spectateur sur ce joueur :"
+msgstr "^1En spectateur sur ce joueur :"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating you:"
-msgstr "^1Vous regarde(nt) :"
+msgstr "^1Vous regarde(nt) :"
 
 #: qcsrc/client/hud/panel/infomessages.qc:227
 msgid "^7Press ^3ESC ^7to show HUD options."
@@ -261,7 +261,7 @@ msgstr "Commande%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:624
 msgid "Continue..."
-msgstr "Continuer..."
+msgstr "Continuer"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
@@ -558,7 +558,7 @@ msgstr "Intermédiaire %d"
 #: qcsrc/client/hud/panel/racetimer.qc:262
 #, c-format
 msgid "PENALTY: %.1f (%s)"
-msgstr "PÉNALITÉ : %.1f (%s)"
+msgstr "PÉNALITÉ : %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
@@ -913,11 +913,11 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:313
 msgid "Usage:"
-msgstr "Utilisation :"
+msgstr "Utilisation :"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:315
 msgid "^2scoreboard_columns_set ^3field1 field2 ..."
-msgstr "^2scoreboard_columns_set ^3champ1 champ2..."
+msgstr "^2scoreboard_columns_set ^3champ1 champ2"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:316
 msgid ""
@@ -932,7 +932,7 @@ msgid ""
 "  ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
 "map start"
 msgstr ""
-"  ^5Remarque : ^7scoreboard_columns_set sans argument est exécuté pour "
+"  ^5Remarque : ^7scoreboard_columns_set sans argument est exécuté pour "
 "chaque nouvelle carte"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:318
@@ -949,7 +949,7 @@ msgstr "Vous pouvez utiliser un ^3|^7 pour créer des champs alignés à droite.
 
 #: qcsrc/client/hud/panel/scoreboard.qc:320
 msgid "The following field names are recognized (case insensitive):"
-msgstr "Les noms de champ suivants sont reconnus (non sensibles à la casse) :"
+msgstr "Les noms de champ suivants sont reconnus (non sensibles à la casse) :"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:326
 msgid ""
@@ -962,7 +962,7 @@ msgstr ""
 "de jeux\n"
 "séparés par des virgules, puis un slash pour faire apparaître le champ dans "
 "ces modes uniquement\n"
-"ou dans tous les modes sauf ceux-ci. Vous pouvez aussi spécifier « all » "
+"ou dans tous les modes sauf ceux-ci. Vous pouvez aussi spécifier « all » "
 "comme champ\n"
 "pour afficher tous les champs disponibles pour le mode de jeu actuel."
 
@@ -971,13 +971,13 @@ msgid ""
 "The special game type names 'teams' and 'noteams' can be used to\n"
 "include/exclude ALL teams/noteams game modes."
 msgstr ""
-"Les types de jeu spéciaux « teams » et « noteams » peuvent être utilisés "
+"Les types de jeu spéciaux « teams » et « noteams » peuvent être utilisés "
 "pour\n"
 "inclure ou exclure TOUS les modes de jeu en équipe ou non."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:336
 msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
-msgstr "Exemple : scoreboard_columns_set name ping pl | +ctf/champ3 -dm/champ4"
+msgstr "Exemple : scoreboard_columns_set name ping pl | +ctf/champ3 -dm/champ4"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:337
 msgid ""
@@ -992,7 +992,7 @@ msgid ""
 "'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
 "other gamemodes except DM."
 msgstr ""
-"« champ3 » sera affiché uniquement en CTF, et « champ4 » sera affiché\n"
+"« champ3 » sera affiché uniquement en CTF, et « champ4 » sera affiché\n"
 "dans tous les autres modes de jeu sauf DM."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:603
@@ -1014,15 +1014,15 @@ msgstr "Stats de précision (moyenne %d%%)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1336
 msgid "Map stats:"
-msgstr "Stat. de la carte :"
+msgstr "Stat. de la carte :"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1366
 msgid "Monsters killed:"
-msgstr "Monstres tués :"
+msgstr "Monstres tués :"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1373
 msgid "Secrets found:"
-msgstr "Secrets trouvés :"
+msgstr "Secrets trouvés :"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1395
 msgid "Capture time rankings"
@@ -1066,17 +1066,17 @@ msgstr "^2+%s %s"
 #: qcsrc/client/hud/panel/scoreboard.qc:1659
 #, c-format
 msgid "^7Map: ^2%s"
-msgstr "^7Carte : ^2%s"
+msgstr "^7Carte : ^2%s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1798
 #, c-format
 msgid "Speed award: %d%s ^7(%s^7)"
-msgstr "Récompense de vitesse : %d%s ^7(%s^7)"
+msgstr "Récompense de vitesse : %d%s ^7(%s^7)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1802
 #, c-format
 msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr "Le plus rapide jamais vu : %d%s ^7(%s^7)"
+msgstr "Le plus rapide jamais vu : %d%s ^7(%s^7)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1818
 #, c-format
@@ -1108,16 +1108,15 @@ msgstr "^1Vous devez répondre avant d'entrer dans la configuration de l'ATH"
 
 #: qcsrc/client/hud/panel/vote.qc:30
 msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
-msgstr ""
-"^2Pseudonyme ^7à la place de « ^1Anonymous player^7 » dans les statistiques"
+msgstr "^2Pseudonyme ^7à la place de « ^1Anonymous player^7 » dans les stats"
 
 #: qcsrc/client/hud/panel/vote.qc:116
 msgid "A vote has been called for:"
-msgstr "Un vote a été lancé pour :"
+msgstr "Un vote a été lancé pour :"
 
 #: qcsrc/client/hud/panel/vote.qc:118
 msgid "Allow servers to store and display your name?"
-msgstr "Autoriser les serveurs à enregistrer et afficher votre pseudonyme ?"
+msgstr "Autoriser les serveurs à enregistrer et afficher votre pseudonyme ?"
 
 #: qcsrc/client/hud/panel/vote.qc:122
 msgid "^1Configure the HUD"
@@ -1211,19 +1210,19 @@ msgstr "%d secondes restantes"
 #: qcsrc/client/mapvoting.qc:505
 msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
 msgstr ""
-"mv_mapdownload : ^3Vous n'êtes pas censé utiliser cette commande vous-même !"
+"mv_mapdownload : ^3Vous n'êtes pas censé utiliser cette commande vous-même !"
 
 #: qcsrc/client/mapvoting.qc:515
 msgid "^1Error:^7 Couldn't find pak index."
-msgstr "^1Erreur :^7 Impossible de trouver l'index du pak."
+msgstr "^1Erreur :^7 Impossible de trouver l'index du pak."
 
 #: qcsrc/client/mapvoting.qc:524
 msgid "Requesting preview..."
-msgstr "Demande d'aperçu..."
+msgstr "Demande d'aperçu"
 
 #: qcsrc/client/miscfunctions.qc:111
 msgid "Trying to remove a team which is not in the teamlist!"
-msgstr "Vous essayez de supprimer une équipe qui n'est pas dans la liste !"
+msgstr "Vous essayez de supprimer une équipe qui n'est pas dans la liste !"
 
 #: qcsrc/client/view.qc:1518
 msgid "Nade timer"
@@ -1338,7 +1337,7 @@ msgstr "Lancer du @!#% Tuba"
 #: qcsrc/common/mapinfo.qh:528
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:105
 msgid "Frag limit:"
-msgstr "Limite de frags :"
+msgstr "Limite de frags :"
 
 #: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:333
 #: qcsrc/common/mapinfo.qh:528
@@ -1363,7 +1362,7 @@ msgstr "Survivez et tuez jusqu'à ce que les ennemis n'aient plus de vies"
 
 #: qcsrc/common/mapinfo.qh:136
 msgid "Lives:"
-msgstr "Vies :"
+msgstr "Vies :"
 
 #: qcsrc/common/mapinfo.qh:148
 msgid "Race"
@@ -1375,7 +1374,7 @@ msgstr "Courez contre d'autres joueurs vers la ligne d'arrivée"
 
 #: qcsrc/common/mapinfo.qh:175
 msgid "Laps:"
-msgstr "Nombre de tours :"
+msgstr "Nombre de tours :"
 
 #: qcsrc/common/mapinfo.qh:188
 msgid "Race CTS"
@@ -1390,7 +1389,7 @@ msgstr "Courez pour réaliser le meilleur temps."
 #: qcsrc/common/mapinfo.qh:441 qcsrc/common/mapinfo.qh:461
 #: qcsrc/common/mapinfo.qh:581
 msgid "Point limit:"
-msgstr "Score limite :"
+msgstr "Score limite :"
 
 #: qcsrc/common/mapinfo.qh:218
 msgid "Help your team score the most frags against the enemy team"
@@ -1419,7 +1418,7 @@ msgstr ""
 
 #: qcsrc/common/mapinfo.qh:288
 msgid "Capture limit:"
-msgstr "Limite de captures :"
+msgstr "Limite de captures :"
 
 #: qcsrc/common/mapinfo.qh:288
 msgid "The amount of captures needed before the match will end"
@@ -1431,7 +1430,7 @@ msgstr "Clan Arena"
 
 #: qcsrc/common/mapinfo.qh:305
 msgid "Kill all enemy teammates to win the round"
-msgstr "Tuez tous les ennemis des autres équipes pour gagner la manche"
+msgstr "Tuez tous les équipiers ennemis pour gagner la manche"
 
 #: qcsrc/common/mapinfo.qh:349
 msgid "Capture and defend all the control points to win"
@@ -1481,7 +1480,7 @@ msgstr "Frappez et tirez la balle dans le but ennemi, protégez votre but"
 
 #: qcsrc/common/mapinfo.qh:487
 msgid "Goals:"
-msgstr "Nombre de buts :"
+msgstr "Nombre de buts :"
 
 #: qcsrc/common/mapinfo.qh:487
 msgid "The amount of goals needed before the match will end"
@@ -1497,7 +1496,7 @@ msgid ""
 "freeze all enemies to win"
 msgstr ""
 "Tuez les ennemis pour les geler, tenez-vous à côté des équipiers gelés pour "
-"les dégeler ; gelez tous les ennemis pour gagner"
+"les dégeler ; gelez tous les ennemis pour gagner"
 
 #: qcsrc/common/mapinfo.qh:544
 msgid "Hold the ball to get points for kills"
@@ -1569,23 +1568,23 @@ msgstr "Bulldozer"
 #: qcsrc/common/minigames/minigame/ps.qc:421
 #: qcsrc/common/minigames/minigame/ps.qc:427
 msgid "Game over!"
-msgstr "Partie perdue !"
+msgstr "Partie perdue !"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr "Bien joué ! Cliquez sur « Niveau suivant » pour continuer !"
+msgstr "Bien joué ! Cliquez sur « Niveau suivant » pour continuer"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
-msgstr "Plus de chance la prochaine fois !"
+msgstr "Plus de chance la prochaine fois !"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1167
 msgid "Tubular! Press \"Next Level\" to continue!"
-msgstr "Tubulaire ! Appuyez sur « Niveau suivant » pour continuer !"
+msgstr "Tubulaire ! Appuyez sur « Niveau suivant » pour continuer !"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1169
 msgid "Wicked! Press \"Next Level\" to continue!"
-msgstr "Malicieux ! Appuyez sur « Niveau suivant » pour continuer !"
+msgstr "Malicieux ! Appuyez sur « Niveau suivant » pour continuer !"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1173
 msgid "Press the space bar to change your currently selected tile"
@@ -1624,7 +1623,7 @@ msgstr "Puissance Quatre"
 #: qcsrc/common/minigames/minigame/pp.qc:368
 #, c-format
 msgid "%s^7 won the game!"
-msgstr "%s^7 a gagné la partie !"
+msgstr "%s^7 a gagné la partie !"
 
 #: qcsrc/common/minigames/minigame/c4.qc:373
 #: qcsrc/common/minigames/minigame/pp.qc:438
@@ -1637,14 +1636,14 @@ msgstr "Partie nulle"
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
 msgid "You lost the game!"
-msgstr "Vous avez perdu la partie !"
+msgstr "Vous avez perdu la partie !"
 
 #: qcsrc/common/minigames/minigame/c4.qc:379
 #: qcsrc/common/minigames/minigame/nmm.qc:607
 #: qcsrc/common/minigames/minigame/pp.qc:444
 #: qcsrc/common/minigames/minigame/ttt.qc:325
 msgid "You win!"
-msgstr "Vous avez gagné !"
+msgstr "Vous avez gagné !"
 
 #: qcsrc/common/minigames/minigame/c4.qc:383
 #: qcsrc/common/minigames/minigame/nmm.qc:611
@@ -1715,7 +1714,7 @@ msgstr "Pousser-Tirer"
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
 msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr "Sélectionnez « ^1Partie suivante^7 » dans le menu pour une revanche !"
+msgstr "Sélectionnez « ^1Partie suivante^7 » dans le menu pour une revanche !"
 
 #: qcsrc/common/minigames/minigame/pp.qc:444
 #: qcsrc/common/minigames/minigame/pp.qc:450
@@ -1723,8 +1722,8 @@ msgstr "Sélectionnez « ^1Partie suivante^7 » dans le menu pour une revanche !
 #: qcsrc/common/minigames/minigame/ttt.qc:331
 msgid "Select \"^1Next Match^7\" on the menu to start a new match!"
 msgstr ""
-"Sélectionnez « ^1Partie suivante^7 » dans le menu pour commencer un nouveau "
-"match !"
+"Sélectionnez « ^1Partie suivante^7 » dans le menu pour commencer un nouveau "
+"match !"
 
 #: qcsrc/common/minigames/minigame/pp.qc:451
 #: qcsrc/common/minigames/minigame/ttt.qc:332
@@ -1742,16 +1741,16 @@ msgstr "Solitaire"
 
 #: qcsrc/common/minigames/minigame/ps.qc:414
 msgid "All pieces cleared!"
-msgstr "Toutes les pièces sont nettoyées !"
+msgstr "Toutes les pièces sont nettoyées !"
 
 #: qcsrc/common/minigames/minigame/ps.qc:416
 msgid "Remaining pieces:"
-msgstr "Pièces restantes :"
+msgstr "Pièces restantes :"
 
 #: qcsrc/common/minigames/minigame/ps.qc:481
 #, c-format
 msgid "Pieces left: %s"
-msgstr "Pièces restantes : %s"
+msgstr "Pièces restantes : %s"
 
 #: qcsrc/common/minigames/minigame/ps.qc:491
 msgid "No more valid moves"
@@ -1759,7 +1758,7 @@ msgstr "Plus aucun déplacement valide"
 
 #: qcsrc/common/minigames/minigame/ps.qc:494
 msgid "Well done, you win!"
-msgstr "Bien joué, vous avez gagné !"
+msgstr "Bien joué, vous avez gagné !"
 
 #: qcsrc/common/minigames/minigame/ps.qc:497
 msgid "Jump a piece over another to capture it"
@@ -1888,19 +1887,19 @@ msgstr "Afficher les nombres de dommages"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
 msgid "Font size minimum:"
-msgstr "Taille de police minimale :"
+msgstr "Taille de police minimale :"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
 msgid "Font size maximum:"
-msgstr "Taille de police maximale :"
+msgstr "Taille de police maximale :"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
 msgid "Accumulate range:"
-msgstr "Intervalle d'accumulation :"
+msgstr "Intervalle d'accumulation :"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:38
 msgid "Lifetime:"
-msgstr "Durée de vie :"
+msgstr "Durée de vie :"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:43
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:53
@@ -1910,7 +1909,7 @@ msgstr "Durée de vie :"
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:109
 #: qcsrc/menu/xonotic/util.qc:783
 msgid "Color:"
-msgstr "Couleur :"
+msgstr "Couleur :"
 
 #: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:50
 msgid "Draw damage numbers for friendly fire"
@@ -1992,7 +1991,7 @@ msgstr "Point de rassemblement"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:4
 msgid "Help me!"
-msgstr "À l'aide !"
+msgstr "À l'aide !"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:5
 msgid "Here"
@@ -2004,7 +2003,7 @@ msgstr "DANGER"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:8
 msgid "Frozen!"
-msgstr "Gelé !"
+msgstr "Gelé !"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:10
 msgid "Item"
@@ -2132,7 +2131,7 @@ msgstr "Véhicule"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:62
 msgid "Intruder!"
-msgstr "Intrus !"
+msgstr "Intrus !"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:64
 msgid "Tagged"
@@ -2141,16 +2140,16 @@ msgstr "Verrouillé pour cible"
 #: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:695
 #, c-format
 msgid "%s needing help!"
-msgstr "%s a besoin d'aide !"
+msgstr "%s a besoin d'aide !"
 
 #: qcsrc/common/net_notice.qc:90
 msgid "^1Server notices:"
-msgstr "^1Notifications du serveur :"
+msgstr "^1Notifications du serveur :"
 
 #: qcsrc/common/notifications/all.inc:239
 msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
 msgstr ""
-"^F4NOTE : ^BGles joueurs ne voient pas le tchat spectateur pendant le match"
+"^F4NOTE : ^BGles joueurs ne voient pas le tchat spectateur pendant le match"
 
 #: qcsrc/common/notifications/all.inc:241
 #, c-format
@@ -2279,7 +2278,7 @@ msgstr "^BG%s^BG a retourné le drapeau ^TC^TT^BG"
 #: qcsrc/common/notifications/all.inc:557
 #, c-format
 msgid "^F2Throwing coin... Result: %s^F2!"
-msgstr "^F2Lancer de pièce… Résultat : %s^F2 !"
+msgstr "^F2Lancer de pièce… Résultat : %s^F2 !"
 
 #: qcsrc/common/notifications/all.inc:267
 msgid "^BGYou don't have any fuel for the ^F1Jetpack"
@@ -2627,7 +2626,7 @@ msgstr "^K1La Grenade de Guérison de ^BG%s^K1 ne l'a pas tout à fait guéri%s%
 #: qcsrc/common/notifications/all.inc:328
 #, c-format
 msgid "^BG%s^K1 died%s%s. What's the point of living without ammo?"
-msgstr "^BG%s^K1 est mort%s%s. À quoi bon vivre sans munition ?"
+msgstr "^BG%s^K1 est mort%s%s. À quoi bon vivre sans munition ?"
 
 #: qcsrc/common/notifications/all.inc:328
 #, c-format
@@ -2838,29 +2837,29 @@ msgstr "^BGManche terminée, il n'y a pas de gagnant"
 #: qcsrc/common/notifications/all.inc:375
 #, c-format
 msgid "^BGGodmode saved you %s units of damage, cheater!"
-msgstr "^BGLe mode Dieu vous a épargné %s points de dommages, tricheur !"
+msgstr "^BGLe mode Dieu vous a épargné %s points de dommages, tricheur !"
 
 #: qcsrc/common/notifications/all.inc:377
 #, c-format
 msgid "^BG%s^BG got the %s^BG buff!"
-msgstr "^BG%s^BG a le bonus de %s^BG !"
+msgstr "^BG%s^BG a le bonus de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:378
 #, c-format
 msgid "^BG%s^BG lost the %s^BG buff!"
-msgstr "^BG%s^BG a perdu le bonus de %s^BG !"
+msgstr "^BG%s^BG a perdu le bonus de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:379
 #: qcsrc/common/notifications/all.inc:696
 #, c-format
 msgid "^BGYou dropped the %s^BG buff!"
-msgstr "^BGVous avez lâché le bonus de %s^BG !"
+msgstr "^BGVous avez lâché le bonus de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:380
 #: qcsrc/common/notifications/all.inc:697
 #, c-format
 msgid "^BGYou got the %s^BG buff!"
-msgstr "^BGVous avez le bonus de %s^BG !"
+msgstr "^BGVous avez le bonus de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:382
 #: qcsrc/common/notifications/all.inc:700
@@ -2901,7 +2900,7 @@ msgstr "Le ^F1%s^BG n'est ^F4pas disponible^BG dans cette carte"
 #: qcsrc/common/notifications/all.inc:389
 #, c-format
 msgid "^BG%s^BG is connecting..."
-msgstr "^BG%s^BG se connecte..."
+msgstr "^BG%s^BG se connecte"
 
 #: qcsrc/common/notifications/all.inc:390
 #, c-format
@@ -2922,13 +2921,13 @@ msgstr "^BG%s^F3 joue maintenant dans l'équipe ^TC^TT"
 #: qcsrc/common/notifications/all.inc:710
 #, c-format
 msgid "^BG%s^BG has dropped the ball!"
-msgstr "^BG%s^BG a lâché la balle !"
+msgstr "^BG%s^BG a lâché la balle !"
 
 #: qcsrc/common/notifications/all.inc:395
 #: qcsrc/common/notifications/all.inc:711
 #, c-format
 msgid "^BG%s^BG has picked up the ball!"
-msgstr "^BG%s^BG a pris la balle !"
+msgstr "^BG%s^BG a pris la balle !"
 
 #: qcsrc/common/notifications/all.inc:397
 #, c-format
@@ -2994,7 +2993,7 @@ msgstr "Le générateur ^TC^TT^BG a été détruit"
 
 #: qcsrc/common/notifications/all.inc:414
 msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
-msgstr "Le générateur ^TC^TT^BG a brûlé spontanément suite aux prolongations !"
+msgstr "Le générateur ^TC^TT^BG a brûlé spontanément suite aux prolongations !"
 
 #: qcsrc/common/notifications/all.inc:416
 #, c-format
@@ -3113,7 +3112,7 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:439
 msgid "^TC^TT ^BGteam scores!"
-msgstr "L'équipe ^TC^TT ^BG marque !"
+msgstr "L'équipe ^TC^TT ^BG marque !"
 
 #: qcsrc/common/notifications/all.inc:441
 #, c-format
@@ -3122,7 +3121,7 @@ msgid ""
 "kicked, because spectating isn't allowed at this time!"
 msgstr ""
 "^F2Vous devez rejoindre la partie avant les prochaines %s, sinon vous serez "
-"expulsé, car les spectateurs ne sont pas autorisés pour le moment !"
+"expulsé, car les spectateurs ne sont pas autorisés pour le moment !"
 
 #: qcsrc/common/notifications/all.inc:443
 #, c-format
@@ -3143,7 +3142,7 @@ msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
 "^F2Xonotic %s"
 msgstr ""
-"^F4NOTE : ^BGLe serveur fonctionne avec ^F1Xonotic %s (beta)^BG, vous avez "
+"^F4NOTE : ^BGLe serveur fonctionne avec ^F1Xonotic %s (beta)^BG, vous avez "
 "^F2Xonotic %s"
 
 #: qcsrc/common/notifications/all.inc:449
@@ -3151,7 +3150,7 @@ msgstr ""
 msgid ""
 "^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
 msgstr ""
-"^F4NOTE : ^BGLe serveur fonctionne avec ^F1Xonotic %s^BG, vous avez "
+"^F4NOTE : ^BGLe serveur fonctionne avec ^F1Xonotic %s^BG, vous avez "
 "^F2Xonotic %s"
 
 #: qcsrc/common/notifications/all.inc:450
@@ -3160,13 +3159,13 @@ msgid ""
 "^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
 "the update from ^F3http://www.xonotic.org/^BG!"
 msgstr ""
-"^F4NOTE : ^F1Xonotic %s^BG est disponible, or vous avez toujours ^F2Xonotic "
-"%s^BG - obtenez la mise à jour depuis ^F3http://www.xonotic.org/^BG !"
+"^F4NOTE : ^F1Xonotic %s^BG est disponible, or vous avez toujours ^F2Xonotic "
+"%s^BG - obtenez la mise à jour depuis ^F3http://www.xonotic.org/^BG !"
 
 #: qcsrc/common/notifications/all.inc:452
 #, c-format
 msgid "^F3SVQC Build information: ^F4%s"
-msgstr "^F3Informations sur la version de SVQC : ^F4%s"
+msgstr "^F3Informations sur la version de SVQC : ^F4%s"
 
 #: qcsrc/common/notifications/all.inc:454
 #, c-format
@@ -3512,24 +3511,24 @@ msgstr "^BG%s%s^K1 a été vaporisé par le Vortex de ^BG%s^K1%s%s"
 
 #: qcsrc/common/notifications/all.inc:541
 msgid "^F4You are now alone!"
-msgstr "^F4Vous êtes désormais seul !"
+msgstr "^F4Vous êtes désormais seul !"
 
 #: qcsrc/common/notifications/all.inc:543
 msgid "^BGYou are attacking!"
-msgstr "^BGVous êtes en attaque !"
+msgstr "^BGVous êtes en attaque !"
 
 #: qcsrc/common/notifications/all.inc:544
 msgid "^BGYou are defending!"
-msgstr "^BGVous êtes en défense !"
+msgstr "^BGVous êtes en défense !"
 
 #: qcsrc/common/notifications/all.inc:545
 #, c-format
 msgid "^BGObjective destroyed in ^F4%s^BG!"
-msgstr "^BGObjectif détruit en ^F4%s^BG !"
+msgstr "^BGObjectif détruit en ^F4%s^BG !"
 
 #: qcsrc/common/notifications/all.inc:547
 msgid "^F4Begin!"
-msgstr "^F4C'est parti !"
+msgstr "^F4C'est parti !"
 
 #: qcsrc/common/notifications/all.inc:548
 msgid "^F4Game starts in ^COUNT"
@@ -3545,7 +3544,7 @@ msgstr "^F4La manche ne peut pas démarrer"
 
 #: qcsrc/common/notifications/all.inc:555
 msgid "^F2Don't camp!"
-msgstr "^F2Ne campez pas !"
+msgstr "^F2Ne campez pas !"
 
 #: qcsrc/common/notifications/all.inc:559
 msgid ""
@@ -3573,16 +3572,16 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:562
 msgid "^BGYou captured the ^TC^TT^BG flag!"
-msgstr "^BGVous avez capturé le drapeau ^TC^TT^BG !"
+msgstr "^BGVous avez capturé le drapeau ^TC^TT^BG !"
 
 #: qcsrc/common/notifications/all.inc:563
 msgid "^BGYou captured the flag!"
-msgstr "^BGVous avez capturé le drapeau !"
+msgstr "^BGVous avez capturé le drapeau !"
 
 #: qcsrc/common/notifications/all.inc:564
 #, c-format
 msgid "^BGToo many flag throws! Throwing disabled for %s."
-msgstr "^BGTrop de lancers de drapeaux ! Lancers désactivés pendant %s."
+msgstr "^BGTrop de lancers de drapeaux ! Lancers désactivés pendant %s."
 
 #: qcsrc/common/notifications/all.inc:565
 #, c-format
@@ -3626,91 +3625,91 @@ msgstr "^BGVous avez passé le drapeau à %s"
 
 #: qcsrc/common/notifications/all.inc:573
 msgid "^BGYou got the ^TC^TT^BG flag!"
-msgstr "^BGVous avez le drapeau ^TC^TT^BG !"
+msgstr "^BGVous avez le drapeau ^TC^TT^BG !"
 
 #: qcsrc/common/notifications/all.inc:574
 msgid "^BGYou got the flag!"
-msgstr "^BGVous avez le drapeau !"
+msgstr "^BGVous avez le drapeau !"
 
 #: qcsrc/common/notifications/all.inc:575
 #, c-format
 msgid "^BGYou got your %steam^BG's flag, return it!"
-msgstr "^BGVous avez le drapeau de votre équipe %s^BG, retournez-le !"
+msgstr "^BGVous avez le drapeau de votre équipe %s^BG, retournez-le !"
 
 #: qcsrc/common/notifications/all.inc:576
 #, c-format
 msgid "^BGYou got the %senemy^BG's flag, return it!"
-msgstr "^BGVous avez le drapeau ennemi %s^BG, rapportez-le !"
+msgstr "^BGVous avez le drapeau ennemi %s^BG, rapportez-le !"
 
 #: qcsrc/common/notifications/all.inc:577
 #, c-format
 msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
-msgstr "^BGL'ennemi %s^BGa votre drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s^BGa votre drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:578
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
-msgstr "^BGL'ennemi %s(^BG%s%s)^BG a votre drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s(^BG%s%s)^BG a votre drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:579
 #, c-format
 msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
-msgstr "^BGL'ennemi %s^BGa le drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s^BGa le drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:580
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
-msgstr "^BGL'ennemi %s(^BG%s%s)^BG a le drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s(^BG%s%s)^BG a le drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:581
 #, c-format
 msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr "^BGL'ennemi %s^BGa son drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s^BGa son drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:582
 #, c-format
 msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr "^BGL'ennemi %s(^BG%s%s)^BG a son drapeau ! Récupérez-le !"
+msgstr "^BGL'ennemi %s(^BG%s%s)^BG a son drapeau ! Récupérez-le !"
 
 #: qcsrc/common/notifications/all.inc:583
 #, c-format
 msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr "^BGVotre équipier %s^BGa le drapeau ^TC^TT^BG ! Protégez-les !"
+msgstr "^BGVotre équipier %s^BGa le drapeau ^TC^TT^BG ! Protégez-le !"
 
 #: qcsrc/common/notifications/all.inc:584
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
 msgstr ""
-"^BGVotre équipier %s(^BG%s%s)^BG a le drapeau ^TC^TT^BG ! Protégez-les !"
+"^BGVotre équipier %s(^BG%s%s)^BG a le drapeau ^TC^TT^BG ! Protégez-le !"
 
 #: qcsrc/common/notifications/all.inc:585
 #, c-format
 msgid "^BGYour %steam mate^BG got the flag! Protect them!"
-msgstr "^BGVotre équipier %s^BGa le drapeau ! Protégez-le !"
+msgstr "^BGVotre équipier %s^BGa le drapeau ! Protégez-le !"
 
 #: qcsrc/common/notifications/all.inc:586
 #, c-format
 msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
-msgstr "^BGVotre équipier %s(^BG%s%s)^BG a le drapeau ! Protégez-le !"
+msgstr "^BGVotre équipier %s(^BG%s%s)^BG a le drapeau ! Protégez-le !"
 
 #: qcsrc/common/notifications/all.inc:587
 msgid "^BGEnemies can now see you on radar!"
-msgstr "^BGLes ennemis peuvent maintenant vous voir sur le radar !"
+msgstr "^BGLes ennemis peuvent maintenant vous voir sur le radar !"
 
 #: qcsrc/common/notifications/all.inc:588
 msgid "^BGYou returned the ^TC^TT^BG flag!"
-msgstr "^BGVous avez récupéré le drapeau ^TC^TT^BG !"
+msgstr "^BGVous avez récupéré le drapeau ^TC^TT^BG !"
 
 #: qcsrc/common/notifications/all.inc:589
 msgid "^BGStalemate! Enemies can now see you on radar!"
 msgstr ""
-"^BGChasse à l'homme ! Les ennemis peuvent maintenant vous voir sur le radar !"
+"^BGChasse à l'homme ! Les ennemis peuvent maintenant vous voir sur le radar !"
 
 #: qcsrc/common/notifications/all.inc:590
 msgid "^BGStalemate! Flag carriers can now be seen by enemies on radar!"
 msgstr ""
-"^BGChasse à l'homme ! Les porteurs de drapeau sont maintenant visibles sur "
-"le radar !"
+"^BGChasse à l'homme ! Les porteurs de drapeau sont maintenant visibles sur "
+"le radar !"
 
 #: qcsrc/common/notifications/all.inc:594
 #, c-format
@@ -3781,11 +3780,11 @@ msgstr ""
 #: qcsrc/common/notifications/all.inc:630
 #, c-format
 msgid "^BGPress ^F2%s^BG again to toss the nade!"
-msgstr "^BGAppuyez sur ^F2%s^BG à nouveau pour lancer la grenade !"
+msgstr "^BGAppuyez sur ^F2%s^BG à nouveau pour lancer la grenade !"
 
 #: qcsrc/common/notifications/all.inc:631
 msgid "^F2You got a ^K1BONUS GRENADE^F2!"
-msgstr "^F2Vous avez une ^K1GRENADE SUPPLÉMENTAIRE^F2 !"
+msgstr "^F2Vous avez une ^K1GRENADE SUPPLÉMENTAIRE^F2 !"
 
 #: qcsrc/common/notifications/all.inc:633
 #, c-format
@@ -3794,27 +3793,27 @@ msgid ""
 "You are now on: %s"
 msgstr ""
 "^BGVous avez été déplacé dans une autre équipe\n"
-"Vous êtes maintenant dans : %s"
+"Vous êtes maintenant dans : %s"
 
 #: qcsrc/common/notifications/all.inc:634
 msgid "^K1Don't go against your team mates!"
-msgstr "^K1N'agressez pas vos coéquipiers !"
+msgstr "^K1N'agressez pas vos coéquipiers !"
 
 #: qcsrc/common/notifications/all.inc:634
 msgid "^K1Don't shoot your team mates!"
-msgstr "^K1Ne tirez pas sur vos coéquipiers !"
+msgstr "^K1Ne tirez pas sur vos coéquipiers !"
 
 #: qcsrc/common/notifications/all.inc:635
 msgid "^K1Die camper!"
-msgstr "^K1Meurs, campeur !"
+msgstr "^K1Meurs, campeur !"
 
 #: qcsrc/common/notifications/all.inc:635
 msgid "^K1Reconsider your tactics, camper!"
-msgstr "^K1Change de tactique, campeur !"
+msgstr "^K1Change de tactique, campeur !"
 
 #: qcsrc/common/notifications/all.inc:636
 msgid "^K1You unfairly eliminated yourself!"
-msgstr "^K1Vous vous êtes éliminé tout seul !"
+msgstr "^K1Vous vous êtes éliminé tout seul !"
 
 #: qcsrc/common/notifications/all.inc:637
 #, c-format
@@ -3823,59 +3822,59 @@ msgstr "^K1Vous avez été %s"
 
 #: qcsrc/common/notifications/all.inc:638
 msgid "^K1You couldn't catch your breath!"
-msgstr "^K1Vous n'avez pas pu reprendre votre souffle !"
+msgstr "^K1Vous n'avez pas pu reprendre votre souffle !"
 
 #: qcsrc/common/notifications/all.inc:639
 msgid "^K1You hit the ground with a crunch!"
-msgstr "^K1Vous avez heurté le sol dans un craquement sourd !"
+msgstr "^K1Vous avez heurté le sol dans un craquement sourd !"
 
 #: qcsrc/common/notifications/all.inc:640
 msgid "^K1You felt a little too hot!"
-msgstr "^K1Vous avez eu un coup de chaud !"
+msgstr "^K1Vous avez eu un coup de chaud !"
 
 #: qcsrc/common/notifications/all.inc:640
 msgid "^K1You got a little bit too crispy!"
-msgstr "^K1Vous êtes devenu un peu trop croustillant !"
+msgstr "^K1Vous êtes devenu un peu trop croustillant !"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You killed your own dumb self!"
-msgstr "^K1Vous vous êtes tué tout seul !"
+msgstr "^K1Vous vous êtes tué tout seul !"
 
 #: qcsrc/common/notifications/all.inc:641
 msgid "^K1You need to be more careful!"
-msgstr "^K1Vous devez faire plus attention !"
+msgstr "^K1Vous devez faire plus attention !"
 
 #: qcsrc/common/notifications/all.inc:642
 msgid "^K1You couldn't stand the heat!"
-msgstr "^K1Vous n'avez pas pu supporter la chaleur !"
+msgstr "^K1Vous n'avez pas pu supporter la chaleur !"
 
 #: qcsrc/common/notifications/all.inc:643
 msgid "^K1You need to watch out for monsters!"
-msgstr "^K1Vous devez prêter garde aux monstres !"
+msgstr "^K1Vous devez prêter garde aux monstres !"
 
 #: qcsrc/common/notifications/all.inc:643
 msgid "^K1You were killed by a monster!"
-msgstr "^K1Vous avez été tué par un monstre !"
+msgstr "^K1Vous avez été tué par un monstre !"
 
 #: qcsrc/common/notifications/all.inc:644
 msgid "^K1Tastes like chicken!"
-msgstr "^K1Ça a comme un goût de poulet !"
+msgstr "^K1Ça a comme un goût de poulet !"
 
 #: qcsrc/common/notifications/all.inc:644
 msgid "^K1You forgot to put the pin back in!"
-msgstr "^K1Vous avez oublié de remettre la goupille !"
+msgstr "^K1Vous avez oublié de remettre la goupille !"
 
 #: qcsrc/common/notifications/all.inc:645
 msgid "^K1Hanging around a napalm explosion is bad!"
-msgstr "^K1Traîner autour d'une explosion de napalm est mauvais !"
+msgstr "^K1Traîner autour d'une explosion de napalm est mauvais !"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You felt a little chilly!"
-msgstr "^K1Vous avez attrapé un coup de froid !"
+msgstr "^K1Vous avez attrapé un coup de froid !"
 
 #: qcsrc/common/notifications/all.inc:646
 msgid "^K1You got a little bit too cold!"
-msgstr "^K1Vous avez attrapé un peu trop froid !"
+msgstr "^K1Vous avez attrapé un peu trop froid !"
 
 #: qcsrc/common/notifications/all.inc:647
 msgid "^K1Your Healing Nade is a bit defective"
@@ -3899,104 +3898,102 @@ msgstr "^K1Vous devez prendre soin de votre santé"
 
 #: qcsrc/common/notifications/all.inc:650
 msgid "^K1You became a shooting star!"
-msgstr "^K1Vous vous êtes transformé une étoile filante !"
+msgstr "^K1Vous vous êtes transformé en étoile filante !"
 
 #: qcsrc/common/notifications/all.inc:651
 msgid "^K1You melted away in slime!"
-msgstr "^K1Vous avez été rongé par l'acide !"
+msgstr "^K1Vous avez été rongé par l'acide !"
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You committed suicide!"
-msgstr "^K1Vous vous êtes suicidé !"
+msgstr "^K1Vous vous êtes suicidé !"
 
 #: qcsrc/common/notifications/all.inc:652
 msgid "^K1You ended it all!"
-msgstr "^K1Vous avez mis fin à vos jours !"
+msgstr "^K1Vous avez mis fin à vos jours !"
 
 #: qcsrc/common/notifications/all.inc:653
 msgid "^K1You got stuck in a swamp!"
-msgstr "^K1Vous avez été englouti !"
+msgstr "^K1Vous avez été englouti !"
 
 #: qcsrc/common/notifications/all.inc:654
 #, c-format
 msgid "^BGYou are now on: %s"
-msgstr "^BGVous êtes maintenant dans : %s"
+msgstr "^BGVous êtes maintenant dans : %s"
 
 #: qcsrc/common/notifications/all.inc:655
 msgid "^K1You died in an accident!"
-msgstr "^K1Vous êtes mort dans un accident !"
+msgstr "^K1Vous êtes mort dans un accident !"
 
 #: qcsrc/common/notifications/all.inc:656
 msgid "^K1You had an unfortunate run in with a turret!"
-msgstr "^K1Vous avez terminé votre course infortunée dans une tourelle !"
+msgstr "^K1Vous avez eu une rencontre infortunée avec une tourelle !"
 
 #: qcsrc/common/notifications/all.inc:656
 msgid "^K1You were fragged by a turret!"
-msgstr "^K1Vous avez été tué par une tourelle !"
+msgstr "^K1Vous avez été tué par une tourelle !"
 
 #: qcsrc/common/notifications/all.inc:657
 msgid "^K1You had an unfortunate run in with an eWheel turret!"
-msgstr ""
-"^K1Vous avez terminé votre course infortunée dans une tourelle eWheel !"
+msgstr "^K1Vous avez eu une rencontre infortunée avec une tourelle eWheel !"
 
 #: qcsrc/common/notifications/all.inc:657
 msgid "^K1You were fragged by an eWheel turret!"
-msgstr "^K1Vous avez été tué par une tourelle eWheel !"
+msgstr "^K1Vous avez été tué par une tourelle eWheel !"
 
 #: qcsrc/common/notifications/all.inc:658
 msgid "^K1You had an unfortunate run in with a Walker turret!"
-msgstr ""
-"^K1Vous avez terminé votre course infortunée dans une tourelle Walker !"
+msgstr "^K1Vous avez eu une rencontre infortunée avec une tourelle Walker !"
 
 #: qcsrc/common/notifications/all.inc:658
 msgid "^K1You were fragged by a Walker turret!"
-msgstr "^K1Vous avez été tué par une tourelle Walker !"
+msgstr "^K1Vous avez été tué par une tourelle Walker !"
 
 #: qcsrc/common/notifications/all.inc:659
 msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1Vous avez été pris dans l'explosion d'un Bumblebee !"
+msgstr "^K1Vous avez été pris dans l'explosion d'un Bumblebee !"
 
 #: qcsrc/common/notifications/all.inc:660
 msgid "^K1You were crushed by a vehicle!"
-msgstr "^K1Vous avez été écrasé par un véhicule !"
+msgstr "^K1Vous avez été écrasé par un véhicule !"
 
 #: qcsrc/common/notifications/all.inc:661
 msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1Vous avez été pris dans un bombardement de Raptor !"
+msgstr "^K1Vous avez été pris dans un bombardement de Raptor !"
 
 #: qcsrc/common/notifications/all.inc:662
 msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1Vous avez été pris dans l'explosion d'un Raptor !"
+msgstr "^K1Vous avez été pris dans l'explosion d'un Raptor !"
 
 #: qcsrc/common/notifications/all.inc:663
 msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1Vous avez été pris dans l'explosion d'un Spiderbot !"
+msgstr "^K1Vous avez été pris dans l'explosion d'un Spiderbot !"
 
 #: qcsrc/common/notifications/all.inc:664
 msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1Vous avez été réduit en miettes par une roquette de Spiderbot !"
+msgstr "^K1Vous avez été réduit en miettes par une roquette de Spiderbot !"
 
 #: qcsrc/common/notifications/all.inc:665
 msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1Vous avez été pris dans l'explosion d'un Racer !"
+msgstr "^K1Vous avez été pris dans l'explosion d'un Racer !"
 
 #: qcsrc/common/notifications/all.inc:666
 msgid "^K1You couldn't find shelter from a Racer rocket!"
-msgstr "^K1Vous n'avez pas pu esquiver une roquette de Racer !"
+msgstr "^K1Vous n'avez pas pu esquiver une roquette de Racer !"
 
 #: qcsrc/common/notifications/all.inc:667
 msgid "^K1Watch your step!"
-msgstr "^K1Attention à la marche !"
+msgstr "^K1Attention à la marche !"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot ! Vous avez tué ^BG%s^K1, un équipier !"
+msgstr "^K1Idiot ! Vous avez tué ^BG%s^K1, un équipier !"
 
 #: qcsrc/common/notifications/all.inc:669
 #, c-format
 msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr "^K1Idiot ! Vous avez agressé ^BG%s^K1, un équipier !"
+msgstr "^K1Idiot ! Vous avez agressé ^BG%s^K1, un équipier !"
 
 #: qcsrc/common/notifications/all.inc:670
 #, c-format
@@ -4013,22 +4010,22 @@ msgid ""
 "^K1Stop idling!\n"
 "^BGDisconnecting in ^COUNT..."
 msgstr ""
-"^K1Ne restez pas inactif !\n"
+"^K1Ne restez pas inactif !\n"
 "^BGDéconnexion dans ^COUNT…"
 
 #: qcsrc/common/notifications/all.inc:674
 #, c-format
 msgid "^BGYou need %s^BG!"
-msgstr "^BGVous avez besoin de %s^BG !"
+msgstr "^BGVous avez besoin de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:675
 #, c-format
 msgid "^BGYou also need %s^BG!"
-msgstr "^BGVous avez aussi besoin de %s^BG !"
+msgstr "^BGVous avez aussi besoin de %s^BG !"
 
 #: qcsrc/common/notifications/all.inc:676
 msgid "^BGDoor unlocked!"
-msgstr "^BGPorte déverrouillée !"
+msgstr "^BGPorte déverrouillée !"
 
 #: qcsrc/common/notifications/all.inc:678
 msgid "^F2You picked up some extra lives"
@@ -4055,7 +4052,7 @@ msgstr "^K3Vous avez été automatiquement dégelé après %s seconde(s)"
 
 #: qcsrc/common/notifications/all.inc:685
 msgid "^BGThe generator is under attack!"
-msgstr "^BGLe générateur est attaqué !"
+msgstr "^BGLe générateur est attaqué !"
 
 #: qcsrc/common/notifications/all.inc:687
 msgid "^TC^TT^BG team loses the round"
@@ -4072,7 +4069,7 @@ msgstr "^K1La manche a déjà commencé, vous apparaissez comme gelé"
 #: qcsrc/common/notifications/all.inc:694
 #, c-format
 msgid "^K1A %s has arrived!"
-msgstr "^K1Un %s est arrivé !"
+msgstr "^K1Un %s est arrivé !"
 
 #: qcsrc/common/notifications/all.inc:698
 msgid "^BGYou got the ^F1Fuel regenerator"
@@ -4087,7 +4084,7 @@ msgid ""
 "^K1No spawnpoints available!\n"
 "Hope your team can fix it..."
 msgstr ""
-"^K1Aucun endroit où apparaître !\n"
+"^K1Aucun endroit où apparaître !\n"
 "En espérant que votre équipe puisse y remédier…"
 
 #: qcsrc/common/notifications/all.inc:708
@@ -4105,31 +4102,31 @@ msgstr "^BGVous avez ramassé la balle"
 #: qcsrc/common/notifications/all.inc:713
 msgid "^BGKilling people while you don't have the ball gives no points!"
 msgstr ""
-"^BGTuer des gens alors que vous n'avez pas la balle ne rapporte aucun point !"
+"^BGTuer des gens alors que vous n'avez pas la balle ne rapporte aucun point !"
 
 #: qcsrc/common/notifications/all.inc:715
 msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Help the key carriers to meet!"
 msgstr ""
-"^BGToutes les clés sont entre les mains de votre équipe !\n"
-"Aidez les porteurs de clé à se réunir !"
+"^BGToutes les clés sont entre les mains de votre équipe !\n"
+"Aidez les porteurs de clé à se réunir !"
 
 #: qcsrc/common/notifications/all.inc:716
 msgid ""
 "^BGAll keys are in ^TC^TT team^BG's hands!\n"
 "Interfere ^F4NOW^BG!"
 msgstr ""
-"^BGToutes les clés sont entre les mains de l'équipe ^TC^TT ^BG !\n"
-"Intervenez ^F4MAINTENANT^BG !"
+"^BGToutes les clés sont entre les mains de l'équipe ^TC^TT ^BG !\n"
+"Intervenez ^F4MAINTENANT^BG !"
 
 #: qcsrc/common/notifications/all.inc:717
 msgid ""
 "^BGAll keys are in your team's hands!\n"
 "Meet the other key carriers ^F4NOW^BG!"
 msgstr ""
-"^BGToutes les clés sont entre vos mains !\n"
-"Rejoignez les autres porteurs de clé ^F4MAINTENANT^BG !"
+"^BGToutes les clés sont entre vos mains !\n"
+"Rejoignez les autres porteurs de clé ^F4MAINTENANT^BG !"
 
 #: qcsrc/common/notifications/all.inc:718
 msgid "^F4Round will start in ^COUNT"
@@ -4154,7 +4151,7 @@ msgid ""
 "Need active players for: %s"
 msgstr ""
 "^BGEn attente de joueurs…\n"
-"Joueurs requis pour : %s"
+"Joueurs requis pour : %s"
 
 #: qcsrc/common/notifications/all.inc:725
 #, c-format
@@ -4164,24 +4161,24 @@ msgstr "^BGEn attente de %s joueur(s)…"
 #: qcsrc/common/notifications/all.inc:727
 msgid "^BGYour weapon has been downgraded until you find some ammo!"
 msgstr ""
-"^BGVotre arme a été déclassée jusqu'à ce que vous trouviez des munitions !"
+"^BGVotre arme a été déclassée jusqu'à ce que vous trouviez des munitions !"
 
 #: qcsrc/common/notifications/all.inc:728
 msgid "^F4^COUNT^BG left to find some ammo!"
-msgstr "^F4^COUNT^BG restantes pour trouver des munitions !"
+msgstr "^F4^COUNT^BG restantes pour trouver des munitions !"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
-msgstr "^BGTrouvez des munitions ou vous allez mourir dans ^F4^COUNT^BG !"
+msgstr "^BGTrouvez des munitions ou vous allez mourir dans ^F4^COUNT^BG !"
 
 #: qcsrc/common/notifications/all.inc:729
 msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
-msgstr "^BGTrouvez des munitions ! ^F4^COUNT^BG restantes !"
+msgstr "^BGTrouvez des munitions ! ^F4^COUNT^BG restantes !"
 
 #: qcsrc/common/notifications/all.inc:730
 #, c-format
 msgid "^F2Extra lives remaining: ^K1%s"
-msgstr "^F2Vies supplémentaires restantes : ^K1%s"
+msgstr "^F2Vies supplémentaires restantes : ^K1%s"
 
 #: qcsrc/common/notifications/all.inc:734
 #, c-format
@@ -4190,12 +4187,12 @@ msgid ""
 "Next weapon: ^F1%s"
 msgstr ""
 "^F2^COUNT^BG avant le changement d'arme…\n"
-"Prochaine arme : ^F1%s"
+"Prochaine arme : ^F1%s"
 
 #: qcsrc/common/notifications/all.inc:735
 #, c-format
 msgid "^F2Active weapon: ^F1%s"
-msgstr "^F2Arme actuelle : ^F1%s"
+msgstr "^F2Arme actuelle : ^F1%s"
 
 #: qcsrc/common/notifications/all.inc:737
 #, c-format
@@ -4221,15 +4218,15 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:741
 msgid "^BGThe ^TCenemy^BG generator is no longer shielded!"
-msgstr "^BGLe générateur ennemi n'est plus protégé !"
+msgstr "^BGLe générateur ennemi n'est plus protégé !"
 
 #: qcsrc/common/notifications/all.inc:742
 msgid ""
 "^K1Your generator is NOT shielded!\n"
 "^BGRe-capture control points to shield it!"
 msgstr ""
-"^K1Votre générateur n'est PAS protégé !\n"
-"^BGRe-capturez des points de contrôle pour le protéger !"
+"^K1Votre générateur n'est PAS protégé !\n"
+"^BGRe-capturez des points de contrôle pour le protéger !"
 
 #: qcsrc/common/notifications/all.inc:743
 #, c-format
@@ -4246,16 +4243,16 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep fragging until we have a winner!"
 msgstr ""
-"^F4PROLONGATIONS^F2 ^F2commencées !\n"
-"Continuez de jouer jusqu'à ce qu'il y ait un gagnant !"
+"^F4PROLONGATIONS^F2 ^F2commencées !\n"
+"Continuez de jouer jusqu'à ce qu'il y ait un gagnant !"
 
 #: qcsrc/common/notifications/all.inc:746
 msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "Keep scoring until we have a winner!"
 msgstr ""
-"^F4PROLONGATIONS^F2 ^F2commencées !\n"
-"Continuez de marquer des points jusqu'à ce qu'il y ait un gagnant !"
+"^F4PROLONGATIONS^F2 ^F2commencées !\n"
+"Continuez de marquer des points jusqu'à ce qu'il y ait un gagnant !"
 
 #: qcsrc/common/notifications/all.inc:747
 msgid ""
@@ -4265,7 +4262,7 @@ msgid ""
 "The more control points your team holds,\n"
 "the faster the enemy generator decays"
 msgstr ""
-"^F4PROLONGATIONS^F2 ^F2commencées !\n"
+"^F4PROLONGATIONS^F2 ^F2commencées !\n"
 "\n"
 "Les générateurs sont en train de se détériorer.\n"
 "Plus votre équipe détient de points de contrôle,\n"
@@ -4277,8 +4274,8 @@ msgid ""
 "^F2Now playing ^F4OVERTIME^F2!\n"
 "^BGAdded ^F4%s^BG to the game!"
 msgstr ""
-"^F4PROLONGATIONS^F2 ^F2commencées !\n"
-"^BG^F4%s^BG de jeu supplémentaires !"
+"^F4PROLONGATIONS^F2 ^F2commencées !\n"
+"^BG^F4%s^BG de jeu supplémentaires !"
 
 #: qcsrc/common/notifications/all.inc:750
 msgid "^K1In^BG-portal created"
@@ -4326,15 +4323,15 @@ msgstr "^F2Le bonus d'Invisibilité a expiré"
 
 #: qcsrc/common/notifications/all.inc:766
 msgid "^F2The race is over, finish your lap!"
-msgstr "^F2La course est terminée, finissez votre tour !"
+msgstr "^F2La course est terminée, finissez votre tour !"
 
 #: qcsrc/common/notifications/all.inc:768
 msgid "^BGSecondary fire inflicts no damage!"
-msgstr "^BGLe tir secondaire n'inflige aucun dommage !"
+msgstr "^BGLe tir secondaire n'inflige aucun dommage !"
 
 #: qcsrc/common/notifications/all.inc:770
 msgid "^BGSequence completed!"
-msgstr "^BGSéquence terminée !"
+msgstr "^BGSéquence terminée !"
 
 #: qcsrc/common/notifications/all.inc:771
 msgid "^BGThere are more to go..."
@@ -4383,7 +4380,7 @@ msgstr "^F4Fin du temps mort dans ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:786
 msgid "^K1Cannot join given minigame session!"
-msgstr "^K1Impossible de rejoindre cette session de mini jeux !"
+msgstr "^K1Impossible de rejoindre cette session de mini jeux !"
 
 #: qcsrc/common/notifications/all.inc:788
 #, c-format
@@ -4405,12 +4402,12 @@ msgid ""
 "^F2The enemy is stealing one of your vehicles!\n"
 "^F4Stop them!"
 msgstr ""
-"^F2L'ennemi est en train de voler un de vos véhicules !\n"
-"^F4Arrêtez-le !"
+"^F2L'ennemi est en train de voler un de vos véhicules !\n"
+"^F4Arrêtez-le !"
 
 #: qcsrc/common/notifications/all.inc:792
 msgid "^F2Intruder detected, disabling shields!"
-msgstr "^F2Intrus détecté, boucliers désactivés !"
+msgstr "^F2Intrus détecté, boucliers désactivés !"
 
 #: qcsrc/common/notifications/all.qh:194
 msgid "Notification dump command only works with cl_cmd and sv_cmd."
@@ -4450,100 +4447,100 @@ msgstr "lancer la grenade"
 #: qcsrc/common/notifications/all.qh:450
 #, c-format
 msgid "%s^K1 made a TRIPLE FRAG! %s^BG"
-msgstr "%s^K1 a fait un TRIPLE FRAG ! %s^BG"
+msgstr "%s^K1 a fait un TRIPLE FRAG ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:450
 #, c-format
 msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
-msgstr "%s^K1 a fait un TRIPLE SCORE ! %s^BG"
+msgstr "%s^K1 a fait un TRIPLE SCORE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:450
 msgid "TRIPLE FRAG! "
-msgstr "TRIPLE FRAG !"
+msgstr "TRIPLE FRAG ! "
 
 #: qcsrc/common/notifications/all.qh:451
 #, c-format
 msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué CINQ POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué CINQ POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:451
 #, c-format
 msgid "%s^K1 unlocked RAGE! %s^BG"
-msgstr "%s^K1 est ENRAGÉ ! %s^BG"
+msgstr "%s^K1 est ENRAGÉ ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:451
 msgid "RAGE! "
-msgstr "RAGE !"
+msgstr "RAGE ! "
 
 #: qcsrc/common/notifications/all.qh:452
 #, c-format
 msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué DIX POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué DIX POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:452
 #, c-format
 msgid "%s^K1 started a MASSACRE! %s^BG"
-msgstr "%s^K1 a commencé un MASSACRE ! %s^BG"
+msgstr "%s^K1 a commencé un MASSACRE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:452
 msgid "MASSACRE! "
-msgstr "MASSACRE !"
+msgstr "MASSACRE ! "
 
 #: qcsrc/common/notifications/all.qh:453
 #, c-format
 msgid "%s^K1 executed MAYHEM! %s^BG"
-msgstr "%s^K1 fait du GRABUGE ! %s^BG"
+msgstr "%s^K1 fait du GRABUGE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:453
 #, c-format
 msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué QUINZE POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué QUINZE POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:453
 msgid "MAYHEM! "
-msgstr "GRABUGE !"
+msgstr "GRABUGE ! "
 
 #: qcsrc/common/notifications/all.qh:454
 #, c-format
 msgid "%s^K1 is a BERSERKER! %s^BG"
-msgstr "%s^K1 est un FOU FURIEUX ! %s^BG"
+msgstr "%s^K1 est un FOU FURIEUX ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:454
 #, c-format
 msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué VINGT POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué VINGT POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:454
 msgid "BERSERKER! "
-msgstr "FOU FURIEUX !"
+msgstr "FOU FURIEUX ! "
 
 #: qcsrc/common/notifications/all.qh:455
 #, c-format
 msgid "%s^K1 inflicts CARNAGE! %s^BG"
-msgstr "%s^K1 fait un CARNAGE ! %s^BG"
+msgstr "%s^K1 fait un CARNAGE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:455
 #, c-format
 msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué VINGT-CINQ POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué VINGT-CINQ POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:455
 msgid "CARNAGE! "
-msgstr "CARNAGE !"
+msgstr "CARNAGE ! "
 
 #: qcsrc/common/notifications/all.qh:456
 #, c-format
 msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 a marqué TRENTE POINTS D'AFFILÉE ! %s^BG"
+msgstr "%s^K1 a marqué TRENTE POINTS D'AFFILÉE ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:456
 #, c-format
 msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
-msgstr "%s^K1 est en mode ARMAGEDDON ! %s^BG"
+msgstr "%s^K1 est en mode ARMAGEDDON ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:456
 msgid "ARMAGEDDON! "
-msgstr "ARMAGEDDON !"
+msgstr "ARMAGEDDON ! "
 
 #: qcsrc/common/notifications/all.qh:463
 #, c-format
@@ -4576,48 +4573,48 @@ msgstr ""
 #: qcsrc/common/notifications/all.qh:495 qcsrc/common/notifications/all.qh:508
 #, c-format
 msgid "%d score spree! "
-msgstr "%d points d'affilée ! "
+msgstr "%d points d'affilée ! "
 
 #: qcsrc/common/notifications/all.qh:507
 #, c-format
 msgid "%d frag spree! "
-msgstr "%d frags d'affilée !"
+msgstr "%d frags d'affilée ! "
 
 #: qcsrc/common/notifications/all.qh:520
 msgid "First blood! "
-msgstr "Premier sang !"
+msgstr "Premier sang ! "
 
 #: qcsrc/common/notifications/all.qh:520
 msgid "First score! "
-msgstr "Premier point !"
+msgstr "Premier point ! "
 
 #: qcsrc/common/notifications/all.qh:524
 msgid "First casualty! "
-msgstr "Première victime ! "
+msgstr "Première victime ! "
 
 #: qcsrc/common/notifications/all.qh:524
 msgid "First victim! "
-msgstr "Première victime !"
+msgstr "Première victime ! "
 
 #: qcsrc/common/notifications/all.qh:565
 #, c-format
 msgid "%s^K1 has %d frags in a row! %s^BG"
-msgstr "%s^K1 a marqué %d frags d'affilée ! %s^BG"
+msgstr "%s^K1 a marqué %d frags d'affilée ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:566
 #, c-format
 msgid "%s^K1 made %d scores in a row! %s^BG"
-msgstr "%s^K1 a marqué %d points d'affilée ! %s^BG"
+msgstr "%s^K1 a marqué %d points d'affilée ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:584
 #, c-format
 msgid "%s^K1 drew first blood! %s^BG"
-msgstr "%s^K1 a versé le premier sang ! %s^BG"
+msgstr "%s^K1 a versé le premier sang ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:585
 #, c-format
 msgid "%s^K1 got the first score! %s^BG"
-msgstr "%s^K1 a marqué le premier point ! %s^BG"
+msgstr "%s^K1 a marqué le premier point ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:601
 #, c-format
@@ -4723,7 +4720,7 @@ msgstr "La commande de vidage des tourelles fonctionne uniquement avec sv_cmd."
 #: qcsrc/common/turrets/cl_turrets.qc:125
 #, c-format
 msgid "%s under attack!"
-msgstr "%s sous attaque !"
+msgstr "%s attaqué !"
 
 #: qcsrc/common/turrets/turret.qh:11
 msgid "Turret"
@@ -5204,11 +5201,11 @@ msgstr "Appuyez sur %s"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:947
 msgid "No right gunner!"
-msgstr "Aucun tireur à droite !"
+msgstr "Aucun tireur à droite !"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qc:953
 msgid "No left gunner!"
-msgstr "Aucun tireur à gauche !"
+msgstr "Aucun tireur à gauche !"
 
 #: qcsrc/common/vehicles/vehicle/bumblebee.qh:19
 msgid "Bumblebee"
@@ -5552,7 +5549,7 @@ msgstr "%02d:%02d:%02d"
 
 #: qcsrc/menu/command/menu_cmd.qc:48
 msgid "Usage: menu_cmd command..., where possible commands are:"
-msgstr "Utilisation : menu_cmd commande..., où les commandes possibles sont :"
+msgstr "Utilisation : menu_cmd commande…, où les commandes possibles sont :"
 
 #: qcsrc/menu/command/menu_cmd.qc:49
 msgid "  sync - reloads all cvars on the current menu page"
@@ -5570,7 +5567,7 @@ msgstr ""
 
 #: qcsrc/menu/command/menu_cmd.qc:81
 msgid "Available options:"
-msgstr "Options disponibles :"
+msgstr "Options disponibles :"
 
 #: qcsrc/menu/command/menu_cmd.qc:130
 msgid "Invalid command. For a list of supported commands, try menu_cmd help."
@@ -5593,7 +5590,7 @@ msgstr "Personnalisé"
 #: qcsrc/menu/xonotic/campaign.qc:235
 #, c-format
 msgid "Level %d: %s"
-msgstr "Niveau %d : %s"
+msgstr "Niveau %d : %s"
 
 #: qcsrc/menu/xonotic/credits.qc:4
 msgid "Core Team"
@@ -5825,7 +5822,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:45
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:28
 msgid "Name:"
-msgstr "Nom :"
+msgstr "Nom :"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:53
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:64
@@ -5834,13 +5831,13 @@ msgstr "Nom sous lequel vous apparaîtrez dans le jeu"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:69
 msgid "Text language:"
-msgstr "Langue du texte :"
+msgstr "Langue du texte :"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:78
 msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
 msgstr ""
 "Autoriser les statistiques de joueurs à utiliser votre pseudonyme sur stats."
-"xonotic.org ?"
+"xonotic.org ?"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:84
 msgid "Undecided"
@@ -5856,7 +5853,7 @@ msgstr "Bienvenue"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:18
 msgid "Ammunition display:"
-msgstr "Affichage des munitions :"
+msgstr "Affichage des munitions :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:21
 msgid "Show only current ammo type"
@@ -5865,17 +5862,17 @@ msgstr "Afficher uniquement le type de munition actuel"
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:24
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
 msgid "Noncurrent alpha:"
-msgstr "Transparence icônes :"
+msgstr "Transparence icônes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
 msgid "Noncurrent scale:"
-msgstr "Taille icônes :"
+msgstr "Taille icônes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
 msgid "Align icon:"
-msgstr "Aligner l'icône :"
+msgstr "Aligner l'icône :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:33
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
@@ -5907,11 +5904,11 @@ msgstr "Munitions"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:19
 msgid "Message duration:"
-msgstr "Durée du message :"
+msgstr "Durée du message :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:23
 msgid "Fade time:"
-msgstr "Durée du fondu :"
+msgstr "Durée du fondu :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
 msgid "Flip messages order"
@@ -5920,7 +5917,7 @@ msgstr "Inverser l'ordre des messages"
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
 msgid "Text alignment:"
-msgstr "Alignement du texte :"
+msgstr "Alignement du texte :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:33
 #: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:22
@@ -5930,7 +5927,7 @@ msgstr "Au centre"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:37
 msgid "Font scale:"
-msgstr "Échelle de la police :"
+msgstr "Échelle de la police :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
 msgid "Centerprint Panel"
@@ -5938,15 +5935,15 @@ msgstr "Affichage central"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
 msgid "Chat entries:"
-msgstr "Entrées du tchat :"
+msgstr "Entrées du tchat :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
 msgid "Chat size:"
-msgstr "Taille du tchat :"
+msgstr "Taille du tchat :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
 msgid "Chat lifetime:"
-msgstr "Durée tchat :"
+msgstr "Durée tchat :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
 msgid "Chat beep sound"
@@ -5958,7 +5955,7 @@ msgstr "Tchat"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:16
 msgid "Engine info:"
-msgstr "Informations sur la version :"
+msgstr "Informations sur le moteur :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:19
 msgid "Use an averaging algorithm for fps"
@@ -5981,7 +5978,7 @@ msgstr "Activer la barre d'état"
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:21
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:19
 msgid "Status bar alignment:"
-msgstr "Alignement de la barre d'état :"
+msgstr "Alignement de la barre d'état :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:39
@@ -6000,7 +5997,7 @@ msgstr "Extérieur"
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
 msgid "Icon alignment:"
-msgstr "Alignement des icônes :"
+msgstr "Alignement des icônes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
 msgid "Flip health and armor positions"
@@ -6012,7 +6009,7 @@ msgstr "Santé/Armure"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:16
 msgid "Info messages:"
-msgstr "Messages d'information :"
+msgstr "Messages d'information :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
 msgid "Flip align"
@@ -6050,7 +6047,7 @@ msgstr "Réduite"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:32
 msgid "Text/icon ratio:"
-msgstr "Ratio texte / icônes :"
+msgstr "Ratio texte / icônes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
 msgid "Hide spawned items"
@@ -6074,7 +6071,7 @@ msgstr "Icônes du Mode de jeu"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:17
 msgid "Notifications:"
-msgstr "Notifications :"
+msgstr "Notifications :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:20
 msgid "Also print notifications to the console"
@@ -6086,11 +6083,11 @@ msgstr "Inverser l'ordre de notification"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
 msgid "Entry lifetime:"
-msgstr "Durée d'affichage de l'entrée :"
+msgstr "Durée d'affichage de l'entrée :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
 msgid "Entry fadetime:"
-msgstr "Délai d'effacement de l'entrée :"
+msgstr "Délai d'effacement de l'entrée :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
 msgid "Notification Panel"
@@ -6137,7 +6134,7 @@ msgstr "Inverser les positions de la vitesse/de l'accélération"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
 msgid "Speed:"
-msgstr "Vitesse :"
+msgstr "Vitesse :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
 msgid "Include vertical speed"
@@ -6145,7 +6142,7 @@ msgstr "Inclure la vitesse verticale"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
 msgid "Speed unit:"
-msgstr "Unité de vitesse :"
+msgstr "Unité de vitesse :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
 msgid "qu/s"
@@ -6177,7 +6174,7 @@ msgstr "Vitesse maximale"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
 msgid "Acceleration:"
-msgstr "Accélération :"
+msgstr "Accélération :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
 msgid "Include vertical acceleration"
@@ -6198,7 +6195,7 @@ msgstr "Toujours activer"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
 msgid "Forced aspect:"
-msgstr "Aspect forcé :"
+msgstr "Aspect forcé :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
 msgid "Pressed Keys Panel"
@@ -6218,7 +6215,7 @@ msgstr "Activer dans les jeux en équipe"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
 msgid "Radar:"
-msgstr "Radar :"
+msgstr "Radar :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:26
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:68
@@ -6231,11 +6228,11 @@ msgstr "Radar :"
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:124
 #: qcsrc/menu/xonotic/util.qc:800
 msgid "Alpha:"
-msgstr "Transparence :"
+msgstr "Transparence :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:30
 msgid "Rotation:"
-msgstr "Rotation :"
+msgstr "Rotation :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:32
 msgid "Forward"
@@ -6259,11 +6256,11 @@ msgstr "Nord"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
 msgid "Scale:"
-msgstr "Échelle :"
+msgstr "Échelle :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
 msgid "Zoom mode:"
-msgstr "Mode de zoom :"
+msgstr "Mode de zoom :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
 msgid "Zoomed in"
@@ -6287,11 +6284,11 @@ msgstr "Radar"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:17
 msgid "Score:"
-msgstr "Score :"
+msgstr "Score :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:20
 msgid "Rankings:"
-msgstr "Classements :"
+msgstr "Classements :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:58
@@ -6312,7 +6309,7 @@ msgstr "Scores"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:16
 msgid "Timer:"
-msgstr "Chronomètre :"
+msgstr "Chronomètre :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:19
 msgid "Show elapsed time"
@@ -6324,7 +6321,7 @@ msgstr "Chronomètre"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
 msgid "Alpha after voting:"
-msgstr "Transparence après vote :"
+msgstr "Transparence après vote :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
 msgid "Vote Panel"
@@ -6332,7 +6329,7 @@ msgstr "Vote"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
 msgid "Fade out after:"
-msgstr "Fondu après :"
+msgstr "Fondu après :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
@@ -6348,7 +6345,7 @@ msgstr "%ds"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:30
 msgid "Fade effect:"
-msgstr "Effet de fondu :"
+msgstr "Effet de fondu :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
 msgid "EF^None"
@@ -6368,7 +6365,7 @@ msgstr "Les deux"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:40
 msgid "Weapon icons:"
-msgstr "Icônes des armes :"
+msgstr "Icônes des armes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:43
 msgid "Show only owned weapons"
@@ -6376,7 +6373,7 @@ msgstr "Afficher uniquement les armes disponibles"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
 msgid "Show weapon ID as:"
-msgstr "Identification des armes :"
+msgstr "Identification des armes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
 msgid "SHOWAS^None"
@@ -6392,7 +6389,7 @@ msgstr "Touche"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:60
 msgid "Weapon ID scale:"
-msgstr "Taille de l'ID des armes :"
+msgstr "Taille de l'ID des armes :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
 msgid "Show Accuracy"
@@ -6404,11 +6401,11 @@ msgstr "Afficher les munitions"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
 msgid "Ammo bar alpha:"
-msgstr "Transparence barre munitions :"
+msgstr "Transparence barre munitions :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:76
 msgid "Ammo bar color:"
-msgstr "Couleur barre munitions :"
+msgstr "Couleur barre munitions :"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
 msgid "Weapons Panel"
@@ -6425,7 +6422,7 @@ msgstr "Thèmes de l'ATH"
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:25
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:33
 msgid "Filter:"
-msgstr "Filtre :"
+msgstr "Filtre :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:30
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
@@ -6445,22 +6442,22 @@ msgstr "Enregistrer le thème actuel"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
 msgid "Panel background defaults:"
-msgstr "Arrière-plan des tableaux de bord par défaut :"
+msgstr "Arrière-plan des tableaux de bord par défaut :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:48
 #: qcsrc/menu/xonotic/util.qc:775
 msgid "Background:"
-msgstr "Arrière-plan :"
+msgstr "Arrière-plan :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
 #: qcsrc/menu/xonotic/util.qc:791
 msgid "Border size:"
-msgstr "Taille de la bordure :"
+msgstr "Taille de la bordure :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
 msgid "Team color:"
-msgstr "Couleur de l'équipe :"
+msgstr "Couleur de l'équipe :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
 #: qcsrc/menu/xonotic/util.qc:817
@@ -6470,11 +6467,11 @@ msgstr "Tester la couleur d'équipe en mode configuration"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
 #: qcsrc/menu/xonotic/util.qc:820
 msgid "Padding:"
-msgstr "Remplissage :"
+msgstr "Remplissage :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
 msgid "HUD Dock:"
-msgstr "Contours de l'ATH :"
+msgstr "Contours de l'ATH :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
 msgid "DOCK^Disabled"
@@ -6494,7 +6491,7 @@ msgstr "Large"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:121
 msgid "Grid settings:"
-msgstr "Configuration de la grille :"
+msgstr "Configuration de la grille :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:124
 msgid "Snap panels to grid"
@@ -6502,15 +6499,15 @@ msgstr "Aligner les tableaux de bord sur la grille"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:127
 msgid "Grid size:"
-msgstr "Taille de la grille :"
+msgstr "Taille de la grille :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:129
 msgid "X:"
-msgstr "X :"
+msgstr "X :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:136
 msgid "Y:"
-msgstr "Y :"
+msgstr "Y :"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:145
 msgid "Exit setup"
@@ -6522,7 +6519,7 @@ msgstr "Configuration de l'ATH"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:13
 msgid "Monster:"
-msgstr "Monstre :"
+msgstr "Monstre :"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:22
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
@@ -6536,7 +6533,7 @@ msgstr "Retirer"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:25
 msgid "Move target:"
-msgstr "Déplacer la cible :"
+msgstr "Déplacer la cible :"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:26
 msgid "Follow"
@@ -6556,12 +6553,12 @@ msgstr "Aucun mouvement"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:31
 msgid "Colors:"
-msgstr "Couleurs :"
+msgstr "Couleurs :"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:33
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:39
 msgid "Set skin:"
-msgstr "Définir le thème :"
+msgstr "Définir le thème :"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qh:6
 msgid "Monster Tools"
@@ -6618,7 +6615,7 @@ msgstr "Mode de jeu"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:79
 msgid "Time limit:"
-msgstr "Limite de temps :"
+msgstr "Limite de temps :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:81
 msgid "Timelimit in minutes that when hit, will end the match"
@@ -6644,7 +6641,7 @@ msgstr "illimité"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:109
 msgid "Teams:"
-msgstr "Équipes :"
+msgstr "Équipes :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:112
 msgid "2 teams"
@@ -6660,7 +6657,7 @@ msgstr "4 équipes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:117
 msgid "Player slots:"
-msgstr "Nombre de joueurs :"
+msgstr "Nombre de joueurs :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:119
 msgid ""
@@ -6672,7 +6669,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:121
 msgid "Number of bots:"
-msgstr "Nombre de bots :"
+msgstr "Nombre de bots :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:123
 msgid "Amount of bots on your server"
@@ -6680,7 +6677,7 @@ msgstr "Nombre de bots sur votre serveur"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:125
 msgid "Bot skill:"
-msgstr "Niveau des bots :"
+msgstr "Niveau des bots :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
 msgid "Specify how experienced the bots will be"
@@ -6728,7 +6725,7 @@ msgstr "Inhumain"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:139
 msgid "Godlike"
-msgstr "Comme un Dieu"
+msgstr "Divin"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:155
 msgid "Mutators..."
@@ -6748,11 +6745,11 @@ msgid ""
 "Delete to clear; Enter when done."
 msgstr ""
 "Cliquez ici ou appuyez sur Ctrl-F afin de saisir un mot-clé pour affiner la "
-"liste des cartes. Ctrl-Suppr pour effacer ; Entrée lorsque vous avez terminé."
+"liste des cartes. Ctrl-Suppr pour effacer ; Entrée lorsque vous avez terminé."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
 msgid "Add shown"
-msgstr "Ajouter les filtrés"
+msgstr "Ajouter les filtrées"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
 msgid "Add the maps shown in the list to your selection"
@@ -6760,7 +6757,7 @@ msgstr "Ajouter les cartes affichées dans la liste à votre sélection"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
 msgid "Remove shown"
-msgstr "Supprimer les filtrés"
+msgstr "Supprimer les filtrées"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:189
 msgid "Remove the maps shown in the list from your selection"
@@ -6784,19 +6781,19 @@ msgstr "Supprimer toutes les cartes de votre sélection"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
 msgid "Start Multiplayer!"
-msgstr "Démarrer !"
+msgstr "Démarrer !"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:50
 msgid "Title:"
-msgstr "Titre :"
+msgstr "Titre :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:56
 msgid "Author:"
-msgstr "Auteur :"
+msgstr "Auteur :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:62
 msgid "Game types:"
-msgstr "Types de jeu :"
+msgstr "Types de jeu :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:85
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:257
@@ -6813,11 +6810,11 @@ msgstr "Informations sur la carte"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:28
 msgid "All Weapons Arena"
-msgstr "Arène avec toutes les Armes"
+msgstr "Arène avec toutes les armes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:30
 msgid "Most Weapons Arena"
-msgstr "Arène avec la plupart des Armes"
+msgstr "Arène avec la plupart des armes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:46
 #, c-format
@@ -6847,12 +6844,12 @@ msgstr "NIX"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:225
 msgid "Rocket Flying"
-msgstr "Roquettes Volantes"
+msgstr "Roquettes volantes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:217
 msgid "Invincible Projectiles"
-msgstr "Projectiles Invincibles"
+msgstr "Projectiles invincibles"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
@@ -6929,7 +6926,7 @@ msgstr "Aucun"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:160
 msgid "Gameplay mutators:"
-msgstr "Mutateurs mode de jeu :"
+msgstr "Mutateurs mode de jeu :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:164
 msgid "Enable dodging"
@@ -6937,7 +6934,7 @@ msgstr "Activer les esquives"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:171
 msgid "All players are almost invisible"
-msgstr "Tous les joueurs sont presque invisibles"
+msgstr "Les joueurs sont tous quasi invisibles"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:179
 msgid "Only possible to inflict damage on your enemy while they're airborne"
@@ -6962,7 +6959,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:206
 msgid "Weapon & item mutators:"
-msgstr "Mutateurs armes & objets :"
+msgstr "Mutateurs armes & objets :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:209
 msgid "Grappling hook"
@@ -6998,7 +6995,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:243
 msgid "Weapon arenas:"
-msgstr "Arènes d'arme :"
+msgstr "Arènes d'arme :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:246
 msgid "Custom weapons"
@@ -7014,7 +7011,7 @@ msgstr "Toutes les armes"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:275
 msgid "Special arenas:"
-msgstr "Arènes spéciales :"
+msgstr "Arènes spéciales :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:279
 msgid ""
@@ -7087,7 +7084,7 @@ msgstr "Recharger la liste des serveurs"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:68
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:184
 msgid "Address:"
-msgstr "Adresse :"
+msgstr "Adresse :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:79
 msgid "Info..."
@@ -7110,7 +7107,7 @@ msgstr "Se déconnecter du serveur"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:88
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:264
 msgid "Join!"
-msgstr "Rejoindre !"
+msgstr "Rejoindre !"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:114
 #: qcsrc/menu/xonotic/serverlist.qc:1044
@@ -7169,56 +7166,56 @@ msgstr "Requis (chiffrement activé)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
 msgid "Use the `crypto_aeslevel` cvar to change your preferences"
-msgstr "Utiliser la cvar « crypto_aeslevel » pour changer vos préférences"
+msgstr "Utiliser la cvar « crypto_aeslevel » pour changer vos préférences"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
 msgid "Hostname:"
-msgstr "Nom de l'hôte :"
+msgstr "Nom de l'hôte :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:192
 msgid "Gametype:"
-msgstr "Type de jeu :"
+msgstr "Type de jeu :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:197
 msgid "Map:"
-msgstr "Carte :"
+msgstr "Carte :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:202
 msgid "Mod:"
-msgstr "Mode :"
+msgstr "Mode :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:207
 msgid "Version:"
-msgstr "Version :"
+msgstr "Version :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:212
 msgid "Settings:"
-msgstr "Paramètres :"
+msgstr "Paramètres :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:219
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
 msgid "Players:"
-msgstr "Joueurs :"
+msgstr "Joueurs :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:224
 msgid "Bots:"
-msgstr "Bots :"
+msgstr "Bots :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
 msgid "Free slots:"
-msgstr "Places libres :"
+msgstr "Places libres :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
 msgid "Encryption:"
-msgstr "Chiffrement :"
+msgstr "Chiffrement :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:240
 msgid "ID:"
-msgstr "ID :"
+msgstr "ID :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:245
 msgid "Key:"
-msgstr "Clé :"
+msgstr "Clé :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh:7
 msgid "Server Information"
@@ -7259,7 +7256,7 @@ msgstr "Jouer une démo vous déconnectera de la partie actuelle."
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:15
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:15
 msgid "Do you really wish to disconnect now?"
-msgstr "Voulez-vous vraiment vous déconnecter ?"
+msgstr "Voulez-vous vraiment vous déconnecter ?"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
 msgid "Timing a demo will disconnect you from the current match."
@@ -7283,7 +7280,7 @@ msgstr "Réinitialiser la chanson du menu par défaut"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
 msgid "Playlist:"
-msgstr "Liste de lecture :"
+msgstr "Liste de lecture :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:55
 msgid "Random order"
@@ -7384,11 +7381,11 @@ msgstr "Pays"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:153
 msgid "Select language..."
-msgstr "Choisir la langue..."
+msgstr "Choisir la langue"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:169
 msgid "Gender:"
-msgstr "Genre :"
+msgstr "Genre :"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:176
 msgid "Gender"
@@ -7396,15 +7393,15 @@ msgstr "Genre"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:11
 msgid "Are you sure you want to quit?"
-msgstr "Êtes-vous sûr de vouloir quitter ?"
+msgstr "Êtes-vous sûr de vouloir quitter ?"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:15
 msgid "Back to work..."
-msgstr "Retour au boulot..."
+msgstr "Retour au boulot"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:17
 msgid "I got some more fragging to do!"
-msgstr "'Faut que je fragge plus de monde !"
+msgstr "'Faut que je fragge plus de monde !"
 
 #: qcsrc/menu/xonotic/dialog_quit.qh:7
 msgid "Quit the game"
@@ -7412,7 +7409,7 @@ msgstr "Quitter Xonotic"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:15
 msgid "Model:"
-msgstr "Modèle :"
+msgstr "Modèle :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:21
 msgid "Remove *"
@@ -7428,7 +7425,7 @@ msgstr "Coller"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:26
 msgid "Bone:"
-msgstr "Os :"
+msgstr "Os :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:31
 msgid "Set * as child"
@@ -7444,35 +7441,35 @@ msgstr "Détacher depuis *"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
 msgid "Visual object properties for *:"
-msgstr "Propriétés visuelles de l'objet * :"
+msgstr "Propriétés visuelles de l'objet * :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:41
 msgid "Set alpha:"
-msgstr "Transparence :"
+msgstr "Transparence :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:44
 msgid "Set color main:"
-msgstr "Couleur principale :"
+msgstr "Couleur principale :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
 msgid "Set color glow:"
-msgstr "Couleur des éclats :"
+msgstr "Couleur des éclats :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
 msgid "Set frame:"
-msgstr "Trame :"
+msgstr "Trame :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
 msgid "Physical object properties for *:"
-msgstr "Propriétés physiques de l'objet * :"
+msgstr "Propriétés physiques de l'objet * :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
 msgid "Set material:"
-msgstr "Matériau :"
+msgstr "Matériau :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:62
 msgid "Set solidity:"
-msgstr "Solidité :"
+msgstr "Solidité :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
 msgid "Non-solid"
@@ -7484,7 +7481,7 @@ msgstr "Solide"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
 msgid "Set physics:"
-msgstr "Physiques :"
+msgstr "Physiques :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
 msgid "Static"
@@ -7500,11 +7497,11 @@ msgstr "Physique"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
 msgid "Set scale:"
-msgstr "Échelle :"
+msgstr "Échelle :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:72
 msgid "Set force:"
-msgstr "Force :"
+msgstr "Force :"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:76
 msgid "Claim *"
@@ -7573,43 +7570,43 @@ msgstr "Changer les paramètres du jeu"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
 msgid "Master:"
-msgstr "Général :"
+msgstr "Général :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
 msgid "Music:"
-msgstr "Musique :"
+msgstr "Musique :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
 msgid "VOL^Ambient:"
-msgstr "Ambiance :"
+msgstr "Ambiance :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:50
 msgid "Info:"
-msgstr "Info :"
+msgstr "Info :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:57
 msgid "Items:"
-msgstr "Objets :"
+msgstr "Objets :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:64
 msgid "Pain:"
-msgstr "Douleur :"
+msgstr "Douleur :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:71
 msgid "Player:"
-msgstr "Joueur :"
+msgstr "Joueur :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:78
 msgid "Shots:"
-msgstr "Tirs :"
+msgstr "Tirs :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:85
 msgid "Voice:"
-msgstr "Voix :"
+msgstr "Voix :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:93
 msgid "Weapons:"
-msgstr "Armes :"
+msgstr "Armes :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
 msgid "New style sound attenuation"
@@ -7621,7 +7618,7 @@ msgstr "Couper le son en cas d'inactivité"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
 msgid "Frequency:"
-msgstr "Fréquence :"
+msgstr "Fréquence :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:107
 msgid "Sound output frequency"
@@ -7661,7 +7658,7 @@ msgstr "48 kHz"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:119
 msgid "Channels:"
-msgstr "Canaux :"
+msgstr "Canaux :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
 msgid "Number of channels for the sound output"
@@ -7716,7 +7713,7 @@ msgid ""
 "Enable spatialization (blend the right and left channel slightly to decrease "
 "stereo separation a bit for headphones)"
 msgstr ""
-"Essayer de diminuer le « contraste » entre la partie gauche et droite du "
+"Essayer de diminuer le « contraste » entre la partie gauche et droite du "
 "casque pour un meilleur son"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
@@ -7749,7 +7746,7 @@ msgstr "Jouer des sons au survol des boutons également"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
 msgid "Time announcer:"
-msgstr "Annonce du temps restant :"
+msgstr "Annonce du temps restant :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:158
 msgid "WRN^Disabled"
@@ -7765,7 +7762,7 @@ msgstr "Les deux"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
 msgid "Automatic taunts:"
-msgstr "Railleries automatiques :"
+msgstr "Railleries automatiques :"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
 msgid "Automatically taunt enemies after fragging them"
@@ -7791,7 +7788,7 @@ msgstr "Infos de débogage à propos du son"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
 msgid "Are you sure you want to reset all key bindings?"
-msgstr "Êtes-vous sûr de vouloir réinitialiser tous les raccourcis clavier ?"
+msgstr "Êtes-vous sûr de vouloir réinitialiser tous les raccourcis clavier ?"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
 msgid "Reset key bindings"
@@ -7799,11 +7796,11 @@ msgstr "Réinitialiser les raccourcis clavier"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
 msgid "Quality preset:"
-msgstr "Qualité prédéfinie :"
+msgstr "Qualité prédéfinie :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
 msgid "PRE^OMG!"
-msgstr "OMG !"
+msgstr "OMG !"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:48
 msgid "PRE^Low"
@@ -7831,7 +7828,7 @@ msgstr "Ultime"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
 msgid "Geometry detail:"
-msgstr "Détails géométriques :"
+msgstr "Détails géométriques :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
 msgid "Change the smoothness of the curves on the map"
@@ -7863,7 +7860,7 @@ msgstr "Ahurissants"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
 msgid "Player detail:"
-msgstr "Détails des joueurs :"
+msgstr "Détails des joueurs :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
 msgid "PDET^Low"
@@ -7887,7 +7884,7 @@ msgstr "Meilleurs"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:87
 msgid "Texture resolution:"
-msgstr "Définition des textures :"
+msgstr "Définition des textures :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:91
 msgid "RES^Leet"
@@ -7988,7 +7985,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:152
 msgid "Reflections:"
-msgstr "Reflets :"
+msgstr "Reflets :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:153
 msgid ""
@@ -8029,7 +8026,7 @@ msgstr "Impacts sur les modèles"
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:169
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:253
 msgid "Distance:"
-msgstr "Distance :"
+msgstr "Distance :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:172
 msgid "Decals further away than this will not be drawn"
@@ -8039,7 +8036,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:176
 msgid "Time:"
-msgstr "Durée :"
+msgstr "Durée :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:179
 msgid "Time in seconds before decals fade away"
@@ -8047,7 +8044,7 @@ msgstr "Durée en secondes avant que les marques d'impact ne disparaissent"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:183
 msgid "Damage effects:"
-msgstr "Effets des dommages :"
+msgstr "Effets des dommages :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:185
 msgid "DMGFX^Disabled"
@@ -8148,7 +8145,7 @@ msgid ""
 "Enable bloom effect, which brightens the neighboring pixels of very bright "
 "pixels. Has a big impact on performance."
 msgstr ""
-"Activer l'effet « bloom », qui éclaire les pixels voisins de pixels très "
+"Activer l'effet « bloom », qui éclaire les pixels voisins de pixels très "
 "brillants. Cela a un gros impact sur les performances."
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:226
@@ -8169,7 +8166,7 @@ msgstr "Intensité du flou de mouvement - 0.4 est recommandé"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:233
 msgid "Motion blur:"
-msgstr "Flou de mouvement :"
+msgstr "Flou de mouvement :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:239
 msgid "Particles"
@@ -8187,7 +8184,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:246
 msgid "Quality:"
-msgstr "Qualité :"
+msgstr "Qualité :"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:249
 #: qcsrc/menu/xonotic/slider_particles.qc:13
@@ -8224,7 +8221,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:97
 msgid "Size:"
-msgstr "Taille :"
+msgstr "Taille :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:64
 msgid "By health"
@@ -8248,7 +8245,7 @@ msgstr "Adoucir les effets de réticule"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:125
 msgid "Hit testing:"
-msgstr "Détection de visée :"
+msgstr "Détection de visée :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:128
 msgid ""
@@ -8256,8 +8253,8 @@ msgid ""
 "when there's an obstacle between your gun and the target; Enemies: also "
 "enlarge the crosshair when you would hit an enemy"
 msgstr ""
-"Aucune : ne pas tester le réticule ; TrueAim : flouter le réticule lorsqu'il "
-"y a un obstacle entre votre fusil et la cible ; Ennemis : élargir en plus le "
+"Aucune : ne pas tester le réticule ; TrueAim : flouter le réticule lorsqu'il "
+"y a un obstacle entre votre fusil et la cible ; Ennemis : élargir en plus le "
 "réticule lorsqu'un ennemi est dans votre ligne de mire"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
@@ -8298,7 +8295,7 @@ msgstr "Tableau des scores"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
 msgid "Fading speed:"
-msgstr "Vitesse d'estompage :"
+msgstr "Vitesse d'estompage :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
 msgid "Enable rows / columns highlighting"
@@ -8310,16 +8307,16 @@ msgstr "Afficher la précision en dessous du tableau des scores"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
 msgid "Show team sizes:"
-msgstr "Afficher les tailles d'équipes :"
+msgstr "Afficher les tailles d'équipes :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:56
 msgid ""
 "Team size position: Off=do not show; Left=on the left side of the scoreboard "
 "and move team scores to the right; Right=on the right of the scoreboard"
 msgstr ""
-"Position de la taille d'équipe : Off = ne pas afficher ; Gauche = sur le "
+"Position de la taille d'équipe : Off = ne pas afficher ; Gauche = sur le "
 "côté gauche du tableau des scores et déplacer les scores d'équipe sur la "
-"droite ; Droite = sur la droite du tableau des scores"
+"droite ; Droite = sur la droite du tableau des scores"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
 msgid "Waypoints"
@@ -8340,11 +8337,11 @@ msgstr "Ajuster l'opacité des waypoints"
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
 msgid "Fontsize:"
-msgstr "Taille de police :"
+msgstr "Taille de police :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
 msgid "Edge offset:"
-msgstr "Compensation des bords :"
+msgstr "Compensation des bords :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
 msgid "Fade when near the crosshair"
@@ -8360,15 +8357,15 @@ msgstr "Dommages"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
 msgid "Overlay:"
-msgstr "Overlay :"
+msgstr "Overlay :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
 msgid "Factor:"
-msgstr "Facteur :"
+msgstr "Facteur :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
 msgid "Fade rate:"
-msgstr "Fondu :"
+msgstr "Fondu :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
 msgid "Player Names"
@@ -8380,11 +8377,11 @@ msgstr "Afficher les noms au-dessus des joueurs"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
 msgid "Max distance:"
-msgstr "Distance maximale :"
+msgstr "Distance maximale :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
 msgid "Decolorize:"
-msgstr "Décoloriser :"
+msgstr "Décoloriser :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:146
 #: qcsrc/menu/xonotic/keybinder.qc:114
@@ -8401,7 +8398,7 @@ msgstr "Afficher la santé et l'armure"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
 msgid "Damage overlay:"
-msgstr "Effet des blessures :"
+msgstr "Effet des blessures :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:166
 msgid "Dynamic HUD"
@@ -8430,7 +8427,7 @@ msgstr "Pour que l'éditeur d'ATH fonctionne, vous devez rejoindre une partie."
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
 msgid "Do you wish to start a local game to set up the HUD?"
-msgstr "Voulez-vous démarrer une partie locale pour configurer l'ATH ?"
+msgstr "Voulez-vous démarrer une partie locale pour configurer l'ATH ?"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
 msgid "Frag Information"
@@ -8454,7 +8451,7 @@ msgstr "Les afficher dans les notifications de frag"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:43
 msgid "Sprees in info messages:"
-msgstr "Séries de frags dans les messages d'information :"
+msgstr "Séries de frags dans les messages d'information :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
 msgid "SPREES^Disabled"
@@ -8559,11 +8556,11 @@ msgstr "Utiliser des images 2D plutôt que des modèles 3D"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
 msgid "Unavailable alpha:"
-msgstr "Transparence quand indisponible :"
+msgstr "Transparence quand indisponible :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:37
 msgid "Unavailable color:"
-msgstr "Couleur quand indisponible :"
+msgstr "Couleur quand indisponible :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:39
 msgid "GHOITEMS^Black"
@@ -8604,11 +8601,11 @@ msgstr "Dans les modes sans équipe uniquement"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
 msgid "Body fading:"
-msgstr "Effacement des corps :"
+msgstr "Effacement des corps :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
 msgid "Gibs:"
-msgstr "Effets sanglants :"
+msgstr "Effets sanglants :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
 msgid "GIBS^None"
@@ -8678,7 +8675,7 @@ msgstr "Passer à travers les murs en mode spectateur"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:70
 msgid "Field of view:"
-msgstr "Champ de vue :"
+msgstr "Champ de vue :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:72
 msgid "Field of vision in degrees"
@@ -8686,7 +8683,7 @@ msgstr "Champ de vision en degrés"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:76
 msgid "ZOOM^Zoom factor:"
-msgstr "Facteur du zoom :"
+msgstr "Facteur du zoom :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:78
 msgid "How big the zoom factor is when the zoom button is pressed"
@@ -8694,11 +8691,11 @@ msgstr "Facteur du zoom lorsque vous appuyez sur le bouton de zoom"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:81
 msgid "ZOOM^Zoom speed:"
-msgstr "Vitesse du zoom :"
+msgstr "Vitesse du zoom :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:83
 msgid "How fast the view will be zoomed, disable to zoom instantly"
-msgstr "Facteur « d'adoucissement » du zoom, 0 le désactive complètement"
+msgstr "Facteur « d'adoucissement » du zoom, 0 le désactive complètement"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:92
 msgid "ZOOM^Instant"
@@ -8706,14 +8703,14 @@ msgstr "Instantané"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:96
 msgid "ZOOM^Zoom sensitivity:"
-msgstr "Sensibilité du zoom :"
+msgstr "Sensibilité du zoom :"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:98
 msgid ""
 "How zoom changes sensitivity, from 0 (lower sensitivity) to 1 (no "
 "sensitivity change)"
 msgstr ""
-"Changer la sensibilité du zoom : 0 est la valeur la plus basse, 1 correspond "
+"Changer la sensibilité du zoom : 0 est la valeur la plus basse, 1 correspond "
 "à l'absence de zoom"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:101
@@ -8747,7 +8744,7 @@ msgstr "Vue"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:34
 msgid "Weapon Priority List (* = mutator weapon)"
-msgstr "Liste de priorité des armes (* = arme de mutateur)"
+msgstr "Liste de priorité des armes (* = arme de mutateur)"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:40
 msgid "Up"
@@ -8843,7 +8840,7 @@ msgstr "Souris"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:60
 msgid "Sensitivity:"
-msgstr "Sensibilité :"
+msgstr "Sensibilité :"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:62
 msgid "Mouse speed multiplier"
@@ -8897,7 +8894,7 @@ msgstr "Continuer de sauter en cas d'appui continu"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:100
 msgid "Jetpack on jump:"
-msgstr "Jetpack lors du saut :"
+msgstr "Jetpack lors du saut :"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:102
 msgid "JPJUMP^Disabled"
@@ -8919,11 +8916,11 @@ msgstr "Utiliser une manette"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
 msgid "Command when pressed:"
-msgstr "Commande quand appuyé :"
+msgstr "Commande quand appuyé :"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
 msgid "Command when released:"
-msgstr "Commande quand relâché :"
+msgstr "Commande quand relâché :"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
 msgid "Cancel"
@@ -8954,7 +8951,7 @@ msgstr "Réseau"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
 msgid "Client UDP port:"
-msgstr "Port UDP client :"
+msgstr "Port UDP client :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
 msgid "Force client to use chosen port unless it is set to 0"
@@ -8962,7 +8959,7 @@ msgstr "Forcer le client à passer par le port choisi sauf s'il est défini à 0
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
 msgid "Bandwidth:"
-msgstr "Bande passante :"
+msgstr "Bande passante :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
 msgid "Specify your network speed"
@@ -8990,7 +8987,7 @@ msgstr "Très haut débit"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:44
 msgid "Input packets/s:"
-msgstr "Paquets entrants/s :"
+msgstr "Paquets entrants/s :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:46
 msgid "How many input packets to send to the server each second"
@@ -8998,11 +8995,11 @@ msgstr "Nombre maximum de paquets à envoyer au serveur chaque seconde"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:48
 msgid "Server queries/s:"
-msgstr "Requêtes serveur/s :"
+msgstr "Requêtes serveur/s :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
 msgid "Downloads:"
-msgstr "Téléchargements :"
+msgstr "Téléchargements :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:54
 msgid "Maximum number of concurrent HTTP/FTP downloads"
@@ -9010,11 +9007,11 @@ msgstr "Nombre maximum de téléchargements simultanés en HTTP/FTP"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:56
 msgid "Download speed:"
-msgstr "Vitesse de téléchargement :"
+msgstr "Vitesse de téléchargement :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
 msgid "Local latency:"
-msgstr "Latence locale :"
+msgstr "Latence locale :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:73
 msgid "Show netgraph"
@@ -9043,7 +9040,7 @@ msgstr "Taux de rafraîchissement"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:87
 msgid "Maximum:"
-msgstr "Maximum :"
+msgstr "Maximum :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:99
 msgid "MAXFPS^Unlimited"
@@ -9051,7 +9048,7 @@ msgstr "Illimité"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:102
 msgid "Target:"
-msgstr "Cible :"
+msgstr "Cible :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:104
 msgid "TRGT^Disabled"
@@ -9059,7 +9056,7 @@ msgstr "Désactivé"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:116
 msgid "Idle limit:"
-msgstr "Cible quand inactif :"
+msgstr "Cible quand inactif :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
 msgid "IDLFPS^Unlimited"
@@ -9079,14 +9076,14 @@ msgstr "Afficher le nombre d'images par seconde"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:135
 msgid "Menu tooltips:"
-msgstr "Infobulles du menu :"
+msgstr "Infobulles du menu :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:137
 msgid ""
 "Menu tooltips: disabled, standard or advanced (also shows cvar or console "
 "command bound to the menu item)"
 msgstr ""
-"Info-bulles : désactivé, standard ou avancé (affiche aussi la cvar ou la "
+"Info-bulles : désactivé, standard ou avancé (affiche aussi la cvar ou la "
 "commande associée)"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:138
@@ -9128,7 +9125,7 @@ msgstr "Réinitialisation complète"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
 msgid "Cvar filter:"
-msgstr "Filtre de cvar :"
+msgstr "Filtre de cvar :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
 msgid "Modified cvars only"
@@ -9136,19 +9133,19 @@ msgstr "cvars modifiées uniquement"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
 msgid "Setting:"
-msgstr "Propriété :"
+msgstr "Propriété :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:49
 msgid "Type:"
-msgstr "Type :"
+msgstr "Type :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:53
 msgid "Value:"
-msgstr "Valeur :"
+msgstr "Valeur :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:70
 msgid "Description:"
-msgstr "Description :"
+msgstr "Description :"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qh:7
 msgid "Advanced settings"
@@ -9156,13 +9153,13 @@ msgstr "Paramètres avancés"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
 msgid "Are you sure you want to reset all settings?"
-msgstr "Êtes-vous sûr de vouloir réinitialiser tous les paramètres ?"
+msgstr "Êtes-vous sûr de vouloir réinitialiser tous les paramètres ?"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
 msgid "This will create a backup config in your data directory"
 msgstr ""
-"Une sauvegarde de la configuration va être créée dans votre répertoire « "
-"data »"
+"Une sauvegarde de la configuration va être créée dans votre répertoire "
+"« data »"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:25
 msgid "Menu Skins"
@@ -9210,11 +9207,11 @@ msgstr "Avertissement"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:33
 msgid "Resolution:"
-msgstr "Résolution :"
+msgstr "Résolution :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:37
 msgid "Font/UI size:"
-msgstr "Taille de la police :"
+msgstr "Taille de la police :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:39
 msgid "SZ^Unreadable"
@@ -9254,12 +9251,12 @@ msgstr "Colossale"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:51
 msgid "Color depth:"
-msgstr "Profondeur de couleurs :"
+msgstr "Profondeur de couleurs :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:53
 msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
 msgstr ""
-"Profondeur des couleurs : 16 bits est plus rapide, mais 32 bits est de "
+"Profondeur des couleurs : 16 bits est plus rapide, mais 32 bits est de "
 "meilleure qualité (recommandé)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:54
@@ -9296,7 +9293,7 @@ msgstr "Mode mirroir"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:71
 msgid "Anisotropy:"
-msgstr "Anisotropie :"
+msgstr "Anisotropie :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:73
 msgid "Anisotropic filtering quality"
@@ -9326,7 +9323,7 @@ msgstr "16×"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:81
 msgid "Antialiasing:"
-msgstr "Anticrénelage :"
+msgstr "Anticrénelage :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:84
 msgid ""
@@ -9346,7 +9343,7 @@ msgstr "Anticrénelage de haute qualité"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:97
 msgid "Depth first:"
-msgstr "Profondeur d'abord :"
+msgstr "Profondeur d'abord :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:99
 msgid ""
@@ -9400,7 +9397,7 @@ msgstr "Points et Triangles"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:119
 msgid "Brightness:"
-msgstr "Luminosité :"
+msgstr "Luminosité :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:121
 msgid "Brightness of black"
@@ -9408,7 +9405,7 @@ msgstr "Luminosité du noir"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:123
 msgid "Contrast:"
-msgstr "Contraste :"
+msgstr "Contraste :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:125
 msgid "Brightness of white"
@@ -9416,7 +9413,7 @@ msgstr "Luminosité du blanc"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:127
 msgid "Gamma:"
-msgstr "Gamma :"
+msgstr "Gamma :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:130
 msgid ""
@@ -9428,7 +9425,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:133
 msgid "Contrast boost:"
-msgstr "Boost du contraste :"
+msgstr "Boost du contraste :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:136
 msgid "By how much to multiply the contrast in dark areas"
@@ -9436,19 +9433,19 @@ msgstr "Coefficient de multiplication du contraste dans les zones sombres"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:139
 msgid "Saturation:"
-msgstr "Saturation :"
+msgstr "Saturation :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:142
 msgid ""
 "Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
 "requires GLSL color control"
 msgstr ""
-"Ajustement de la saturation (0 = niveaux de gris, 1 = normal, 2 = "
+"Ajustement de la saturation (0 = niveaux de gris, 1 = normal, 2 = "
 "sursaturé), nécessite le contrôle de couleur GLSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:146
 msgid "LIT^Ambient:"
-msgstr "Ambiance :"
+msgstr "Ambiance :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:148
 msgid ""
@@ -9460,7 +9457,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:150
 msgid "Intensity:"
-msgstr "Intensité :"
+msgstr "Intensité :"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:152
 msgid "Global rendering brightness"
@@ -9504,7 +9501,7 @@ msgstr "Points délirants (bonus)"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:110
 msgid "Instant action! (random map with bots)"
-msgstr "Action instantanée ! (carte aléatoire avec des bots)"
+msgstr "Action instantanée ! (carte aléatoire avec des bots)"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:117
 msgid "???"
@@ -9512,7 +9509,7 @@ msgstr "???"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:130
 msgid "Campaign Difficulty:"
-msgstr "Difficulté de la Campagne :"
+msgstr "Difficulté de la Campagne :"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
 msgid "CSKL^Easy"
@@ -9528,7 +9525,7 @@ msgstr "Difficile"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:135
 msgid "Start Singleplayer!"
-msgstr "Démarrer !"
+msgstr "Démarrer !"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
 msgid "Singleplayer"
@@ -9576,11 +9573,11 @@ msgstr "Sélection d'Équipe"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:10
 msgid "Allow player statistics to use your nickname?"
-msgstr "Autoriser les statistiques de joueur à utiliser votre pseudonyme ?"
+msgstr "Autoriser les statistiques de joueur à utiliser votre pseudonyme ?"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:12
 msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr "En répondant « Non » vous apparaîtrez en tant que « Anonymous player »"
+msgstr "En répondant « Non » vous apparaîtrez en tant que « Anonymous player »"
 
 #: qcsrc/menu/xonotic/gametypelist.qc:87
 msgid "teamplay"
@@ -9752,13 +9749,13 @@ msgstr "Raccourcis personnalisés"
 
 #: qcsrc/menu/xonotic/mainwindow.qc:65 qcsrc/menu/xonotic/mainwindow.qc:68
 msgid "Do not press this button again!"
-msgstr "N'appuyez plus sur ce bouton !"
+msgstr "N'appuyez plus sur ce bouton !"
 
 #: qcsrc/menu/xonotic/maplist.qc:288
 msgid ""
 "Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
 msgstr ""
-"Hein ? Impossible de lancer cette partie (m est NULL). Re-filtrer pour que "
+"Hein ? Impossible de lancer cette partie (m est NULL). Re-filtrer pour que "
 "cela n'arrive plus."
 
 #: qcsrc/menu/xonotic/maplist.qc:296
@@ -9771,7 +9768,7 @@ msgid ""
 "Huh? Can't play this (invalid game type). Refiltering so this won't happen "
 "again."
 msgstr ""
-"Hein ? Impossible de lancer cette partie (type de jeu non valide). Re-"
+"Hein ? Impossible de lancer cette partie (type de jeu non valide). Re-"
 "filtrer pour que cela n'arrive plus."
 
 #: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
@@ -9821,12 +9818,12 @@ msgstr "aucun"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1043
 msgid "encryption:"
-msgstr "chiffrement :"
+msgstr "chiffrement :"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1044
 #, c-format
 msgid "mod: %s"
-msgstr "mode : %s"
+msgstr "mode : %s"
 
 #: qcsrc/menu/xonotic/serverlist.qc:1046
 #, c-format
@@ -10006,57 +10003,57 @@ msgstr "Décembre"
 
 #: qcsrc/menu/xonotic/statslist.qc:96
 msgid "Joined:"
-msgstr "A rejoint le :"
+msgstr "A rejoint le :"
 
 #: qcsrc/menu/xonotic/statslist.qc:103
 msgid "Last match:"
-msgstr "Dernier match :"
+msgstr "Dernier match :"
 
 #: qcsrc/menu/xonotic/statslist.qc:110
 msgid "Time played:"
-msgstr "Durée de jeu :"
+msgstr "Durée de jeu :"
 
 #: qcsrc/menu/xonotic/statslist.qc:117 qcsrc/menu/xonotic/statslist.qc:230
 msgid "Favorite map:"
-msgstr "Carte favorite :"
+msgstr "Carte favorite :"
 
 #: qcsrc/menu/xonotic/statslist.qc:149 qcsrc/menu/xonotic/statslist.qc:201
 #: qcsrc/menu/xonotic/statslist.qc:244
 #, c-format
 msgid "Matches:"
-msgstr "Matchs :"
+msgstr "Matchs :"
 
 #: qcsrc/menu/xonotic/statslist.qc:154
 #, c-format
 msgid "Wins/Losses:"
-msgstr "Victoires/Défaites :"
+msgstr "Victoires/Défaites :"
 
 #: qcsrc/menu/xonotic/statslist.qc:155
 #, c-format
 msgid "Win percentage:"
-msgstr "Pourcentage victoires :"
+msgstr "Pourcentage victoires :"
 
 #: qcsrc/menu/xonotic/statslist.qc:166
 #, c-format
 msgid "Kills/Deaths:"
-msgstr "Meurtres/Morts :"
+msgstr "Meurtres/Morts :"
 
 #: qcsrc/menu/xonotic/statslist.qc:172
 #, c-format
 msgid "Kill ratio:"
-msgstr "Taux de mortalité :"
+msgstr "Taux de mortalité :"
 
 #: qcsrc/menu/xonotic/statslist.qc:207
 msgid "ELO:"
-msgstr "ELO :"
+msgstr "ELO :"
 
 #: qcsrc/menu/xonotic/statslist.qc:214
 msgid "Rank:"
-msgstr "Rang :"
+msgstr "Rang :"
 
 #: qcsrc/menu/xonotic/statslist.qc:221
 msgid "Percentile:"
-msgstr "Percentile :"
+msgstr "Percentile :"
 
 #: qcsrc/menu/xonotic/statslist.qc:246
 #, c-format
@@ -10065,7 +10062,7 @@ msgstr "%d (non classé)"
 
 #: qcsrc/menu/xonotic/util.qc:417
 msgid "Update can be downloaded at:"
-msgstr "Une mise à jour peut être téléchargée sur :"
+msgstr "Une mise à jour peut être téléchargée sur :"
 
 #: qcsrc/menu/xonotic/util.qc:525
 msgid "Autogenerating mapinfo for newly added maps..."
@@ -10080,14 +10077,14 @@ msgstr "^1%s VERSION DE TEST"
 #: qcsrc/menu/xonotic/util.qc:574
 #, c-format
 msgid "Update to %s now!"
-msgstr "Mettez à jour vers %s maintenant !"
+msgstr "Mettez à jour vers %s maintenant !"
 
 #: qcsrc/menu/xonotic/util.qc:658
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems."
 msgstr ""
-"^1ERREUR : La compression des textures est requise mais non prise en "
+"^1ERREUR : La compression des textures est requise mais non prise en "
 "charge.\n"
 "^1Attendez-vous à des problèmes d'affichage."
 
@@ -10097,4 +10094,4 @@ msgstr "Par défaut"
 
 #: qcsrc/menu/xonotic/util.qc:808
 msgid "Team Color:"
-msgstr "Couleur de l'Ã\89quipe :"
+msgstr "Couleur de l'équipe :"
index 0f546e345b598ca129303ed3ee2378b53559bad5..7fbebd79781f47869c5e2153985ca2902369ad70 100644 (file)
@@ -3,8 +3,9 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
+# 62197a8afd75a0a64478212fcb55f596, 2017
 # Contijn Buijs <contijn.buijs@gmail.com>, 2017
-# Joeke de Graaf <mappack@null.net>, 2017
+# 62197a8afd75a0a64478212fcb55f596, 2017
 # Jonathan van der Steege <jonakeys@hotmail.com>, 2016
 # Jonathan van der Steege <jonakeys@hotmail.com>, 2016
 msgid ""
index bc7112f981e6b58270abf2f909f7e9dea687e14f..098a0496a1cf31957d52cad0eb87fb3fadf17114 100644 (file)
@@ -14,8 +14,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-07-07 02:23+0000\n"
+"Last-Translator: Jean Trindade Pereira <jean_trindade2@hotmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/team-xonotic/"
 "xonotic/language/pt_BR/)\n"
 "Language: pt_BR\n"
@@ -37,7 +37,7 @@ msgstr "^1Não foi possível escrever para %s"
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3Mensagem de contagem regressiva em %s. Segundos restantes: ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -45,11 +45,13 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Mensagem de multilinha em %s que\n"
+"^1dura mais que o normal"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Mensagem em %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
@@ -555,7 +557,7 @@ msgstr "PENALIDADE: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
-msgstr ""
+msgstr "falta um ponto de checagem"
 
 #: qcsrc/client/hud/panel/radar.qc:373
 msgid "Click to select teleport destination"
@@ -1526,11 +1528,11 @@ msgstr "Convidar"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:390
 msgid "Current Game"
-msgstr "Jogo Atual"
+msgstr "Jogo atual"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:415
 msgid "Exit Menu"
-msgstr "Sair do Menu"
+msgstr "Sair do menu"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:427
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
@@ -1547,11 +1549,11 @@ msgstr "Minijogos"
 
 #: qcsrc/common/minigames/cl_minigames_hud.qc:567
 msgid "Minigame message"
-msgstr ""
+msgstr "Mensagem de minijogo"
 
 #: qcsrc/common/minigames/minigame/bd.qc:2
 msgid "Bulldozer"
-msgstr ""
+msgstr "Buldôzer"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1092
 #: qcsrc/common/minigames/minigame/ps.qc:421
@@ -1604,7 +1606,7 @@ msgstr "Salvar"
 
 #: qcsrc/common/minigames/minigame/c4.qc:2
 msgid "Connect Four"
-msgstr ""
+msgstr "Lig 4"
 
 #: qcsrc/common/minigames/minigame/c4.qc:311
 #: qcsrc/common/minigames/minigame/c4.qc:317
@@ -1652,7 +1654,7 @@ msgstr "Clique no tabuleiro de jogo para posicionar sua peça"
 
 #: qcsrc/common/minigames/minigame/nmm.qc:7
 msgid "Nine Men's Morris"
-msgstr ""
+msgstr "Trilha"
 
 #: qcsrc/common/minigames/minigame/nmm.qc:615
 msgid ""
@@ -1683,11 +1685,11 @@ msgstr "IA"
 #: qcsrc/common/minigames/minigame/pong.qc:606
 msgid "Press ^1Start Match^7 to start the match with the current players"
 msgstr ""
-"Aperte ^1Iniciar Partida^7 para iniciar a partida com os jogadores atuais"
+"Aperte ^1Iniciar partida^7 para iniciar a partida com os jogadores atuais"
 
 #: qcsrc/common/minigames/minigame/pong.qc:674
 msgid "Start Match"
-msgstr "Iniciar Partida"
+msgstr "Iniciar partida"
 
 #: qcsrc/common/minigames/minigame/pong.qc:675
 msgid "Add AI player"
@@ -1699,7 +1701,7 @@ msgstr "Remover bot"
 
 #: qcsrc/common/minigames/minigame/pp.qc:2
 msgid "Push-Pull"
-msgstr ""
+msgstr "Empurrar e Puxar"
 
 #: qcsrc/common/minigames/minigame/pp.qc:443
 #: qcsrc/common/minigames/minigame/ttt.qc:324
@@ -1726,15 +1728,15 @@ msgstr "Próxima partida"
 
 #: qcsrc/common/minigames/minigame/ps.qc:2
 msgid "Peg Solitaire"
-msgstr ""
+msgstr "Resta Um"
 
 #: qcsrc/common/minigames/minigame/ps.qc:414
 msgid "All pieces cleared!"
-msgstr ""
+msgstr "Todas as peças removidas!"
 
 #: qcsrc/common/minigames/minigame/ps.qc:416
 msgid "Remaining pieces:"
-msgstr ""
+msgstr "Peças restantes:"
 
 #: qcsrc/common/minigames/minigame/ps.qc:481
 #, c-format
@@ -1755,11 +1757,11 @@ msgstr "Faça uma peça saltar sobre outra para capturá-la"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:2
 msgid "Tic Tac Toe"
-msgstr ""
+msgstr "Jogo-da-velha"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:665
 msgid "Single Player"
-msgstr "Um Jogador"
+msgstr "Um jogador"
 
 #: qcsrc/common/monsters/monster/mage.qh:17
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:18
@@ -1768,7 +1770,7 @@ msgstr "Mago"
 
 #: qcsrc/common/monsters/monster/mage.qh:29
 msgid "Mage spike"
-msgstr "Prego de mago"
+msgstr "Espinho de mago"
 
 #: qcsrc/common/monsters/monster/shambler.qh:17
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:17
@@ -1976,7 +1978,7 @@ msgstr "Escopeta Suprema"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:3
 msgid "Waypoint"
-msgstr "Ponto de passagem"
+msgstr "Ponto de interesse"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:4
 msgid "Help me!"
@@ -4353,7 +4355,7 @@ msgstr "^F4Pausa acabará em ^COUNT"
 
 #: qcsrc/common/notifications/all.inc:786
 msgid "^K1Cannot join given minigame session!"
-msgstr "^K1Não foi possível entrar na sessão de mini jogo fornecida!"
+msgstr "^K1Não foi possível entrar nesta sessão de minijogo!"
 
 #: qcsrc/common/notifications/all.inc:788
 #, c-format
@@ -4914,27 +4916,27 @@ msgstr "SCROLLOCK"
 
 #: qcsrc/common/util.qc:1486
 msgid "SEMICOLON"
-msgstr ""
+msgstr "PONTO-E-VÍRGULA"
 
 #: qcsrc/common/util.qc:1487
 msgid "TILDE"
-msgstr ""
+msgstr "TIL"
 
 #: qcsrc/common/util.qc:1488
 msgid "BACKQUOTE"
-msgstr ""
+msgstr "APÓSTROFO"
 
 #: qcsrc/common/util.qc:1489
 msgid "QUOTE"
-msgstr ""
+msgstr "ASPAS"
 
 #: qcsrc/common/util.qc:1490
 msgid "APOSTROPHE"
-msgstr ""
+msgstr "~"
 
 #: qcsrc/common/util.qc:1491
 msgid "BACKSLASH"
-msgstr ""
+msgstr "BARRAINVERTIDA"
 
 #: qcsrc/common/util.qc:1499
 #, c-format
@@ -4944,7 +4946,7 @@ msgstr "F%d"
 #: qcsrc/common/util.qc:1509
 #, c-format
 msgid "KP_%d"
-msgstr ""
+msgstr "TN_%d"
 
 #: qcsrc/common/util.qc:1514 qcsrc/common/util.qc:1515
 #: qcsrc/common/util.qc:1516 qcsrc/common/util.qc:1517
@@ -4957,7 +4959,7 @@ msgstr ""
 #: qcsrc/common/util.qc:1530 qcsrc/common/util.qc:1531
 #, c-format
 msgid "KP_%s"
-msgstr ""
+msgstr "TN_%s"
 
 #: qcsrc/common/util.qc:1523
 #, c-format
@@ -4967,32 +4969,32 @@ msgstr "PONTO"
 #: qcsrc/common/util.qc:1525
 #, c-format
 msgid "DIVIDE"
-msgstr ""
+msgstr "DIVIDIR"
 
 #: qcsrc/common/util.qc:1526
 #, c-format
 msgid "SLASH"
-msgstr ""
+msgstr "BARRA"
 
 #: qcsrc/common/util.qc:1527
 #, c-format
 msgid "MULTIPLY"
-msgstr ""
+msgstr "MULTIPLICAR"
 
 #: qcsrc/common/util.qc:1528
 #, c-format
 msgid "MINUS"
-msgstr ""
+msgstr "MENOS"
 
 #: qcsrc/common/util.qc:1529
 #, c-format
 msgid "PLUS"
-msgstr ""
+msgstr "MAIS"
 
 #: qcsrc/common/util.qc:1531
 #, c-format
 msgid "EQUALS"
-msgstr ""
+msgstr "IGUAL"
 
 #: qcsrc/common/util.qc:1536
 msgid "PRINTSCREEN"
@@ -5014,17 +5016,17 @@ msgstr "RODAPARABAIXO"
 #: qcsrc/common/util.qc:1545
 #, c-format
 msgid "JOY%d"
-msgstr ""
+msgstr "JOY%d"
 
 #: qcsrc/common/util.qc:1548
 #, c-format
 msgid "AUX%d"
-msgstr ""
+msgstr "AUX%d"
 
 #: qcsrc/common/util.qc:1555
 #, c-format
 msgid "DPAD_UP"
-msgstr ""
+msgstr "DIRECIONAL_CIMA"
 
 #: qcsrc/common/util.qc:1555 qcsrc/common/util.qc:1556
 #: qcsrc/common/util.qc:1557 qcsrc/common/util.qc:1558
@@ -5043,17 +5045,17 @@ msgstr "X360_%s"
 #: qcsrc/common/util.qc:1556
 #, c-format
 msgid "DPAD_DOWN"
-msgstr ""
+msgstr "DIRECIONAL_BAIXO"
 
 #: qcsrc/common/util.qc:1557
 #, c-format
 msgid "DPAD_LEFT"
-msgstr ""
+msgstr "DIRECIONAL_ESQUERDA"
 
 #: qcsrc/common/util.qc:1558
 #, c-format
 msgid "DPAD_RIGHT"
-msgstr ""
+msgstr "DIRECIONAL_DIREITA"
 
 #: qcsrc/common/util.qc:1559
 #, c-format
@@ -5068,22 +5070,22 @@ msgstr "BACK"
 #: qcsrc/common/util.qc:1561
 #, c-format
 msgid "LEFT_THUMB"
-msgstr ""
+msgstr "ANALÓGICO_ESQUERDO"
 
 #: qcsrc/common/util.qc:1562
 #, c-format
 msgid "RIGHT_THUMB"
-msgstr ""
+msgstr "ANALÓGICO_DIREITO"
 
 #: qcsrc/common/util.qc:1563
 #, c-format
 msgid "LEFT_SHOULDER"
-msgstr ""
+msgstr "SUPERIOR_ESQUERDO"
 
 #: qcsrc/common/util.qc:1564
 #, c-format
 msgid "RIGHT_SHOULDER"
-msgstr ""
+msgstr "SUPERIOR_DIREITO"
 
 #: qcsrc/common/util.qc:1565
 #, c-format
@@ -5098,48 +5100,48 @@ msgstr "GATILHO_DIREITO"
 #: qcsrc/common/util.qc:1567
 #, c-format
 msgid "LEFT_THUMB_UP"
-msgstr ""
+msgstr "ANALÓGICO_ESQUERDO_CIMA"
 
 #: qcsrc/common/util.qc:1568
 #, c-format
 msgid "LEFT_THUMB_DOWN"
-msgstr ""
+msgstr "ANALÓGICO_ESQUERDO_BAIXO"
 
 #: qcsrc/common/util.qc:1569
 #, c-format
 msgid "LEFT_THUMB_LEFT"
-msgstr ""
+msgstr "ANALÓGICO_ESQUERDO_ESQUERDA"
 
 #: qcsrc/common/util.qc:1570
 #, c-format
 msgid "LEFT_THUMB_RIGHT"
-msgstr ""
+msgstr "ANALÓGICO_ESQUERDO_DIREITA"
 
 #: qcsrc/common/util.qc:1571
 #, c-format
 msgid "RIGHT_THUMB_UP"
-msgstr ""
+msgstr "ANALÓGICO_DIREITO_CIMA"
 
 #: qcsrc/common/util.qc:1572
 #, c-format
 msgid "RIGHT_THUMB_DOWN"
-msgstr ""
+msgstr "ANALÓGICO_DIREITO_BAIXO"
 
 #: qcsrc/common/util.qc:1573
 #, c-format
 msgid "RIGHT_THUMB_LEFT"
-msgstr ""
+msgstr "ANALÓGICO_DIREITO_ESQUERDA"
 
 #: qcsrc/common/util.qc:1574
 #, c-format
 msgid "RIGHT_THUMB_RIGHT"
-msgstr ""
+msgstr "ANALÓGICO_DIREITO_DIREITA"
 
 #: qcsrc/common/util.qc:1584 qcsrc/common/util.qc:1585
 #: qcsrc/common/util.qc:1586 qcsrc/common/util.qc:1587
 #, c-format
 msgid "JOY_%s"
-msgstr ""
+msgstr "JOY_%s"
 
 #: qcsrc/common/util.qc:1584
 #, c-format
@@ -5164,7 +5166,7 @@ msgstr "DIREITA"
 #: qcsrc/common/util.qc:1593
 #, c-format
 msgid "MIDINOTE%d"
-msgstr ""
+msgstr "MIDINOTE%d"
 
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
 #, c-format
@@ -6992,11 +6994,11 @@ msgid ""
 "to find some or if he fails to do so, face death. The secondary fire mode "
 "does not inflict any damage but is good for doing trickjumps."
 msgstr ""
-"Os jogadores terão uma arma, a qual pode instantaneamente matar o oponente "
-"com um único disparo. Se o jogador ficar sem munição, ele terá 10 segundos "
-"para encontrar alguma e se não conseguir fazer isso, irá morrer. O modo de "
-"disparo secundário não causa nenhum dano, mas é útil para executar truques "
-"de movimento."
+"Os jogadores terão uma arma que pode instantaneamente matar o oponente com "
+"um único disparo. Se o jogador ficar sem munição, ele terá 10 segundos para "
+"encontrar alguma e, se não conseguir fazer isso, morrerá. O modo de disparo "
+"secundário não causa nenhum dano, mas é útil para executar truques de "
+"movimento."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:284
 msgid ""
@@ -7005,8 +7007,8 @@ msgid ""
 "switch to another weapon."
 msgstr ""
 "Sem itens Xonotic - em vez de pegar itens espalhados pelo mapa, todo mundo "
-"joga com a mesma arma. Depois de um certo tempo, uma contagem regressiva irá "
-"iniciar, e depois disso todos irão trocar para uma outra arma."
+"joga com a mesma arma. Após um certo tempo, inciará uma contagem regressiva "
+"e, depois disso, todos trocarão para outra arma."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:288
 msgid "with blaster"
@@ -7038,7 +7040,7 @@ msgstr "Cheio"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:48
 msgid "Show full servers that have no slots available"
-msgstr "Exibir servidores cheios que não contêm vagas disponíveis"
+msgstr "Exibir servidores cheios que não têm vagas disponíveis"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:52
 msgid "Pause"
@@ -7357,7 +7359,7 @@ msgstr "Idioma"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:153
 msgid "Select language..."
-msgstr ""
+msgstr "Selecione um idioma..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:169
 msgid "Gender:"
@@ -8283,22 +8285,25 @@ msgid ""
 "Team size position: Off=do not show; Left=on the left side of the scoreboard "
 "and move team scores to the right; Right=on the right of the scoreboard"
 msgstr ""
+"Posição do tamanho da equipe: Desativado = não exibir; Esquerda = no lado "
+"esquerdo do placar e move as pontuações da equipe para a direita; Direita = "
+"no lado direito do placar"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
 msgid "Waypoints"
-msgstr "Caminhos"
+msgstr "Pontos de interesse"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
 msgid "Display waypoint markers for objectives on the map"
-msgstr "Mostra os marcadores de caminhos para objetivos no mapa"
+msgstr "Exibe os marcadores de ponto de interesse para objetivos no mapa"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
 msgid "Show various gametype specific waypoints"
-msgstr "Mostra diversos caminhos específicos de modos de jogo"
+msgstr "Exibe diversos pontos de interesse específicos de modos de jogo"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
 msgid "Control transparency of the waypoints"
-msgstr "Transparência dos caminhos"
+msgstr "Transparência dos pontos de interesse"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
index 366872553446781e21cbb0ce528df9894f889cb9..3de3a224b3ebdcf03b423656c72bf879ecd3dbe1 100644 (file)
@@ -6,6 +6,7 @@
 # Adrian-Ciprian Tînjală <adrian.tinjala@gmail.com>, 2015-2016
 # busterdbk <busterdbk@gmail.com>, 2013
 # busterdbk <busterdbk@gmail.com>, 2013
+# Cuzenco Andrei Robert <cuzencoandreirobert2008@gmail.com>, 2019
 # MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>, 2011
 # Sorin Botirla <sorin.botirla@gmail.com>, 2015
 # Tudor Ionel <tropiko.matrox@gmail.com>, 2015
@@ -14,8 +15,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-07-02 21:28+0000\n"
+"Last-Translator: Cuzenco Andrei Robert <cuzencoandreirobert2008@gmail.com>\n"
 "Language-Team: Romanian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ro/)\n"
 "Language: ro\n"
@@ -29,16 +30,19 @@ msgstr ""
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
 msgstr ""
+"^2Exportat cu succes către %s! (Notă: Fisierul este salvat in data/data)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
 msgid "^1Couldn't write to %s"
-msgstr ""
+msgstr "^1Nu s-a putut scrie către %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
 msgstr ""
+"^3Mesajul cu numărătoare inversă este la %s, mai sunt doar ^COUNT secunde "
+"ramase."
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -46,15 +50,17 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Mesaj pe mai multe linii la %s care\n"
+"^1durează mai mult decât de obicei"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Mesaj la %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "Mesaj generic"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -82,7 +88,7 @@ msgstr "^1Apasă ^3%s^1 pentru a deveni spectator"
 #: qcsrc/client/hud/panel/infomessages.qc:102
 #: qcsrc/menu/xonotic/keybinder.qc:47
 msgid "primary fire"
-msgstr ""
+msgstr "Mod principal de tragere"
 
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #, c-format
@@ -92,12 +98,12 @@ msgstr "^1Apasă ^3%s^1 sau ^3%s^1 pentru jucătorul următor sau precedent"
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #: qcsrc/client/hud/panel/infomessages.qc:108
 msgid "next weapon"
-msgstr ""
+msgstr "Următoarea armă"
 
 #: qcsrc/client/hud/panel/infomessages.qc:104
 #: qcsrc/client/hud/panel/infomessages.qc:108
 msgid "previous weapon"
-msgstr ""
+msgstr "Anterioara armă"
 
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #, c-format
@@ -108,16 +114,17 @@ msgstr "^1Folosiți ^3%s^1 sau ^3%s^1 pentru a schimba viteza"
 #, c-format
 msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
 msgstr ""
+"^1Apasă ^3%s^1 pentru a observa, ^3%s^1 pentru a schimba in modul camera"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
 msgid "drop weapon"
-msgstr ""
+msgstr "Aruncă arma"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/menu/xonotic/keybinder.qc:48
 msgid "secondary fire"
-msgstr ""
+msgstr "Mod secundar de tragere"
 
 #: qcsrc/client/hud/panel/infomessages.qc:113
 #, c-format
@@ -127,7 +134,7 @@ msgstr "^1Apasă ^3%s^1 pentru informații despre modul de joc"
 #: qcsrc/client/hud/panel/infomessages.qc:113
 #: qcsrc/menu/xonotic/keybinder.qc:105
 msgid "server info"
-msgstr ""
+msgstr "Informații despre server"
 
 #: qcsrc/client/hud/panel/infomessages.qc:126
 msgid "^1Match has already begun"
@@ -146,7 +153,7 @@ msgstr "^1Apasă ^3%s^1 pentru a te alătura jocului"
 #: qcsrc/client/hud/panel/infomessages.qc:130
 #: qcsrc/client/hud/panel/infomessages.qc:133
 msgid "jump"
-msgstr ""
+msgstr "Sari"
 
 #: qcsrc/client/hud/panel/infomessages.qc:141
 #, c-format
@@ -167,7 +174,7 @@ msgstr "%sApasă ^3%s%s pentru a înceta încălzirea"
 #: qcsrc/client/hud/panel/infomessages.qc:177
 #: qcsrc/menu/xonotic/keybinder.qc:101
 msgid "ready"
-msgstr ""
+msgstr "Pregătit"
 
 #: qcsrc/client/hud/panel/infomessages.qc:164
 #, c-format
@@ -201,15 +208,15 @@ msgstr "Apasă ^3%s%s pentru a ajusta"
 #: qcsrc/client/hud/panel/infomessages.qc:201
 #: qcsrc/menu/xonotic/keybinder.qc:117
 msgid "team menu"
-msgstr ""
+msgstr "Meniul echipei"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1Urmărește acest jucător:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:211
 msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1Te urmărește pe tine:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:227
 msgid "^7Press ^3ESC ^7to show HUD options."
@@ -259,7 +266,7 @@ msgstr "Continuă..."
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr ""
+msgstr "Convorbire"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
index d8fbf327de2d0946b78940123def9d662f3097ec..80089d0c8d7a94ef7080b9adea7d458bb30c3a37 100644 (file)
@@ -19,7 +19,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 08:17+0000\n"
+"PO-Revision-Date: 2019-06-24 06:22+0000\n"
 "Last-Translator: Andrei Stepanov <adem4ik@gmail.com>\n"
 "Language-Team: Russian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ru/)\n"
@@ -923,7 +923,7 @@ msgid ""
 "^2scoreboard_columns_set ^7without arguments reads the arguments from the "
 "cvar scoreboard_columns"
 msgstr ""
-"^2scoreboard_columns_set ^7 без аргументов считывает конфигурацию из cvar'а "
+"^2scoreboard_columns_set ^7без аргументов считывает значение из переменной "
 "scoreboard_columns"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:317
@@ -5594,7 +5594,7 @@ msgstr "Компилятор"
 
 #: qcsrc/menu/xonotic/credits.qc:142
 msgid "Other Active Contributors"
-msgstr "Ð\94Ñ\80Ñ\83гие Ð°ÐºÑ\82ивнÑ\8bе Ñ\81оÑ\83Ñ\87аÑ\81Ñ\82ники"
+msgstr "Другие активные участники"
 
 #: qcsrc/menu/xonotic/credits.qc:149
 msgid "Translators"
@@ -6534,7 +6534,7 @@ msgstr "Игра по сети"
 msgid ""
 "Play online, against your friends in LAN, view demos or change player "
 "settings"
-msgstr "Играть по сети, посмотреть демки или изменить настройки игрока"
+msgstr "Играть по сети, смотреть демки или изменить настройки игрока"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:111
@@ -7051,7 +7051,7 @@ msgstr "Присоединиться!"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:114
 #: qcsrc/menu/xonotic/serverlist.qc:1044
 msgid "MOD^Default"
-msgstr "MOD^Ð\9fо Ñ\83молÑ\87аниÑ\8e"
+msgstr "MOD^СÑ\82андаÑ\80Ñ\82нÑ\8bй"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
 #, c-format
@@ -7104,7 +7104,8 @@ msgstr "Требуется (будет шифрование)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
 msgid "Use the `crypto_aeslevel` cvar to change your preferences"
-msgstr "Используйте cvar \"crypto_aeslevel\" для изменения настроек"
+msgstr ""
+"Используйте переменную \"crypto_aeslevel\" для изменения ваших настроек"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
 msgid "Hostname:"
@@ -7307,7 +7308,7 @@ msgstr "Статистика"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:129
 msgid "Allow player statistics to track your client"
-msgstr "Разрешить статистке отслеживать клиента"
+msgstr "РазÑ\80еÑ\88иÑ\82Ñ\8c Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ике Ð¾Ñ\82Ñ\81леживаÑ\82Ñ\8c ÐºÐ»Ð¸ÐµÐ½Ñ\82а"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:133
 msgid "Allow player statistics to use your nickname"
@@ -7319,7 +7320,7 @@ msgstr "Страна"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:153
 msgid "Select language..."
-msgstr "Выберите язык..."
+msgstr "Выбрать язык..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:169
 msgid "Gender:"
@@ -8233,7 +8234,7 @@ msgstr "Показывать точность под таблицей резул
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
 msgid "Show team sizes:"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80азмеры команд:"
+msgstr "Размеры команд:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:56
 msgid ""
@@ -8405,7 +8406,7 @@ msgstr "Добавлять расширенную информацию о фра
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:62
 msgid "Add frag location to death messages when available"
-msgstr "Указывать место фрага в сообщения о смерти, если возможно"
+msgstr "Указывать место фрага в сообщениях о смерти по возможности"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
 msgid "Gamemode Settings"
@@ -8516,7 +8517,7 @@ msgstr "Применять мою модель к игрокам"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
 msgid "Force player colors to mine"
-msgstr "Применять мои цвета к игрокам"
+msgstr "Применять мои цвета"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
 msgid "In non teamplay modes only"
@@ -8948,7 +8949,7 @@ msgstr "Компенсация ошибок движения"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:82
 msgid "Use encryption (AES) when available"
-msgstr "Использовать шифрование (AES), если возможно"
+msgstr "Использовать шифрование AES по возможности"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:85
 msgid "Framerate"
@@ -9252,7 +9253,7 @@ msgstr "Высококачественный буфер кадров"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:97
 msgid "Depth first:"
-msgstr "СнаÑ\87ала Ð³Ð»Ñ\83бина:"
+msgstr "Ð\91Ñ\83Ñ\84еÑ\80 Ð³Ð»Ñ\83бин:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:99
 msgid ""
@@ -9772,7 +9773,7 @@ msgstr "Спортивный режим"
 
 #: qcsrc/menu/xonotic/serverlist.qh:157
 msgid "SLCAT^Modified Servers"
-msgstr "Модифицированные:"
+msgstr "Модифицированные"
 
 #: qcsrc/menu/xonotic/serverlist.qh:158
 msgid "SLCAT^Overkill"
index 02e5bcd2f5f5cc6ce186a41aa7dc55f30dac9b53..3d4fd1dd3b66d5ce13a6c4b51591663e3d16f1c3 100644 (file)
@@ -7,14 +7,15 @@
 # Pendulla <djdjoric@gmail.com>, 2014
 # Ristovski <rafael.ristovski@gmail.com>, 2014
 # Ristovski <rafael.ristovski@gmail.com>, 2014
-# Марко М. Костић (Marko M. Kostić) <marko.m.kostic@gmail.com>, 2017
+# Марко М. Костић (Marko M. Kostić) <marko.m.kostic@gmail.com>, 2017,2019
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-06-14 17:28+0000\n"
+"Last-Translator: Марко М. Костић (Marko M. Kostić) <marko.m.kostic@gmail."
+"com>\n"
 "Language-Team: Serbian (http://www.transifex.com/team-xonotic/xonotic/"
 "language/sr/)\n"
 "Language: sr\n"
@@ -27,17 +28,17 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:243
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr ""
+msgstr "^2Успешно извезено у %s! (напомена: сачувано у путањи data/data/)"
 
 #: qcsrc/client/hud/hud_config.qc:247
 #, c-format
 msgid "^1Couldn't write to %s"
-msgstr ""
+msgstr "^1Нисам могао да упишем у %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3Порука одбројавања у тренутку %s, преостало секунди: ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -45,15 +46,17 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Вишелинијска порука у тренутку %s која\n"
+"^1траје дуже од уобичајеног"
 
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Порука у тренутку %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "Општа порука"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -256,11 +259,11 @@ msgstr "Настави..."
 #: qcsrc/client/hud/panel/quickmenu.qc:781
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "Chat"
-msgstr ""
+msgstr "Ћаскање"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:782
 msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^Пошаљи јавну поруку ка"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:783
 msgid "QMCMD^:-) / nice one"
@@ -284,7 +287,7 @@ msgstr "QMCMD^здраво / срећно и нека ти буде забавн
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 msgid "QMCMD^Send in English"
-msgstr ""
+msgstr "QMCMD^Пошаљи на енглеском"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:792
 #: qcsrc/client/hud/panel/quickmenu.qc:808
@@ -293,7 +296,7 @@ msgstr "QMCMD^Екипно ћаскање"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
-msgstr ""
+msgstr "QMCMD^четвороструко ускоро"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item %x^7 (l:%y^7)"
@@ -305,7 +308,7 @@ msgstr "QMCMD^бесплатна ствар, иконица"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^узео ствар (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item, icon"
@@ -548,23 +551,23 @@ msgstr "Просек %d"
 #: qcsrc/client/hud/panel/racetimer.qc:262
 #, c-format
 msgid "PENALTY: %.1f (%s)"
-msgstr ""
+msgstr "КАЗНА: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:154 qcsrc/client/main.qc:1129
 msgid "missing a checkpoint"
-msgstr ""
+msgstr "промашили сте контролну тачку"
 
 #: qcsrc/client/hud/panel/radar.qc:373
 msgid "Click to select teleport destination"
-msgstr ""
+msgstr "Кликните за одабир одредишта телепорта"
 
 #: qcsrc/client/hud/panel/radar.qc:377
 msgid "Click to select spawn location"
-msgstr ""
+msgstr "Кликните за одабир одредишта стварања"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "Number of ball carrier kills"
-msgstr ""
+msgstr "Број убијених носилаца лопте"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:87
 msgid "SCO^bckills"
@@ -576,7 +579,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:88
 msgid "Total amount of time holding the ball in Keepaway"
-msgstr ""
+msgstr "Укупна количина времена у ком сте држали лопту у Keepaway-у"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:89
 msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
@@ -592,11 +595,11 @@ msgstr "SCO^време освајања"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:90
 msgid "Time of fastest capture (CTF)"
-msgstr ""
+msgstr "Време најбржег заробљавања (ЗЗ)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "Number of deaths"
-msgstr ""
+msgstr "Број смрти"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:91
 msgid "SCO^deaths"
@@ -604,7 +607,7 @@ msgstr "SCO^смрти"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "Number of keys destroyed by pushing them into void"
-msgstr ""
+msgstr "Број кључева уништених гурањем у ништавило"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:92
 msgid "SCO^destroyed"
@@ -616,7 +619,7 @@ msgstr "SCO^штета"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:93
 msgid "The total damage done"
-msgstr ""
+msgstr "Укупно начињене штете"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "SCO^dmgtaken"
@@ -624,11 +627,11 @@ msgstr "SCO^примљено штете"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:94
 msgid "The total damage taken"
-msgstr ""
+msgstr "Укупно примљене штете"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "Number of flag drops"
-msgstr ""
+msgstr "Број испуштених застава"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:95
 msgid "SCO^drops"
@@ -668,15 +671,15 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "FPS"
-msgstr ""
+msgstr "КПС"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:100
 msgid "SCO^fps"
-msgstr ""
+msgstr "SCO^кпс"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "Number of kills minus suicides"
-msgstr ""
+msgstr "Број убистава без самоубистава"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:101
 msgid "SCO^frags"
@@ -684,7 +687,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "Number of goals scored"
-msgstr ""
+msgstr "Број постигнутих голова"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:102
 msgid "SCO^goals"
@@ -692,7 +695,7 @@ msgstr "SCO^циљева"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "Number of keys carrier kills"
-msgstr ""
+msgstr "Број убијених носилаца кључева"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:103
 msgid "SCO^kckills"
@@ -718,7 +721,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "Number of kills"
-msgstr ""
+msgstr "Број убистава"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^kills"
@@ -742,7 +745,7 @@ msgstr "SCO^живота"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of times a key was lost"
-msgstr ""
+msgstr "Број губљења кључева"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "SCO^losses"
@@ -751,7 +754,7 @@ msgstr "SCO^губитака"
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "Player name"
-msgstr ""
+msgstr "Име играча"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "SCO^name"
@@ -763,7 +766,7 @@ msgstr "SCO^надимак"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of objectives destroyed"
-msgstr ""
+msgstr "Број уништених циљева"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^objectives"
@@ -780,7 +783,7 @@ msgstr "SCO^купљења"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "Ping time"
-msgstr ""
+msgstr "Време пинга"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "SCO^ping"
@@ -788,7 +791,7 @@ msgstr "SCO^пинг"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "Packet loss"
-msgstr ""
+msgstr "Губитак пакета"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "SCO^pl"
@@ -796,7 +799,7 @@ msgstr "SCO^гп"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of players pushed into void"
-msgstr ""
+msgstr "Број играча гурнутих у ништавило"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^pushes"
@@ -804,7 +807,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "Player rank"
-msgstr ""
+msgstr "Ранг играча"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "SCO^rank"
@@ -812,7 +815,7 @@ msgstr "SCO^ранг"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of flag returns"
-msgstr ""
+msgstr "Број враћања заставе"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "SCO^returns"
@@ -820,7 +823,7 @@ msgstr "SCO^враћања"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "Number of revivals"
-msgstr ""
+msgstr "Број оживљавања"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "SCO^revivals"
@@ -828,7 +831,7 @@ msgstr "SCO^оживљавања"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of rounds won"
-msgstr ""
+msgstr "Број побеђених рунди"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^rounds won"
@@ -840,11 +843,11 @@ msgstr "SCO^резултат"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "Total score"
-msgstr ""
+msgstr "Укупни резултат"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "Number of suicides"
-msgstr ""
+msgstr "Број самоубистава"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^suicides"
@@ -852,15 +855,15 @@ msgstr "SCO^самоубистава"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "Number of kills minus deaths"
-msgstr ""
+msgstr "Број убистава без смрти"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^sum"
-msgstr "SCO^Ñ\81воÑ\82а"
+msgstr "SCO^Ñ\83кÑ\83пно"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of domination points taken (Domination)"
-msgstr ""
+msgstr "Број узетих поена доминације (Доминација)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^takes"
@@ -868,11 +871,11 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of teamkills"
-msgstr ""
+msgstr "Број убијених саиграча"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^teamkills"
-msgstr ""
+msgstr "SCO^убистава саиграча"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "Number of ticks (Domination)"
@@ -897,7 +900,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:313
 msgid "Usage:"
-msgstr ""
+msgstr "Начин употребе:"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:315
 msgid "^2scoreboard_columns_set ^3field1 field2 ..."
@@ -999,7 +1002,7 @@ msgstr "Рангови"
 #: qcsrc/client/hud/panel/scoreboard.qc:1613
 #, c-format
 msgid "^3%1.0f minutes"
-msgstr ""
+msgstr "^3%1.0f минута"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1622
 #: qcsrc/client/hud/panel/scoreboard.qc:1629
@@ -1030,7 +1033,7 @@ msgstr ""
 #: qcsrc/client/hud/panel/scoreboard.qc:1659
 #, c-format
 msgid "^7Map: ^2%s"
-msgstr ""
+msgstr "^7Мапа: ^2%s"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1798
 #, c-format
@@ -1064,7 +1067,7 @@ msgstr "Мртви сте, притисните ^2%s^7 да бисте се ож
 
 #: qcsrc/client/hud/panel/timer.qc:67
 msgid "WARMUP"
-msgstr ""
+msgstr "ЗАГРЕЈАВАЊЕ"
 
 #: qcsrc/client/hud/panel/vote.qc:27
 msgid "^1You must answer before entering hud configure mode"
@@ -1181,7 +1184,7 @@ msgstr ""
 
 #: qcsrc/client/mapvoting.qc:524
 msgid "Requesting preview..."
-msgstr ""
+msgstr "Тражим претпреглед…"
 
 #: qcsrc/client/miscfunctions.qc:111
 msgid "Trying to remove a team which is not in the teamlist!"
@@ -1233,11 +1236,11 @@ msgstr ""
 
 #: qcsrc/common/items/item/armor.qh:42
 msgid "Small armor"
-msgstr ""
+msgstr "Мали оклоп"
 
 #: qcsrc/common/items/item/armor.qh:80
 msgid "Medium armor"
-msgstr ""
+msgstr "Средњи оклоп"
 
 #: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
 msgid "Big armor"
@@ -1249,11 +1252,11 @@ msgstr "Мега оклоп"
 
 #: qcsrc/common/items/item/health.qh:42
 msgid "Small health"
-msgstr ""
+msgstr "Мало здравље"
 
 #: qcsrc/common/items/item/health.qh:80
 msgid "Medium health"
-msgstr ""
+msgstr "Средње здравље"
 
 #: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
 msgid "Big health"
@@ -1529,11 +1532,11 @@ msgstr ""
 #: qcsrc/common/minigames/minigame/ps.qc:421
 #: qcsrc/common/minigames/minigame/ps.qc:427
 msgid "Game over!"
-msgstr ""
+msgstr "Игра је завршена!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr ""
+msgstr "Добро обављен посао! Кликните на „Следећи ниво“ за наставак"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
@@ -5275,12 +5278,12 @@ msgstr ""
 #: qcsrc/lib/counting.qh:46
 #, c-format
 msgid "CI_DEC^%s minutes"
-msgstr ""
+msgstr "CI_DEC^%s минута"
 
 #: qcsrc/lib/counting.qh:49
 #, c-format
 msgid "CI_ZER^%d minutes"
-msgstr ""
+msgstr "CI_ZER^%d минута"
 
 #: qcsrc/lib/counting.qh:50
 #, c-format
@@ -5290,17 +5293,17 @@ msgstr ""
 #: qcsrc/lib/counting.qh:51
 #, c-format
 msgid "CI_SEC^%d minutes"
-msgstr ""
+msgstr "CI_SEC^%d минута"
 
 #: qcsrc/lib/counting.qh:52
 #, c-format
 msgid "CI_THI^%d minutes"
-msgstr ""
+msgstr "CI_THI^%d минута"
 
 #: qcsrc/lib/counting.qh:53
 #, c-format
 msgid "CI_MUL^%d minutes"
-msgstr ""
+msgstr "CI_MUL^%d минута"
 
 #: qcsrc/lib/counting.qh:55
 #, c-format
@@ -9740,7 +9743,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/statslist.qc:117 qcsrc/menu/xonotic/statslist.qc:230
 msgid "Favorite map:"
-msgstr ""
+msgstr "Омиљена мапа:"
 
 #: qcsrc/menu/xonotic/statslist.qc:149 qcsrc/menu/xonotic/statslist.qc:201
 #: qcsrc/menu/xonotic/statslist.qc:244
index fc40963c100267ad9dc3b09fda4dd260825bb9f5..5ba567a63fedb25c537293359e63654ae0a02e64 100644 (file)
@@ -7,6 +7,7 @@
 # Antoni Das <Antonidas159@gmail.com>, 2015,2017
 # sapphireliu <balancedliu@gmail.com>, 2014
 # kalawore <kalawore@outlook.com>, 2015
+# Liang Liu <dxkliu@126.com>, 2019
 # Losier Blackheath <losier.cc@gmail.com>, 2018
 # sapphireliu <balancedliu@gmail.com>, 2014
 # 杜茂森 <dumaosen_main01@outlook.com>, 2018-2019
@@ -17,8 +18,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-05-19 07:23+0200\n"
-"PO-Revision-Date: 2019-05-19 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2019-07-30 05:15+0000\n"
+"Last-Translator: 杜茂森 <dumaosen_main01@outlook.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.com/team-xonotic/"
 "xonotic/language/zh_CN/)\n"
 "Language: zh_CN\n"
@@ -40,7 +41,7 @@ msgstr "无法将^1写入到 %s"
 #: qcsrc/client/hud/panel/centerprint.qc:140
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3倒计时时间 %s, 剩余秒数: ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:142
 #, c-format
@@ -52,11 +53,11 @@ msgstr ""
 #: qcsrc/client/hud/panel/centerprint.qc:144
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "消息显示时长 %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:149
 msgid "Generic message"
-msgstr ""
+msgstr "基本消息"
 
 #: qcsrc/client/hud/panel/chat.qc:84
 msgid "^3Player^7: This is the chat area."
@@ -296,15 +297,15 @@ msgstr "QMCMD^团队对话"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^quad soon"
-msgstr ""
+msgstr "QMCMD^四倍伤害即将出现"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^免费物品 %x^7 (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "QMCMD^free item, icon"
-msgstr ""
+msgstr "QMCMD^免费物品, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item (l:%l^7)"
@@ -312,7 +313,7 @@ msgstr "QMCMD^捡起物品 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:795
 msgid "QMCMD^took item, icon"
-msgstr ""
+msgstr "QMCMD^物品已取走, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:796
 msgid "QMCMD^negative"
@@ -348,27 +349,27 @@ msgstr "QMCMD^找到旗帜, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^防守中 (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^defending, icon"
-msgstr ""
+msgstr "QMCMD^防守中, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^漫游中 (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^roaming, icon"
-msgstr ""
+msgstr "QMCMD^漫游中, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^攻击中 (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^attacking, icon"
-msgstr ""
+msgstr "QMCMD^攻击中, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier (l:%y^7)"
@@ -376,16 +377,16 @@ msgstr "QMCMD^killed flagcarrier (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^killed flagcarrier, icon"
-msgstr ""
+msgstr "QMCMD^夺旗人已被干掉, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 #, c-format
 msgid "QMCMD^dropped flag (l:%d^7)"
-msgstr ""
+msgstr "QMCMD^已弃旗 (l:%d^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 msgid "QMCMD^dropped flag, icon"
-msgstr ""
+msgstr "QMCMD^已弃旗, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^drop weapon, icon"
@@ -393,11 +394,11 @@ msgstr "QMCMD^掉落武器, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^掉落武器 %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^drop flag/key, icon"
-msgstr ""
+msgstr "QMCMD^掉落旗帜/钥匙, icon"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
index 3073c6475421df7080bf9b22538c058b56441e19..65d3ec630c7f71656015be80bea48402b1a1acc9 100644 (file)
@@ -4,9 +4,10 @@
 #
 # Translators:
 # Arm Coon <armcoon@gmail.com>, 2016-2017
-# Jeff Huang <s8321414@gmail.com>, 2015
+# 黃柏諺 <s8321414@gmail.com>, 2015
 # msn1018927464 <msn1018927464@hotmail.com>, 2015
 # msn1018927464 <msn1018927464@hotmail.com>, 2015
+# 黃柏諺 <s8321414@gmail.com>, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
index b6479dc3537945a7de8c4c1fee332120f147a02c..e03126ce9afba1e93fd1bfc3c3bc21d433bd54d8 100644 (file)
Binary files a/gfx/hud/luma/notify_teamkill_blue.tga and b/gfx/hud/luma/notify_teamkill_blue.tga differ
index c346fa9df19c098e0ef91788205cf7c65a347f55..f0767ec902310d94d9d0c438e251da4f04ce3e00 100644 (file)
Binary files a/gfx/hud/luma/notify_teamkill_neutral.tga and b/gfx/hud/luma/notify_teamkill_neutral.tga differ
index 9b4660c2066a95c7895fb08f65f7ee5f99b88365..c63c4d9d07918a3da20d002c4931de1dd6b1d83d 100644 (file)
Binary files a/gfx/hud/luma/notify_teamkill_pink.tga and b/gfx/hud/luma/notify_teamkill_pink.tga differ
index 367b5522f2716913e1cb145179a0f50e175b3b36..79a491a9249f79f5306590ad8ed10b4cac2c167d 100644 (file)
Binary files a/gfx/hud/luma/notify_teamkill_red.tga and b/gfx/hud/luma/notify_teamkill_red.tga differ
index 772bcaacaca76531cee18a16e63e3f4c93757163..a8e7da89e75a403849a28e606d4e52fbaa9d7311 100644 (file)
Binary files a/gfx/hud/luma/notify_teamkill_yellow.tga and b/gfx/hud/luma/notify_teamkill_yellow.tga differ
index 20e276d19391494e9489ea105c26aba9adab50f7..517d9b9c4dcf4769698436bd34aff141ad5948e4 100644 (file)
Binary files a/gfx/menu/wickedx/background_ingame.tga and b/gfx/menu/wickedx/background_ingame.tga differ
index 20e276d19391494e9489ea105c26aba9adab50f7..517d9b9c4dcf4769698436bd34aff141ad5948e4 100644 (file)
Binary files a/gfx/menu/wickedx/background_l2.tga and b/gfx/menu/wickedx/background_l2.tga differ
index 9b8e393898012831f6689dfe966357efb276fb47..c78ecbd853d164b54320f65fdbacbdc3d91a99fe 100755 (executable)
Binary files a/gfx/menu/wickedx/skinpreview.jpg and b/gfx/menu/wickedx/skinpreview.jpg differ
index 107e3b6457ffb0c6d40dc895513577ae69be1771..0c5c485d4b8f16869666e5bf47d3f9ae27ef2afc 100644 (file)
@@ -3,7 +3,7 @@ de    "German" "Deutsch" 100%
 de_CH "German (Switzerland)" "Deutsch (Schweiz)" 100%
 en    "English" "English" 100%
 en_AU "English (Australia)" "English (Australia)" 76%
-es    "Spanish" "Español" 86%
+es    "Spanish" "Español" 100%
 fr    "French" "Français" 100%
 ga    "Irish" "Irish" 32%
 it    "Italian" "Italiano" 100%
@@ -11,15 +11,15 @@ hu    "Hungarian" "Magyar" 48%
 nl    "Dutch" "Nederlands" 63%
 pl    "Polish" "Polski" 72%
 pt    "Portuguese" "Português" 86%
-pt_BR "Portuguese (Brazil)" "Português (Brasil)" 97%
-ro    "Romanian" "Romana" 74%
+pt_BR "Portuguese (Brazil)" "Português (Brasil)" 100%
+ro    "Romanian" "Romana" 75%
 fi    "Finnish" "Suomi" 30%
-el    "Greek" "Ελληνική" 46%
+el    "Greek" "Ελληνική" 47%
 be    "Belarusian" "Беларуская" 55%
 bg    "Bulgarian" "Български" 60%
 ru    "Russian" "Русский" 100%
-sr    "Serbian" "Српски" 62%
+sr    "Serbian" "Српски" 65%
 uk    "Ukrainian" "Українська" 50%
-zh_CN "Chinese (China)" "中文" 57%
+zh_CN "Chinese (China)" "中文" 58%
 zh_TW "Chinese (Taiwan)" "國語" 62%
 ko    "Korean" "한국의" 30%
index 7e1c0358330e3c9c7abb5b02fb29dcc3c693eb0a..01e3a120a4285698382d3c408ef220b927bf87c8 100644 (file)
@@ -69,6 +69,8 @@ set g_overkill_filter_armormega 0
 //  vampire
 // =========
 set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health"
+set g_vampire_factor 1.0 "Multiply damage done by this factor before adding it to the player's health"
+set g_vampire_use_total_damage 0 "If 1 then add combined damage (health + armor) to attackers health. If 0 add only health damage."
 
 
 // ========
index 9300293408650e62da25f95b5d63ce824e29b098..59ecb04d2386ec64ad765cda87703eccba9550ab 100644 (file)
@@ -268,7 +268,6 @@ bool autocvar_hud_panel_infomessages_flip;
 float autocvar_hud_panel_mapvote_highlight_border = 1;
 bool autocvar_hud_panel_modicons;
 int autocvar_hud_panel_modicons_ca_layout;
-int autocvar_hud_panel_modicons_dom_layout;
 int autocvar_hud_panel_modicons_freezetag_layout;
 bool autocvar_hud_panel_notify;
 float autocvar_hud_panel_notify_fadetime;
index 306bb6f8a316970d229561ad435398f4de58b458..18ec37d47e78f8df34789593c97cc8c4864d21dc 100644 (file)
@@ -9,8 +9,6 @@
 
 // Mod icons (#10)
 
-bool mod_active; // is there any active mod icon?
-
 void DrawCAItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
 {
        TC(int, layout); TC(int, i);
@@ -84,405 +82,6 @@ void HUD_Mod_CA(vector myPos, vector mySize)
        }
 }
 
-// CTF HUD modicon section
-int redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe, neutralflag_prevframe; // status during previous frame
-int redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus, neutralflag_prevstatus; // last remembered status
-float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time, neutralflag_statuschange_time; // time when the status changed
-
-void HUD_Mod_CTF_Reset()
-{
-       redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = neutralflag_prevstatus = 0;
-       redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = neutralflag_prevframe = 0;
-       redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0;
-}
-
-int autocvar__teams_available;
-void HUD_Mod_CTF(vector pos, vector mySize)
-{
-       vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos;
-       vector flag_size;
-       float f; // every function should have that
-
-       int redflag, blueflag, yellowflag, pinkflag, neutralflag; // current status
-       float redflag_statuschange_elapsedtime = 0, blueflag_statuschange_elapsedtime = 0, yellowflag_statuschange_elapsedtime = 0, pinkflag_statuschange_elapsedtime = 0, neutralflag_statuschange_elapsedtime = 0; // time since the status changed
-       bool ctf_oneflag; // one-flag CTF mode enabled/disabled
-       bool ctf_stalemate; // currently in stalemate
-       int stat_items = STAT(CTF_FLAGSTATUS);
-       float fs, fs2, fs3, size1, size2;
-       vector e1, e2;
-
-       int nteams = autocvar__teams_available;
-
-       redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3;
-       blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3;
-       yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3;
-       pinkflag = (stat_items/CTF_PINK_FLAG_TAKEN) & 3;
-       neutralflag = (stat_items/CTF_NEUTRAL_FLAG_TAKEN) & 3;
-
-       ctf_oneflag = (stat_items & CTF_FLAG_NEUTRAL);
-
-       ctf_stalemate = (stat_items & CTF_STALEMATE);
-
-       mod_active = (redflag || blueflag || yellowflag || pinkflag || neutralflag || (stat_items & CTF_SHIELDED));
-
-       if (autocvar__hud_configure) {
-               redflag = 1;
-               blueflag = 2;
-               if (nteams & BIT(2))
-                       yellowflag = 2;
-               if (nteams & BIT(3))
-                       pinkflag = 3;
-               ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor?
-       }
-
-       // when status CHANGES, set old status into prevstatus and current status into status
-       #define X(team) MACRO_BEGIN \
-               if (team##flag != team##flag_prevframe) { \
-                       team##flag_statuschange_time = time; \
-                       team##flag_prevstatus = team##flag_prevframe; \
-                       team##flag_prevframe = team##flag; \
-               } \
-               team##flag_statuschange_elapsedtime = time - team##flag_statuschange_time; \
-       MACRO_END
-       X(red);
-       X(blue);
-       X(yellow);
-       X(pink);
-       X(neutral);
-       #undef X
-
-       const float BLINK_FACTOR = 0.15;
-       const float BLINK_BASE = 0.85;
-       // note:
-       //   RMS = sqrt(BLINK_BASE^2 + 0.5 * BLINK_FACTOR^2)
-       // thus
-       //   BLINK_BASE = sqrt(RMS^2 - 0.5 * BLINK_FACTOR^2)
-       // ensure RMS == 1
-       const float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz
-
-       #define X(team, cond) \
-       string team##_icon = string_null, team##_icon_prevstatus = string_null; \
-       int team##_alpha, team##_alpha_prevstatus; \
-       team##_alpha = team##_alpha_prevstatus = 1; \
-       MACRO_BEGIN \
-               switch (team##flag) { \
-                       case 1: team##_icon = "flag_" #team "_taken"; break; \
-                       case 2: team##_icon = "flag_" #team "_lost"; break; \
-                       case 3: team##_icon = "flag_" #team "_carrying"; team##_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
-                       default: \
-                               if ((stat_items & CTF_SHIELDED) && (cond)) { \
-                                       team##_icon = "flag_" #team "_shielded"; \
-                               } else { \
-                                       team##_icon = string_null; \
-                               } \
-                               break; \
-               } \
-               switch (team##flag_prevstatus) { \
-                       case 1: team##_icon_prevstatus = "flag_" #team "_taken"; break; \
-                       case 2: team##_icon_prevstatus = "flag_" #team "_lost"; break; \
-                       case 3: team##_icon_prevstatus = "flag_" #team "_carrying"; team##_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
-                       default: \
-                               if (team##flag == 3) { \
-                                       team##_icon_prevstatus = "flag_" #team "_carrying"; /* make it more visible */\
-                               } else if((stat_items & CTF_SHIELDED) && (cond)) { \
-                                       team##_icon_prevstatus = "flag_" #team "_shielded"; \
-                               } else { \
-                                       team##_icon_prevstatus = string_null; \
-                               } \
-                               break; \
-               } \
-       MACRO_END
-       X(red, myteam != NUM_TEAM_1 && (nteams & BIT(0)));
-       X(blue, myteam != NUM_TEAM_2 && (nteams & BIT(1)));
-       X(yellow, myteam != NUM_TEAM_3 && (nteams & BIT(2)));
-       X(pink, myteam != NUM_TEAM_4 && (nteams & BIT(3)));
-       X(neutral, ctf_oneflag);
-       #undef X
-
-       int tcount = 2;
-       if(nteams & BIT(2))
-               tcount = 3;
-       if(nteams & BIT(3))
-               tcount = 4;
-
-       if (ctf_oneflag) {
-               // hacky, but these aren't needed
-               red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null;
-               fs = fs2 = fs3 = 1;
-       } else switch (tcount) {
-               default:
-               case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break;
-               case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break;
-               case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break;
-       }
-
-       if (mySize_x > mySize_y) {
-               size1 = mySize_x;
-               size2 = mySize_y;
-               e1 = eX;
-               e2 = eY;
-       } else {
-               size1 = mySize_y;
-               size2 = mySize_x;
-               e1 = eY;
-               e2 = eX;
-       }
-
-       switch (myteam) {
-               default:
-               case NUM_TEAM_1: {
-                       redflag_pos = pos;
-                       blueflag_pos = pos + eX * fs2 * size1;
-                       yellowflag_pos = pos - eX * fs2 * size1;
-                       pinkflag_pos = pos + eX * fs3 * size1;
-                       break;
-               }
-               case NUM_TEAM_2: {
-                       redflag_pos = pos + eX * fs2 * size1;
-                       blueflag_pos = pos;
-                       yellowflag_pos = pos - eX * fs2 * size1;
-                       pinkflag_pos = pos + eX * fs3 * size1;
-                       break;
-               }
-               case NUM_TEAM_3: {
-                       redflag_pos = pos + eX * fs3 * size1;
-                       blueflag_pos = pos - eX * fs2 * size1;
-                       yellowflag_pos = pos;
-                       pinkflag_pos = pos + eX * fs2 * size1;
-                       break;
-               }
-               case NUM_TEAM_4: {
-                       redflag_pos = pos - eX * fs2 * size1;
-                       blueflag_pos = pos + eX * fs3 * size1;
-                       yellowflag_pos = pos + eX * fs2 * size1;
-                       pinkflag_pos = pos;
-                       break;
-               }
-       }
-       neutralflag_pos = pos;
-       flag_size = e1 * fs * size1 + e2 * size2;
-
-       #define X(team) MACRO_BEGIN \
-               f = bound(0, team##flag_statuschange_elapsedtime * 2, 1); \
-               if (team##_icon && ctf_stalemate) \
-                       drawpic_aspect_skin(team##flag_pos, "flag_stalemate", flag_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); \
-               if (team##_icon_prevstatus && f < 1) \
-                       drawpic_aspect_skin_expanding(team##flag_pos, team##_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * team##_alpha_prevstatus, DRAWFLAG_NORMAL, f); \
-               if (team##_icon) \
-                       drawpic_aspect_skin(team##flag_pos, team##_icon, flag_size, '1 1 1', panel_fg_alpha * team##_alpha * f, DRAWFLAG_NORMAL); \
-       MACRO_END
-       X(red);
-       X(blue);
-       X(yellow);
-       X(pink);
-       X(neutral);
-       #undef X
-}
-
-// Keyhunt HUD modicon section
-vector KH_SLOTS[4];
-
-void HUD_Mod_KH(vector pos, vector mySize)
-{
-       mod_active = 1; // keyhunt should never hide the mod icons panel
-
-       // Read current state
-       int state = STAT(KH_KEYS);
-       if(!state) return;
-
-       int i, key_state;
-       int all_keys, team1_keys, team2_keys, team3_keys, team4_keys, dropped_keys, carrying_keys;
-       all_keys = team1_keys = team2_keys = team3_keys = team4_keys = dropped_keys = carrying_keys = 0;
-
-       for(i = 0; i < 4; ++i)
-       {
-               key_state = (bitshift(state, i * -5) & 31) - 1;
-
-               if(key_state == -1)
-                       continue;
-
-               if(key_state == 30)
-               {
-                       ++carrying_keys;
-                       key_state = myteam;
-               }
-
-               switch(key_state)
-               {
-                       case NUM_TEAM_1: ++team1_keys; break;
-                       case NUM_TEAM_2: ++team2_keys; break;
-                       case NUM_TEAM_3: ++team3_keys; break;
-                       case NUM_TEAM_4: ++team4_keys; break;
-                       case 29: ++dropped_keys; break;
-               }
-
-               ++all_keys;
-       }
-
-       // Calculate slot measurements
-       vector slot_size;
-       if(all_keys == 4 && mySize.x * 0.5 < mySize.y && mySize.y * 0.5 < mySize.x)
-       {
-               // Quadratic arrangement
-               slot_size = vec2(mySize.x * 0.5, mySize.y * 0.5);
-               KH_SLOTS[0] = pos;
-               KH_SLOTS[1] = pos + eX * slot_size.x;
-               KH_SLOTS[2] = pos + eY * slot_size.y;
-               KH_SLOTS[3] = pos + eX * slot_size.x + eY * slot_size.y;
-       }
-       else
-       {
-               if(mySize.x > mySize.y)
-               {
-                       // Horizontal arrangement
-                       slot_size = vec2(mySize.x / all_keys, mySize.y);
-                       for(i = 0; i < all_keys; ++i)
-                               KH_SLOTS[i] = pos + eX * slot_size.x * i;
-               }
-               else
-               {
-                       // Vertical arrangement
-                       slot_size = vec2(mySize.x, mySize.y / all_keys);
-                       for(i = 0; i < all_keys; ++i)
-                               KH_SLOTS[i] = pos + eY * slot_size.y * i;
-               }
-       }
-
-       // Make icons blink in case of RUN HERE
-
-       float alpha = 1;
-       if(carrying_keys)
-       {
-               float blink = 0.6 + sin(2 * M_PI * time) * 0.4; // Oscillate between 0.2 and 1
-               switch(myteam)
-               {
-                       case NUM_TEAM_1: if(team1_keys == all_keys) alpha = blink; break;
-                       case NUM_TEAM_2: if(team2_keys == all_keys) alpha = blink; break;
-                       case NUM_TEAM_3: if(team3_keys == all_keys) alpha = blink; break;
-                       case NUM_TEAM_4: if(team4_keys == all_keys) alpha = blink; break;
-               }
-       }
-
-       // Draw icons
-
-       i = 0;
-
-       while(team1_keys--)
-               if(myteam == NUM_TEAM_1 && carrying_keys)
-               {
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-                       --carrying_keys;
-               }
-               else
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-
-       while(team2_keys--)
-               if(myteam == NUM_TEAM_2 && carrying_keys)
-               {
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-                       --carrying_keys;
-               }
-               else
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-
-       while(team3_keys--)
-               if(myteam == NUM_TEAM_3 && carrying_keys)
-               {
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-                       --carrying_keys;
-               }
-               else
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-
-       while(team4_keys--)
-               if(myteam == NUM_TEAM_4 && carrying_keys)
-               {
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-                       --carrying_keys;
-               }
-               else
-                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-
-       while(dropped_keys--)
-               drawpic_aspect_skin(KH_SLOTS[i++], "kh_dropped", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
-}
-
-// Keepaway HUD mod icon
-int kaball_prevstatus; // last remembered status
-float kaball_statuschange_time; // time when the status changed
-
-// we don't need to reset for keepaway since it immediately
-// autocorrects prevstatus as to if the player has the ball or not
-
-void HUD_Mod_Keepaway(vector pos, vector mySize)
-{
-       mod_active = 1; // keepaway should always show the mod HUD
-
-       float BLINK_FACTOR = 0.15;
-       float BLINK_BASE = 0.85;
-       float BLINK_FREQ = 5;
-       float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
-
-       int stat_items = STAT(ITEMS);
-       int kaball = (stat_items/IT_KEY1) & 1;
-
-       if(kaball != kaball_prevstatus)
-       {
-               kaball_statuschange_time = time;
-               kaball_prevstatus = kaball;
-       }
-
-       vector kaball_pos, kaball_size;
-
-       if(mySize.x > mySize.y) {
-               kaball_pos = pos + eX * 0.25 * mySize.x;
-               kaball_size = vec2(0.5 * mySize.x, mySize.y);
-       } else {
-               kaball_pos = pos + eY * 0.25 * mySize.y;
-               kaball_size = vec2(mySize.x, 0.5 * mySize.y);
-       }
-
-       float kaball_statuschange_elapsedtime = time - kaball_statuschange_time;
-       float f = bound(0, kaball_statuschange_elapsedtime*2, 1);
-
-       if(kaball_prevstatus && f < 1)
-               drawpic_aspect_skin_expanding(kaball_pos, "keepawayball_carrying", kaball_size, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f);
-
-       if(kaball)
-               drawpic_aspect_skin(pos, "keepawayball_carrying", vec2(mySize.x, mySize.y), '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL);
-}
-
-
-// Nexball HUD mod icon
-void HUD_Mod_NexBall(vector pos, vector mySize)
-{
-       float nb_pb_starttime, dt, p;
-       int stat_items;
-
-       stat_items = STAT(ITEMS);
-       nb_pb_starttime = STAT(NB_METERSTART);
-
-       if (stat_items & IT_KEY1)
-               mod_active = 1;
-       else
-               mod_active = 0;
-
-       //Manage the progress bar if any
-       if (nb_pb_starttime > 0)
-       {
-               dt = (time - nb_pb_starttime) % nb_pb_period;
-               // one period of positive triangle
-               p = 2 * dt / nb_pb_period;
-               if (p > 1)
-                       p = 2 - p;
-
-               HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", p, (mySize.x <= mySize.y), 0, autocvar_hud_progressbar_nexball_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
-       }
-
-       if (stat_items & IT_KEY1)
-               drawpic_aspect_skin(pos, "nexball_carrying", eX * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-}
-
 // Race/CTS HUD mod icons
 float crecordtime_prev; // last remembered crecordtime
 float crecordtime_change_time; // time when crecordtime last changed
@@ -629,87 +228,6 @@ void HUD_Mod_Race(vector pos, vector mySize)
        }
 }
 
-void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
-{
-       TC(int, layout); TC(int, i);
-       float stat = -1;
-       string pic = "";
-       vector color = '0 0 0';
-       switch(i)
-       {
-               case 0: stat = STAT(DOM_PPS_RED); pic = "dom_icon_red"; color = '1 0 0'; break;
-               case 1: stat = STAT(DOM_PPS_BLUE); pic = "dom_icon_blue"; color = '0 0 1'; break;
-               case 2: stat = STAT(DOM_PPS_YELLOW); pic = "dom_icon_yellow"; color = '1 1 0'; break;
-               default:
-               case 3: stat = STAT(DOM_PPS_PINK); pic = "dom_icon_pink"; color = '1 0 1'; break;
-       }
-       float pps_ratio = 0;
-       if(STAT(DOM_TOTAL_PPS))
-               pps_ratio = stat / STAT(DOM_TOTAL_PPS);
-
-       if(mySize.x/mySize.y > aspect_ratio)
-       {
-               i = aspect_ratio * mySize.y;
-               myPos.x = myPos.x + (mySize.x - i) / 2;
-               mySize.x = i;
-       }
-       else
-       {
-               i = 1/aspect_ratio * mySize.x;
-               myPos.y = myPos.y + (mySize.y - i) / 2;
-               mySize.y = i;
-       }
-
-       if (layout) // show text too
-       {
-               //draw the text
-               color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
-               if (layout == 2) // average pps
-                       drawstring_aspect(myPos + eX * mySize.y, ftos_decimals(stat, 2), vec2((2/3) * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
-               else // percentage of average pps
-                       drawstring_aspect(myPos + eX * mySize.y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), vec2((2/3) * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
-       }
-
-       //draw the icon
-       drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-       if (stat > 0)
-       {
-               drawsetcliparea(myPos.x, myPos.y + mySize.y * (1 - pps_ratio), mySize.y, mySize.y * pps_ratio);
-               drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-               drawresetcliparea();
-       }
-}
-
-void HUD_Mod_Dom(vector myPos, vector mySize)
-{
-       mod_active = 1; // required in each mod function that always shows something
-
-       int layout = autocvar_hud_panel_modicons_dom_layout;
-       int rows, columns;
-       float aspect_ratio;
-       aspect_ratio = (layout) ? 3 : 1;
-       rows = HUD_GetRowCount(team_count, mySize, aspect_ratio);
-       columns = ceil(team_count/rows);
-
-       int i;
-       float row = 0, column = 0;
-       vector pos, itemSize;
-       itemSize = vec2(mySize.x / columns, mySize.y / rows);
-       for(i=0; i<team_count; ++i)
-       {
-               pos = myPos + vec2(column * itemSize.x, row * itemSize.y);
-
-               DrawDomItem(pos, itemSize, aspect_ratio, layout, i);
-
-               ++row;
-               if(row >= rows)
-               {
-                       row = 0;
-                       ++column;
-               }
-       }
-}
-
 void HUD_ModIcons_SetFunc()
 {
        HUD_ModIcons_GameType = gametype.m_modicons;
index 6db88c68b39ee50fce1f8acce9c778465a3223ae..c90c0991f57282ebde7f30d1e4da9d927b0c627d 100644 (file)
@@ -1,2 +1,4 @@
 #pragma once
 #include "../panel.qh"
+
+bool mod_active; // is there any active mod icon?
index f0f8f1d4bea5ad62563c20df43bc0ce6ad2c9f29..87951ff894ba0e689101e7eb847879908a95c8e4 100644 (file)
@@ -45,20 +45,24 @@ entity teamslots[17];    // 17 teams (including "spectator team")
 .bool ready;
 .bool eliminated;
 
-.void(entity) draw;
 IntrusiveList g_drawables;
-STATIC_INIT(g_drawables) { g_drawables = IL_NEW(); }
-.void(entity) draw2d;
 IntrusiveList g_drawables_2d;
-STATIC_INIT(g_drawables_2d) { g_drawables_2d = IL_NEW(); }
+IntrusiveList g_radarlinks;
+IntrusiveList g_radaricons;
+STATIC_INIT(main)
+{
+       g_drawables = IL_NEW();
+       g_drawables_2d = IL_NEW();
+       g_radarlinks = IL_NEW();
+       g_radaricons = IL_NEW();
+}
+
+.void(entity) draw;
+.void(entity) draw2d;
 .void(entity) entremove;
 float drawframetime;
 vector view_origin, view_forward, view_right, view_up;
 
-IntrusiveList g_radarlinks;
-STATIC_INIT(g_radarlinks) { g_radarlinks = IL_NEW(); }
-IntrusiveList g_radaricons;
-STATIC_INIT(g_radaricons) { g_radaricons = IL_NEW(); }
 
 bool button_zoom;
 bool spectatorbutton_zoom;
index 322abb87e005a628660c3abd916a8746b452ab9a..60ae3f18a2b355592671f31b29179fe8c51fa9fb 100644 (file)
@@ -392,86 +392,6 @@ STATIC_INIT(fpscounter_init)
        showfps_prevfps_time = currentTime; // we must initialize it to avoid an instant low frame sending
 }
 
-STATIC_INIT(Porto)
-{
-       entity e = new_pure(porto);
-       e.draw = Porto_Draw;
-       IL_PUSH(g_drawables, e);
-       e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
-}
-
-const int polyline_length = 16;
-.vector polyline[polyline_length];
-void Porto_Draw(entity this)
-{
-       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-       {
-               entity wepent = viewmodels[slot];
-
-               if (wepent.activeweapon != WEP_PORTO) continue;
-               if (spectatee_status) continue;
-               if (WEP_CVAR(porto, secondary)) continue;
-               if (intermission == 1) continue;
-               if (intermission == 2) continue;
-               if (STAT(HEALTH) <= 0) continue;
-
-               vector pos = view_origin;
-               vector dir = view_forward;
-               makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
-               pos += v_right * -wepent.movedir.y
-                       +  v_up * wepent.movedir.z;
-
-               if (wepent.angles_held_status)
-               {
-                       makevectors(wepent.angles_held);
-                       dir = v_forward;
-               }
-
-               wepent.polyline[0] = pos;
-
-               int portal_number = 0, portal1_idx = 1, portal_max = 2;
-               int n = 1 + 2;  // 2 lines == 3 points
-               for (int idx = 0; idx < n && idx < polyline_length - 1; )
-               {
-                       traceline(pos, pos + 65536 * dir, true, this);
-                       dir = reflect(dir, trace_plane_normal);
-                       pos = trace_endpos;
-                       wepent.polyline[++idx] = pos;
-                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
-                       {
-                               n += 1;
-                               continue;
-                       }
-                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
-                       {
-                               n = max(2, idx);
-                               break;
-                       }
-                       // check size
-                       {
-                               vector ang = vectoangles2(trace_plane_normal, dir);
-                               ang.x = -ang.x;
-                               makevectors(ang);
-                               if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
-                               {
-                                       n = max(2, idx);
-                                       break;
-                               }
-                       }
-                       portal_number += 1;
-                       if (portal_number >= portal_max) break;
-                       if (portal_number == 1) portal1_idx = idx;
-               }
-               for (int idx = 0; idx < n - 1; ++idx)
-               {
-                       vector p = wepent.polyline[idx], q = wepent.polyline[idx + 1];
-                       if (idx == 0) p -= view_up * 16;  // line from player
-                       vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1';
-                       Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin);
-               }
-       }
-}
-
 float drawtime;
 float avgspeed;
 vector GetCurrentFov(float fov)
@@ -679,6 +599,9 @@ float EnemyHitCheck()
 
 float TrueAimCheck(entity wepent)
 {
+       if(wepent.activeweapon.spawnflags & WEP_FLAG_NOTRUEAIM)
+               return SHOTTYPE_HITWORLD;
+       
        float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        vector vecs, trueaimpoint, w_shotorg;
        vector mi, ma, dv;
@@ -692,12 +615,6 @@ float TrueAimCheck(entity wepent)
 
        switch(wepent.activeweapon) // WEAPONTODO
        {
-               case WEP_TUBA: // no aim
-               case WEP_PORTO: // shoots from eye
-               case WEP_NEXBALL: // shoots from eye
-               case WEP_HOOK: // no trueaim
-               case WEP_MORTAR: // toss curve
-                       return SHOTTYPE_HITWORLD;
                case WEP_VORTEX:
                case WEP_OVERKILL_NEX:
                case WEP_VAPORIZER:
index 12fd6eb614c5e8040e0a24995d35ad7f520107c6..f3c1f4139fff3543ca272c7a750a3cd3328422b5 100644 (file)
@@ -6,8 +6,6 @@ vector crosshair_getcolor(entity this, float health_stat);
 
 void calc_followmodel_ofs(entity view);
 
-void Porto_Draw(entity this);
-
 void CSQC_Demo_Camera();
 
 void TrueAim_Init();
index beb8e3e912221911705429fe210042762ed51cb0..2169c8bd762bd3abe5e708e1f24e1b8b99333740 100644 (file)
@@ -26,9 +26,8 @@ const int HITTYPE_SECONDARY = BITS(1) << 8;
 const int HITTYPE_SPLASH = BITS(1) << 9;
 const int HITTYPE_BOUNCE = BITS(1) << 10;
 const int HITTYPE_ARMORPIERCE = BITS(1) << 11;
-// unused yet
-const int HITTYPE_RESERVED = BITS(1) << 12;
-const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_RESERVED;
+const int HITTYPE_SOUND = BITS(1) << 12;
+const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_ARMORPIERCE | HITTYPE_SOUND;
 // normal deaths begin
 const int DT_FIRST = BIT(13);
 
index fe509e3d4988cfce22f0e88f84b15a9402642124..17f48136a6c0a4126f1ae96bf172c89fc63b9d4d 100644 (file)
@@ -174,7 +174,6 @@ void DamageEffect(entity this, vector hitorg, float thedamage, int type, int spe
 
 NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
 {
-       const float ATTEN_LOW = 0.2;
        float thedamage, rad, edge, thisdmg;
        bool hitplayer = false;
        int species, forcemul;
@@ -393,7 +392,7 @@ NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew)
                w_random = prandom();
 
                traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, NULL);
-               if(trace_fraction < 1 && hitwep != WEP_VORTEX && hitwep != WEP_VAPORIZER)
+               if(trace_fraction < 1 && !(hitwep.spawnflags & WEP_TYPE_HITSCAN))
                        w_backoff = trace_plane_normal;
                else
                        w_backoff = -1 * normalize(force);
index 835073d07d7e655f896f635de6ff560bdff34e35..9a9a654de9c928d3ae5112a69c8308ebaaab4016 100644 (file)
@@ -1,5 +1,7 @@
 #include "sv_assault.qh"
 
+#include <common/mapobjects/func/breakable.qh>
+
 .entity sprite;
 #define AS_ROUND_DELAY 5
 
@@ -347,7 +349,6 @@ bool destructible_heal(entity targ, entity inflictor, float amount, float limit)
        return true;
 }
 
-spawnfunc(func_breakable);
 spawnfunc(func_assault_destructible)
 {
        if (!g_assault) { delete(this); return; }
index 7bc5a9679c2a56a6c9d4278e648ed70c8647b408..c6d756fbb8e9acba3d03b73bd08b4620481ed8c8 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/ctf/cl_ctf.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/ctf/sv_ctf.qc>
 #endif
index e7fcea7bcf0fed7cd4ac697f5368da35d848e3ee..9a1d1811935d27179b591974bfffe1c667af9609 100644 (file)
@@ -1,5 +1,8 @@
 // generated file; do not modify
 #include <common/gamemodes/gamemode/ctf/ctf.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/ctf/cl_ctf.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qc b/qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qc
new file mode 100644 (file)
index 0000000..c82e0bc
--- /dev/null
@@ -0,0 +1,198 @@
+#include "cl_ctf.qh"
+
+#include <client/hud/panel/modicons.qh>
+
+// CTF HUD modicon section
+int redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe, neutralflag_prevframe; // status during previous frame
+int redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus, neutralflag_prevstatus; // last remembered status
+float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time, neutralflag_statuschange_time; // time when the status changed
+
+void HUD_Mod_CTF_Reset()
+{
+    redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = neutralflag_prevstatus = 0;
+    redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = neutralflag_prevframe = 0;
+    redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0;
+}
+
+int autocvar__teams_available;
+void HUD_Mod_CTF(vector pos, vector mySize)
+{
+    vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos;
+    vector flag_size;
+    float f; // every function should have that
+
+    int redflag, blueflag, yellowflag, pinkflag, neutralflag; // current status
+    float redflag_statuschange_elapsedtime = 0, blueflag_statuschange_elapsedtime = 0, yellowflag_statuschange_elapsedtime = 0, pinkflag_statuschange_elapsedtime = 0, neutralflag_statuschange_elapsedtime = 0; // time since the status changed
+    bool ctf_oneflag; // one-flag CTF mode enabled/disabled
+    bool ctf_stalemate; // currently in stalemate
+    int stat_items = STAT(CTF_FLAGSTATUS);
+    float fs, fs2, fs3, size1, size2;
+    vector e1, e2;
+
+    int nteams = autocvar__teams_available;
+
+    redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3;
+    blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3;
+    yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3;
+    pinkflag = (stat_items/CTF_PINK_FLAG_TAKEN) & 3;
+    neutralflag = (stat_items/CTF_NEUTRAL_FLAG_TAKEN) & 3;
+
+    ctf_oneflag = (stat_items & CTF_FLAG_NEUTRAL);
+
+    ctf_stalemate = (stat_items & CTF_STALEMATE);
+
+    mod_active = (redflag || blueflag || yellowflag || pinkflag || neutralflag || (stat_items & CTF_SHIELDED));
+
+    if (autocvar__hud_configure) {
+        redflag = 1;
+        blueflag = 2;
+        if (nteams & BIT(2))
+            yellowflag = 2;
+        if (nteams & BIT(3))
+            pinkflag = 3;
+        ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor?
+    }
+
+    // when status CHANGES, set old status into prevstatus and current status into status
+    #define X(team) MACRO_BEGIN \
+        if (team##flag != team##flag_prevframe) { \
+            team##flag_statuschange_time = time; \
+            team##flag_prevstatus = team##flag_prevframe; \
+            team##flag_prevframe = team##flag; \
+        } \
+        team##flag_statuschange_elapsedtime = time - team##flag_statuschange_time; \
+    MACRO_END
+    X(red);
+    X(blue);
+    X(yellow);
+    X(pink);
+    X(neutral);
+    #undef X
+
+    const float BLINK_FACTOR = 0.15;
+    const float BLINK_BASE = 0.85;
+    // note:
+    //   RMS = sqrt(BLINK_BASE^2 + 0.5 * BLINK_FACTOR^2)
+    // thus
+    //   BLINK_BASE = sqrt(RMS^2 - 0.5 * BLINK_FACTOR^2)
+    // ensure RMS == 1
+    const float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz
+
+    #define X(team, cond) \
+    string team##_icon = string_null, team##_icon_prevstatus = string_null; \
+    int team##_alpha, team##_alpha_prevstatus; \
+    team##_alpha = team##_alpha_prevstatus = 1; \
+    MACRO_BEGIN \
+        switch (team##flag) { \
+            case 1: team##_icon = "flag_" #team "_taken"; break; \
+            case 2: team##_icon = "flag_" #team "_lost"; break; \
+            case 3: team##_icon = "flag_" #team "_carrying"; team##_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
+            default: \
+                if ((stat_items & CTF_SHIELDED) && (cond)) { \
+                    team##_icon = "flag_" #team "_shielded"; \
+                } else { \
+                    team##_icon = string_null; \
+                } \
+                break; \
+        } \
+        switch (team##flag_prevstatus) { \
+            case 1: team##_icon_prevstatus = "flag_" #team "_taken"; break; \
+            case 2: team##_icon_prevstatus = "flag_" #team "_lost"; break; \
+            case 3: team##_icon_prevstatus = "flag_" #team "_carrying"; team##_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
+            default: \
+                if (team##flag == 3) { \
+                    team##_icon_prevstatus = "flag_" #team "_carrying"; /* make it more visible */\
+                } else if((stat_items & CTF_SHIELDED) && (cond)) { \
+                    team##_icon_prevstatus = "flag_" #team "_shielded"; \
+                } else { \
+                    team##_icon_prevstatus = string_null; \
+                } \
+                break; \
+        } \
+    MACRO_END
+    X(red, myteam != NUM_TEAM_1 && (nteams & BIT(0)));
+    X(blue, myteam != NUM_TEAM_2 && (nteams & BIT(1)));
+    X(yellow, myteam != NUM_TEAM_3 && (nteams & BIT(2)));
+    X(pink, myteam != NUM_TEAM_4 && (nteams & BIT(3)));
+    X(neutral, ctf_oneflag);
+    #undef X
+
+    int tcount = 2;
+    if(nteams & BIT(2))
+        tcount = 3;
+    if(nteams & BIT(3))
+        tcount = 4;
+
+    if (ctf_oneflag) {
+        // hacky, but these aren't needed
+        red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null;
+        fs = fs2 = fs3 = 1;
+    } else switch (tcount) {
+        default:
+        case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break;
+        case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break;
+        case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break;
+    }
+
+    if (mySize_x > mySize_y) {
+        size1 = mySize_x;
+        size2 = mySize_y;
+        e1 = eX;
+        e2 = eY;
+    } else {
+        size1 = mySize_y;
+        size2 = mySize_x;
+        e1 = eY;
+        e2 = eX;
+    }
+
+    switch (myteam) {
+        default:
+        case NUM_TEAM_1: {
+            redflag_pos = pos;
+            blueflag_pos = pos + eX * fs2 * size1;
+            yellowflag_pos = pos - eX * fs2 * size1;
+            pinkflag_pos = pos + eX * fs3 * size1;
+            break;
+        }
+        case NUM_TEAM_2: {
+            redflag_pos = pos + eX * fs2 * size1;
+            blueflag_pos = pos;
+            yellowflag_pos = pos - eX * fs2 * size1;
+            pinkflag_pos = pos + eX * fs3 * size1;
+            break;
+        }
+        case NUM_TEAM_3: {
+            redflag_pos = pos + eX * fs3 * size1;
+            blueflag_pos = pos - eX * fs2 * size1;
+            yellowflag_pos = pos;
+            pinkflag_pos = pos + eX * fs2 * size1;
+            break;
+        }
+        case NUM_TEAM_4: {
+            redflag_pos = pos - eX * fs2 * size1;
+            blueflag_pos = pos + eX * fs3 * size1;
+            yellowflag_pos = pos + eX * fs2 * size1;
+            pinkflag_pos = pos;
+            break;
+        }
+    }
+    neutralflag_pos = pos;
+    flag_size = e1 * fs * size1 + e2 * size2;
+
+    #define X(team) MACRO_BEGIN \
+        f = bound(0, team##flag_statuschange_elapsedtime * 2, 1); \
+        if (team##_icon && ctf_stalemate) \
+            drawpic_aspect_skin(team##flag_pos, "flag_stalemate", flag_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); \
+        if (team##_icon_prevstatus && f < 1) \
+            drawpic_aspect_skin_expanding(team##flag_pos, team##_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * team##_alpha_prevstatus, DRAWFLAG_NORMAL, f); \
+        if (team##_icon) \
+            drawpic_aspect_skin(team##flag_pos, team##_icon, flag_size, '1 1 1', panel_fg_alpha * team##_alpha * f, DRAWFLAG_NORMAL); \
+    MACRO_END
+    X(red);
+    X(blue);
+    X(yellow);
+    X(pink);
+    X(neutral);
+    #undef X
+}
diff --git a/qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qh b/qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qh
new file mode 100644 (file)
index 0000000..1cf4bcf
--- /dev/null
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "ctf.qh"
+
+void HUD_Mod_CTF_Reset();
+void HUD_Mod_CTF(vector pos, vector mySize);
index 2484240a26d1c83c62b9487bdcf85ff7d984b6ff..939c70e29ea858597260439a21ea3db98c19f78c 100644 (file)
@@ -2593,6 +2593,13 @@ MUTATOR_HOOKFUNCTION(ctf, DropSpecialItems)
                ctf_Handle_Throw(frag_target, NULL, DROP_THROW);
 }
 
+MUTATOR_HOOKFUNCTION(ctf, LogDeath_AppendItemCodes)
+{
+       entity player = M_ARGV(0, entity);
+       if(player.flagcarried)
+               M_ARGV(1, string) = strcat(M_ARGV(1, string), "F"); // item codes
+}
+
 
 // ==========
 // Spawnfuncs
index 679dd850257a3286db8a56d1ecf76bc67971be31..b1518bd4fc1825df24868ce50597f31cb1368d4c 100644 (file)
@@ -28,7 +28,8 @@ CLASS(Flag, Pickup)
     ATTRIB(Flag, m_mins, vector, (PL_MIN_CONST + '0 0 -13') * 1.4); // scaling be damned
     ATTRIB(Flag, m_maxs, vector, (PL_MAX_CONST + '0 0 -13') * 1.4);
 ENDCLASS(Flag)
-Flag CTF_FLAG; STATIC_INIT(Flag) { CTF_FLAG = NEW(Flag); }
+Flag CTF_FLAG;
+STATIC_INIT(Flag) { CTF_FLAG = NEW(Flag); }
 void ctf_FlagTouch(entity this, entity toucher) { ITEM_HANDLE(Pickup, CTF_FLAG, this, toucher); }
 
 // flag constants // for most of these, there is just one question to be asked: WHYYYYY?
index ff9bc11f881d0afb4031fd3dd0937f37f2093f93..ccaa150df78903cd843abd28930fe02653bd1f39 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/domination/cl_domination.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/domination/sv_domination.qc>
 #endif
index 0c5e8412146e62d3970d3452f98d25c5f60af386..b48a0a9147d6cc13ef5656fb9556699fbcbf9dca 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/domination/cl_domination.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/domination/sv_domination.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/domination/cl_domination.qc b/qcsrc/common/gamemodes/gamemode/domination/cl_domination.qc
new file mode 100644 (file)
index 0000000..418a843
--- /dev/null
@@ -0,0 +1,86 @@
+#include "cl_domination.qh"
+
+#include <client/hud/panel/modicons.qh>
+
+int autocvar_hud_panel_modicons_dom_layout;
+
+void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
+{
+       TC(int, layout); TC(int, i);
+       float stat = -1;
+       string pic = "";
+       vector color = '0 0 0';
+       switch(i)
+       {
+               case 0: stat = STAT(DOM_PPS_RED); pic = "dom_icon_red"; color = '1 0 0'; break;
+               case 1: stat = STAT(DOM_PPS_BLUE); pic = "dom_icon_blue"; color = '0 0 1'; break;
+               case 2: stat = STAT(DOM_PPS_YELLOW); pic = "dom_icon_yellow"; color = '1 1 0'; break;
+               default:
+               case 3: stat = STAT(DOM_PPS_PINK); pic = "dom_icon_pink"; color = '1 0 1'; break;
+       }
+       float pps_ratio = 0;
+       if(STAT(DOM_TOTAL_PPS))
+               pps_ratio = stat / STAT(DOM_TOTAL_PPS);
+
+       if(mySize.x/mySize.y > aspect_ratio)
+       {
+               i = aspect_ratio * mySize.y;
+               myPos.x = myPos.x + (mySize.x - i) / 2;
+               mySize.x = i;
+       }
+       else
+       {
+               i = 1/aspect_ratio * mySize.x;
+               myPos.y = myPos.y + (mySize.y - i) / 2;
+               mySize.y = i;
+       }
+
+       if (layout) // show text too
+       {
+               //draw the text
+               color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
+               if (layout == 2) // average pps
+                       drawstring_aspect(myPos + eX * mySize.y, ftos_decimals(stat, 2), vec2((2/3) * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
+               else // percentage of average pps
+                       drawstring_aspect(myPos + eX * mySize.y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), vec2((2/3) * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+
+       //draw the icon
+       drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+       if (stat > 0)
+       {
+               drawsetcliparea(myPos.x, myPos.y + mySize.y * (1 - pps_ratio), mySize.y, mySize.y * pps_ratio);
+               drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawresetcliparea();
+       }
+}
+
+void HUD_Mod_Dom(vector myPos, vector mySize)
+{
+       mod_active = 1; // required in each mod function that always shows something
+
+       int layout = autocvar_hud_panel_modicons_dom_layout;
+       int rows, columns;
+       float aspect_ratio;
+       aspect_ratio = (layout) ? 3 : 1;
+       rows = HUD_GetRowCount(team_count, mySize, aspect_ratio);
+       columns = ceil(team_count/rows);
+
+       int i;
+       float row = 0, column = 0;
+       vector pos, itemSize;
+       itemSize = vec2(mySize.x / columns, mySize.y / rows);
+       for(i=0; i<team_count; ++i)
+       {
+               pos = myPos + vec2(column * itemSize.x, row * itemSize.y);
+
+               DrawDomItem(pos, itemSize, aspect_ratio, layout, i);
+
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       ++column;
+               }
+       }
+}
diff --git a/qcsrc/common/gamemodes/gamemode/domination/cl_domination.qh b/qcsrc/common/gamemodes/gamemode/domination/cl_domination.qh
new file mode 100644 (file)
index 0000000..11ab3da
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_Dom(vector myPos, vector mySize);
index 420f7af78aa2c29c635e28e9b8113210230f2629..2ce6f4493baafb5d52465c0bb4024e4e9084db45 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/keepaway/cl_keepaway.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/keepaway/sv_keepaway.qc>
 #endif
index 145ca49f0a06878ab0ca96d381dc0f020c32f896..8536675f3f188a3dafbbe464002a35fb48c334fa 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/keepaway/cl_keepaway.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/keepaway/sv_keepaway.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qc b/qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qc
new file mode 100644 (file)
index 0000000..b2d0874
--- /dev/null
@@ -0,0 +1,48 @@
+#include "cl_keepaway.qh"
+
+#include <client/hud/panel/modicons.qh>
+
+// Keepaway HUD mod icon
+int kaball_prevstatus; // last remembered status
+float kaball_statuschange_time; // time when the status changed
+
+// we don't need to reset for keepaway since it immediately
+// autocorrects prevstatus as to if the player has the ball or not
+
+void HUD_Mod_Keepaway(vector pos, vector mySize)
+{
+       mod_active = 1; // keepaway should always show the mod HUD
+
+       float BLINK_FACTOR = 0.15;
+       float BLINK_BASE = 0.85;
+       float BLINK_FREQ = 5;
+       float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ);
+
+       int stat_items = STAT(ITEMS);
+       int kaball = (stat_items/IT_KEY1) & 1;
+
+       if(kaball != kaball_prevstatus)
+       {
+               kaball_statuschange_time = time;
+               kaball_prevstatus = kaball;
+       }
+
+       vector kaball_pos, kaball_size;
+
+       if(mySize.x > mySize.y) {
+               kaball_pos = pos + eX * 0.25 * mySize.x;
+               kaball_size = vec2(0.5 * mySize.x, mySize.y);
+       } else {
+               kaball_pos = pos + eY * 0.25 * mySize.y;
+               kaball_size = vec2(mySize.x, 0.5 * mySize.y);
+       }
+
+       float kaball_statuschange_elapsedtime = time - kaball_statuschange_time;
+       float f = bound(0, kaball_statuschange_elapsedtime*2, 1);
+
+       if(kaball_prevstatus && f < 1)
+               drawpic_aspect_skin_expanding(kaball_pos, "keepawayball_carrying", kaball_size, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f);
+
+       if(kaball)
+               drawpic_aspect_skin(pos, "keepawayball_carrying", vec2(mySize.x, mySize.y), '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL);
+}
diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qh b/qcsrc/common/gamemodes/gamemode/keepaway/cl_keepaway.qh
new file mode 100644 (file)
index 0000000..7bcc289
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_Keepaway(vector pos, vector mySize);
index 4f44840c41c7ba592ac0679917fd767aa379adbf..14802494b9303156d83401ec48f21262b9e44dca 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/keyhunt/sv_keyhunt.qc>
 #endif
index e4143fc84cd91165519803a90f145f7977a841fe..defda749783f75f4b5e02c2c11923d1f2a4788d1 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/keyhunt/cl_keyhunt.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/keyhunt/sv_keyhunt.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc b/qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc
new file mode 100644 (file)
index 0000000..e95275e
--- /dev/null
@@ -0,0 +1,131 @@
+#include "cl_keyhunt.qh"
+
+#include <client/hud/panel/modicons.qh>
+
+// Keyhunt HUD modicon section
+vector KH_SLOTS[4];
+
+void HUD_Mod_KH(vector pos, vector mySize)
+{
+       mod_active = 1; // keyhunt should never hide the mod icons panel
+
+       // Read current state
+       int state = STAT(KH_KEYS);
+       if(!state) return;
+
+       int i, key_state;
+       int all_keys, team1_keys, team2_keys, team3_keys, team4_keys, dropped_keys, carrying_keys;
+       all_keys = team1_keys = team2_keys = team3_keys = team4_keys = dropped_keys = carrying_keys = 0;
+
+       for(i = 0; i < 4; ++i)
+       {
+               key_state = (bitshift(state, i * -5) & 31) - 1;
+
+               if(key_state == -1)
+                       continue;
+
+               if(key_state == 30)
+               {
+                       ++carrying_keys;
+                       key_state = myteam;
+               }
+
+               switch(key_state)
+               {
+                       case NUM_TEAM_1: ++team1_keys; break;
+                       case NUM_TEAM_2: ++team2_keys; break;
+                       case NUM_TEAM_3: ++team3_keys; break;
+                       case NUM_TEAM_4: ++team4_keys; break;
+                       case 29: ++dropped_keys; break;
+               }
+
+               ++all_keys;
+       }
+
+       // Calculate slot measurements
+       vector slot_size;
+       if(all_keys == 4 && mySize.x * 0.5 < mySize.y && mySize.y * 0.5 < mySize.x)
+       {
+               // Quadratic arrangement
+               slot_size = vec2(mySize.x * 0.5, mySize.y * 0.5);
+               KH_SLOTS[0] = pos;
+               KH_SLOTS[1] = pos + eX * slot_size.x;
+               KH_SLOTS[2] = pos + eY * slot_size.y;
+               KH_SLOTS[3] = pos + eX * slot_size.x + eY * slot_size.y;
+       }
+       else
+       {
+               if(mySize.x > mySize.y)
+               {
+                       // Horizontal arrangement
+                       slot_size = vec2(mySize.x / all_keys, mySize.y);
+                       for(i = 0; i < all_keys; ++i)
+                               KH_SLOTS[i] = pos + eX * slot_size.x * i;
+               }
+               else
+               {
+                       // Vertical arrangement
+                       slot_size = vec2(mySize.x, mySize.y / all_keys);
+                       for(i = 0; i < all_keys; ++i)
+                               KH_SLOTS[i] = pos + eY * slot_size.y * i;
+               }
+       }
+
+       // Make icons blink in case of RUN HERE
+
+       float alpha = 1;
+       if(carrying_keys)
+       {
+               float blink = 0.6 + sin(2 * M_PI * time) * 0.4; // Oscillate between 0.2 and 1
+               switch(myteam)
+               {
+                       case NUM_TEAM_1: if(team1_keys == all_keys) alpha = blink; break;
+                       case NUM_TEAM_2: if(team2_keys == all_keys) alpha = blink; break;
+                       case NUM_TEAM_3: if(team3_keys == all_keys) alpha = blink; break;
+                       case NUM_TEAM_4: if(team4_keys == all_keys) alpha = blink; break;
+               }
+       }
+
+       // Draw icons
+
+       i = 0;
+
+       while(team1_keys--)
+               if(myteam == NUM_TEAM_1 && carrying_keys)
+               {
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+                       --carrying_keys;
+               }
+               else
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+
+       while(team2_keys--)
+               if(myteam == NUM_TEAM_2 && carrying_keys)
+               {
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+                       --carrying_keys;
+               }
+               else
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+
+       while(team3_keys--)
+               if(myteam == NUM_TEAM_3 && carrying_keys)
+               {
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+                       --carrying_keys;
+               }
+               else
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+
+       while(team4_keys--)
+               if(myteam == NUM_TEAM_4 && carrying_keys)
+               {
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+                       --carrying_keys;
+               }
+               else
+                       drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+
+       while(dropped_keys--)
+               drawpic_aspect_skin(KH_SLOTS[i++], "kh_dropped", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
+}
diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qh b/qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qh
new file mode 100644 (file)
index 0000000..8d650f1
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_KH(vector pos, vector mySize);
index d33696ad3772a88fca49f0620dbb693eb0f4b792..21d9208bf96b74746cbb7f35c074b2a5f228ad27 100644 (file)
@@ -23,6 +23,7 @@ float autocvar_g_balance_keyhunt_throwvelocity;
 int autocvar_g_keyhunt_teams_override;
 
 // #define KH_PLAYER_USE_ATTACHMENT
+// TODO? no model exists for this
 // #define KH_PLAYER_USE_CARRIEDMODEL
 
 #ifdef KH_PLAYER_USE_ATTACHMENT
@@ -61,8 +62,6 @@ int kh_Team_ByID(int t)
        return 0;
 }
 
-//entity kh_worldkeylist;
-.entity kh_worldkeynext;
 entity kh_controller;
 //bool kh_tracking_enabled;
 int kh_teams;
@@ -1293,6 +1292,13 @@ MUTATOR_HOOKFUNCTION(kh, HavocBot_ChooseRole)
        return true;
 }
 
+MUTATOR_HOOKFUNCTION(kh, LogDeath_AppendItemCodes)
+{
+       entity player = M_ARGV(0, entity);
+       if(player.kh_next)
+               M_ARGV(1, string) = strcat(M_ARGV(1, string), "K"); // item codes
+}
+
 MUTATOR_HOOKFUNCTION(kh, DropSpecialItems)
 {
        entity frag_target = M_ARGV(0, entity);
index 345a3d166e0a6f7a0ab65f31e42770716a955b4c..66321c3d9d17f81917d886ce51c8cb1feb749c7a 100644 (file)
@@ -21,6 +21,9 @@ REGISTER_MUTATOR(kh, false)
        return 0;
 }
 
+entity kh_worldkeylist;
+.entity kh_worldkeynext;
+
 #define FOR_EACH_KH_KEY(v) for(v = kh_worldkeylist; v; v = v.kh_worldkeynext )
 
 // ALL OF THESE should be removed in the future, as other code should not have to care
index 78727675637493289d22309c4d98da3a1a7649cb..b229dcdf50affa7ad43b369781e29e87f9dd8023 100644 (file)
@@ -1,5 +1,10 @@
 // generated file; do not modify
-#include <common/gamemodes/gamemode/nexball/nexball.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/nexball/cl_nexball.qc>
+#endif
+#ifdef SVQC
+    #include <common/gamemodes/gamemode/nexball/sv_nexball.qc>
+#endif
 #include <common/gamemodes/gamemode/nexball/weapon.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/nexball/sv_weapon.qc>
index a1cf54437108efae947d84ea02e8e9a9488f3926..0a3d1e23831f2fd1729cc914bd8a4b33ff63f6c5 100644 (file)
@@ -1,5 +1,10 @@
 // generated file; do not modify
-#include <common/gamemodes/gamemode/nexball/nexball.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/nexball/cl_nexball.qh>
+#endif
+#ifdef SVQC
+    #include <common/gamemodes/gamemode/nexball/sv_nexball.qh>
+#endif
 #include <common/gamemodes/gamemode/nexball/weapon.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/nexball/sv_weapon.qh>
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qc
new file mode 100644 (file)
index 0000000..5a6b42d
--- /dev/null
@@ -0,0 +1,44 @@
+#include "cl_nexball.qh"
+
+#include <client/hud/panel/modicons.qh>
+
+// Nexball HUD mod icon
+void HUD_Mod_NexBall(vector pos, vector mySize)
+{
+       float nb_pb_starttime, dt, p;
+       int stat_items;
+
+       stat_items = STAT(ITEMS);
+       nb_pb_starttime = STAT(NB_METERSTART);
+
+       if (stat_items & IT_KEY1)
+               mod_active = 1;
+       else
+               mod_active = 0;
+
+       //Manage the progress bar if any
+       if (nb_pb_starttime > 0)
+       {
+               dt = (time - nb_pb_starttime) % nb_pb_period;
+               // one period of positive triangle
+               p = 2 * dt / nb_pb_period;
+               if (p > 1)
+                       p = 2 - p;
+
+               HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", p, (mySize.x <= mySize.y), 0, autocvar_hud_progressbar_nexball_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+
+       if (stat_items & IT_KEY1)
+               drawpic_aspect_skin(pos, "nexball_carrying", eX * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+}
+
+int autocvar_cl_eventchase_nexball = 1;
+
+REGISTER_MUTATOR(cl_nb, true);
+
+MUTATOR_HOOKFUNCTION(cl_nb, WantEventchase)
+{
+       if(autocvar_cl_eventchase_nexball && ISGAMETYPE(NEXBALL) && !(WepSet_GetFromStat() & WEPSET(NEXBALL)))
+               return true;
+       return false;
+}
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qh b/qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qh
new file mode 100644 (file)
index 0000000..d0b3731
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_NexBall(vector pos, vector mySize);
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc
deleted file mode 100644 (file)
index f9885fe..0000000
+++ /dev/null
@@ -1,984 +0,0 @@
-#include "nexball.qh"
-
-#ifdef CSQC
-int autocvar_cl_eventchase_nexball = 1;
-
-REGISTER_MUTATOR(cl_nb, true);
-
-MUTATOR_HOOKFUNCTION(cl_nb, WantEventchase)
-{
-       if(autocvar_cl_eventchase_nexball && ISGAMETYPE(NEXBALL) && !(WepSet_GetFromStat() & WEPSET(NEXBALL)))
-               return true;
-       return false;
-}
-#endif
-#ifdef SVQC
-.entity ballcarried;
-
-int autocvar_g_nexball_goalleadlimit;
-#define autocvar_g_nexball_goallimit cvar("g_nexball_goallimit")
-
-bool autocvar_g_nexball_basketball_jumppad = true;
-float autocvar_g_nexball_basketball_bouncefactor;
-float autocvar_g_nexball_basketball_bouncestop;
-float autocvar_g_nexball_basketball_carrier_highspeed;
-bool autocvar_g_nexball_basketball_meter;
-float autocvar_g_nexball_basketball_meter_maxpower;
-float autocvar_g_nexball_basketball_meter_minpower;
-float autocvar_g_nexball_delay_collect;
-float autocvar_g_nexball_delay_goal;
-float autocvar_g_nexball_delay_start;
-bool autocvar_g_nexball_football_jumppad = true;
-float autocvar_g_nexball_football_bouncefactor;
-float autocvar_g_nexball_football_bouncestop;
-bool autocvar_g_nexball_radar_showallplayers;
-bool autocvar_g_nexball_sound_bounce;
-int autocvar_g_nexball_trail_color;
-bool autocvar_g_nexball_playerclip_collisions = true;
-
-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;
-
-float autocvar_g_balance_nexball_primary_animtime;
-float autocvar_g_balance_nexball_primary_refire;
-float autocvar_g_balance_nexball_primary_speed;
-float autocvar_g_balance_nexball_secondary_animtime;
-float autocvar_g_balance_nexball_secondary_force;
-float autocvar_g_balance_nexball_secondary_lifetime;
-float autocvar_g_balance_nexball_secondary_refire;
-float autocvar_g_balance_nexball_secondary_speed;
-
-void basketball_touch(entity this, entity toucher);
-void football_touch(entity this, entity toucher);
-void ResetBall(entity this);
-const int NBM_NONE = 0;
-const int NBM_FOOTBALL = 2;
-const int NBM_BASKETBALL = 4;
-float nexball_mode;
-
-float OtherTeam(float t)  //works only if there are two teams on the map!
-{
-       entity e;
-       e = find(NULL, classname, "nexball_team");
-       if(e.team == t)
-               e = find(e, classname, "nexball_team");
-       return e.team;
-}
-
-const int ST_NEXBALL_GOALS = 1;
-void nb_ScoreRules(int teams)
-{
-    GameRules_scoring(teams, 0, 0, {
-        field_team(ST_NEXBALL_GOALS, "goals", SFL_SORT_PRIO_PRIMARY);
-        field(SP_NEXBALL_GOALS, "goals", SFL_SORT_PRIO_PRIMARY);
-        field(SP_NEXBALL_FAULTS, "faults", SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER);
-    });
-}
-
-void LogNB(string mode, entity actor)
-{
-       string s;
-       if(!autocvar_sv_eventlog)
-               return;
-       s = strcat(":nexball:", mode);
-       if(actor != NULL)
-               s = strcat(s, ":", ftos(actor.playerid));
-       GameLogEcho(s);
-}
-
-void ball_restart(entity this)
-{
-       if(this.owner)
-               DropBall(this, this.owner.origin, '0 0 0');
-       ResetBall(this);
-}
-
-void nexball_setstatus(entity this)
-{
-       this.items &= ~IT_KEY1;
-       if(this.ballcarried)
-       {
-               if(this.ballcarried.teamtime && (this.ballcarried.teamtime < time))
-               {
-                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_NEXBALL_RETURN_HELD));
-                       entity e = this.ballcarried;
-                       DropBall(this.ballcarried, this.ballcarried.owner.origin, '0 0 0');
-                       ResetBall(e);
-               }
-               else
-                       this.items |= IT_KEY1;
-       }
-}
-
-void relocate_nexball(entity this)
-{
-       tracebox(this.origin, BALL_MINS, BALL_MAXS, this.origin, true, this);
-       if(trace_startsolid)
-       {
-               vector o = this.origin;
-               if (!move_out_of_solid(this)) {
-                       objerror(this, "could not get out of solid at all!");
-        }
-        LOG_INFOF(
-            "^1NOTE: this map needs FIXING. %s at %s needs to be moved out of solid, e.g. by %s",
-            this.classname,
-            vtos(o - '0 0 1'),
-            vtos(this.origin - o)
-        );
-               this.origin = o;
-       }
-}
-
-void DropOwner(entity this)
-{
-       entity ownr;
-       ownr = this.owner;
-       DropBall(this, ownr.origin, ownr.velocity);
-       makevectors(ownr.v_angle.y * '0 1 0');
-       ownr.velocity += ('0 0 0.75' - v_forward) * 1000;
-       UNSET_ONGROUND(ownr);
-}
-
-void GiveBall(entity plyr, entity ball)
-{
-       .entity weaponentity = weaponentities[0]; // TODO: find ballstealer
-       entity ownr = ball.owner;
-       if(ownr)
-       {
-               ownr.effects &= ~autocvar_g_nexball_basketball_effects_default;
-               ownr.ballcarried = NULL;
-               GameRules_scoring_vip(ownr, false);
-               if(STAT(NB_METERSTART, ownr))
-               {
-                       STAT(NB_METERSTART, ownr) = 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.weaponentity_fld = weaponentity;
-       ball.team = plyr.team;
-       plyr.ballcarried = ball;
-       GameRules_scoring_vip(plyr, true);
-       ball.nb_dropper = plyr;
-
-       plyr.effects |= autocvar_g_nexball_basketball_effects_default;
-       ball.effects &= ~autocvar_g_nexball_basketball_effects_default;
-
-       ball.velocity = '0 0 0';
-       set_movetype(ball, MOVETYPE_NONE);
-       settouch(ball, func_null);
-       ball.effects |= EF_NOSHADOW;
-       ball.scale = 1; // scale down.
-
-       WaypointSprite_AttachCarrier(WP_NbBall, plyr, RADARICON_FLAGCARRIER);
-       WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-
-       if(autocvar_g_nexball_basketball_delay_hold)
-       {
-               setthink(ball, DropOwner);
-               ball.nextthink = time + autocvar_g_nexball_basketball_delay_hold;
-       }
-
-       STAT(WEAPONS, plyr.(weaponentity)) = STAT(WEAPONS, plyr);
-       plyr.m_switchweapon = plyr.(weaponentity).m_weapon;
-       STAT(WEAPONS, plyr) = WEPSET(NEXBALL);
-       Weapon w = WEP_NEXBALL;
-       w.wr_resetplayer(w, plyr);
-       plyr.(weaponentity).m_switchweapon = WEP_NEXBALL;
-       W_SwitchWeapon(plyr, WEP_NEXBALL, weaponentity);
-}
-
-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, NULL, "");
-       setorigin(ball, org);
-       set_movetype(ball, MOVETYPE_BOUNCE);
-       UNSET_ONGROUND(ball);
-       ball.scale = ball_scale;
-       ball.velocity = vel;
-       ball.nb_droptime = time;
-       settouch(ball, basketball_touch);
-       setthink(ball, ResetBall);
-       ball.nextthink = min(time + autocvar_g_nexball_delay_idle, ball.teamtime);
-
-       if(STAT(NB_METERSTART, ball.owner))
-       {
-               STAT(NB_METERSTART, ball.owner) = 0;
-               .entity weaponentity = ball.weaponentity_fld;
-               ball.owner.(weaponentity).state = WS_READY;
-       }
-
-       WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
-       WaypointSprite_Spawn(WP_NbBall, 0, 0, ball, '0 0 64', NULL, ball.team, ball, waypointsprite_attachedforcarrier, false, RADARICON_FLAGCARRIER); // no health bar please
-       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-
-       entity e = ball.owner; ball.owner = NULL;
-       e.ballcarried = NULL;
-       GameRules_scoring_vip(e, false);
-}
-
-void InitBall(entity this)
-{
-       if(game_stopped) return;
-       UNSET_ONGROUND(this);
-       set_movetype(this, MOVETYPE_BOUNCE);
-       if(this.classname == "nexball_basketball")
-               settouch(this, basketball_touch);
-       else if(this.classname == "nexball_football")
-               settouch(this, football_touch);
-       this.cnt = 0;
-       setthink(this, ResetBall);
-       this.nextthink = time + autocvar_g_nexball_delay_idle + 3;
-       this.teamtime = 0;
-       this.pusher = NULL;
-       this.team = false;
-       _sound(this, CH_TRIGGER, this.noise1, VOL_BASE, ATTEN_NORM);
-       WaypointSprite_Ping(this.waypointsprite_attachedforcarrier);
-       LogNB("init", NULL);
-}
-
-void ResetBall(entity this)
-{
-       if(this.cnt < 2)        // step 1
-       {
-               if(time == this.teamtime)
-                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_NEXBALL_RETURN_HELD));
-
-               settouch(this, func_null);
-               set_movetype(this, MOVETYPE_NOCLIP);
-               this.velocity = '0 0 0'; // just in case?
-               if(!this.cnt)
-                       LogNB("resetidle", NULL);
-               this.cnt = 2;
-               this.nextthink = time;
-       }
-       else if(this.cnt < 4)     // step 2 and 3
-       {
-//             dprint("Step ", ftos(this.cnt), ": Calculated velocity: ", vtos(this.spawnorigin - this.origin), ", time: ", ftos(time), "\n");
-               this.velocity = (this.spawnorigin - this.origin) * (this.cnt - 1); // 1 or 0.5 second movement
-               this.nextthink = time + 0.5;
-               this.cnt += 1;
-       }
-       else     // step 4
-       {
-//             dprint("Step 4: time: ", ftos(time), "\n");
-               if(vdist(this.origin - this.spawnorigin, >, 10)) // should not happen anymore
-                       LOG_TRACE("The ball moved too far away from its spawn origin.\nOffset: ",
-                                  vtos(this.origin - this.spawnorigin), " Velocity: ", vtos(this.velocity), "\n");
-               this.velocity = '0 0 0';
-               setorigin(this, this.spawnorigin); // make sure it's positioned correctly anyway
-               set_movetype(this, MOVETYPE_NONE);
-               setthink(this, InitBall);
-               this.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
-       }
-}
-
-void football_touch(entity this, entity toucher)
-{
-       if(toucher.solid == SOLID_BSP)
-       {
-               if(time > this.lastground + 0.1)
-               {
-                       _sound(this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
-                       this.lastground = time;
-               }
-               if(this.velocity && !this.cnt)
-                       this.nextthink = time + autocvar_g_nexball_delay_idle;
-               return;
-       }
-       if (!IS_PLAYER(toucher))
-               return;
-       if(GetResource(toucher, RES_HEALTH) < 1)
-               return;
-       if(!this.cnt)
-               this.nextthink = time + autocvar_g_nexball_delay_idle;
-
-       this.pusher = toucher;
-       this.team = toucher.team;
-
-       if(autocvar_g_nexball_football_physics == -1)   // MrBougo try 1, before decompiling Rev's original
-       {
-               if(toucher.velocity)
-                       this.velocity = toucher.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(toucher.v_angle);
-               this.velocity = toucher.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(toucher.v_angle.y * '0 1 0');
-               this.velocity = toucher.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(toucher.v_angle);
-               this.velocity = toucher.velocity + v_forward * autocvar_g_nexball_football_boost_forward + v_up * autocvar_g_nexball_football_boost_up;
-       }
-       this.avelocity = -250 * v_forward;  // maybe there is a way to make it look better?
-}
-
-void basketball_touch(entity this, entity toucher)
-{
-       if(toucher.ballcarried)
-       {
-               football_touch(this, toucher);
-               return;
-       }
-       if(!this.cnt && IS_PLAYER(toucher) && !STAT(FROZEN, toucher) && !IS_DEAD(toucher) && (toucher != this.nb_dropper || time > this.nb_droptime + autocvar_g_nexball_delay_collect))
-       {
-               if(GetResource(toucher, RES_HEALTH) < 1)
-                       return;
-               LogNB("caught", toucher);
-               GiveBall(toucher, this);
-       }
-       else if(toucher.solid == SOLID_BSP)
-       {
-               _sound(this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
-               if(this.velocity && !this.cnt)
-                       this.nextthink = min(time + autocvar_g_nexball_delay_idle, this.teamtime);
-       }
-}
-
-void GoalTouch(entity this, entity toucher)
-{
-       entity ball;
-       float isclient, pscore, otherteam;
-       string pname;
-
-       if(game_stopped) return;
-       if((this.spawnflags & GOAL_TOUCHPLAYER) && toucher.ballcarried)
-               ball = toucher.ballcarried;
-       else
-               ball = toucher;
-       if(ball.classname != "nexball_basketball")
-               if(ball.classname != "nexball_football")
-                       return;
-       if((!ball.pusher && this.team != GOAL_OUT) || ball.cnt)
-               return;
-       EXACTTRIGGER_TOUCH(this, toucher);
-
-
-       if(NumTeams(nb_teams) == 2)
-               otherteam = OtherTeam(ball.team);
-       else
-               otherteam = 0;
-
-       if((isclient = IS_CLIENT(ball.pusher)))
-               pname = ball.pusher.netname;
-       else
-               pname = "Someone (?)";
-
-       if(ball.team == this.team)               //owngoal (regular goals)
-       {
-               LogNB("owngoal", ball.pusher);
-               bprint("Boo! ", pname, "^7 scored a goal against their own team!\n");
-               pscore = -1;
-       }
-       else if(this.team == GOAL_FAULT)
-       {
-               LogNB("fault", ball.pusher);
-               if(NumTeams(nb_teams) == 2)
-                       bprint(Team_ColoredFullName(otherteam), " gets a point due to ", pname, "^7's silliness.\n");
-               else
-                       bprint(Team_ColoredFullName(ball.team), " loses a point due to ", pname, "^7's silliness.\n");
-               pscore = -1;
-       }
-       else if(this.team == GOAL_OUT)
-       {
-               LogNB("out", ball.pusher);
-               if((this.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(this.team)), ball.pusher);
-               bprint("Goaaaaal! ", pname, "^7 scored a point for the ", Team_ColoredFullName(ball.team), ".\n");
-               pscore = 1;
-       }
-
-       _sound(ball, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NONE);
-
-       if(ball.team && pscore)
-       {
-               if(NumTeams(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)
-                       GameRules_scoring_add(ball.pusher, NEXBALL_GOALS, pscore);
-               else if(pscore < 0)
-                       GameRules_scoring_add(ball.pusher, 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;
-       setthink(ball, ResetBall);
-       if(ball.classname == "nexball_basketball")
-               settouch(ball, football_touch); // better than func_null: football control until the ball gets reset
-       ball.nextthink = time + autocvar_g_nexball_delay_goal * (this.team != GOAL_OUT);
-}
-
-//=======================//
-//        team ents       //
-//=======================//
-spawnfunc(nexball_team)
-{
-       if(!g_nexball)
-       {
-               delete(this);
-               return;
-       }
-       this.team = this.cnt + 1;
-}
-
-void nb_spawnteam(string teamname, float teamcolor)
-{
-       LOG_TRACE("^2spawned team ", teamname);
-       entity e = new(nexball_team);
-       e.netname = teamname;
-       e.cnt = teamcolor;
-       e.team = e.cnt + 1;
-       //nb_teams += 1;
-}
-
-void nb_spawnteams()
-{
-       bool t_red = false, t_blue = false, t_yellow = false, t_pink = false;
-       entity e;
-       for(e = NULL; (e = find(e, classname, "nexball_goal"));)
-       {
-               switch(e.team)
-               {
-               case NUM_TEAM_1:
-                       if(!t_red)
-                       {
-                               nb_spawnteam("Red", e.team-1)   ;
-                               nb_teams |= BIT(0);
-                               t_red = true;
-                       }
-                       break;
-               case NUM_TEAM_2:
-                       if(!t_blue)
-                       {
-                               nb_spawnteam("Blue", e.team-1)  ;
-                               t_blue = true;
-                               nb_teams |= BIT(1);
-                       }
-                       break;
-               case NUM_TEAM_3:
-                       if(!t_yellow)
-                       {
-                               nb_spawnteam("Yellow", e.team-1);
-                               t_yellow = true;
-                               nb_teams |= BIT(2);
-                       }
-                       break;
-               case NUM_TEAM_4:
-                       if(!t_pink)
-                       {
-                               nb_spawnteam("Pink", e.team-1)  ;
-                               t_pink = true;
-                               nb_teams |= BIT(3);
-                       }
-                       break;
-               }
-       }
-}
-
-void nb_delayedinit(entity this)
-{
-       if(find(NULL, classname, "nexball_team") == NULL)
-               nb_spawnteams();
-       nb_ScoreRules(nb_teams);
-}
-
-
-//=======================//
-//       spawnfuncs       //
-//=======================//
-
-void SpawnBall(entity this)
-{
-       if(!g_nexball) { delete(this); return; }
-
-//     balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine
-
-       if(this.model == "")
-       {
-               this.model = "models/nexball/ball.md3";
-               this.scale = 1.3;
-       }
-
-       precache_model(this.model);
-       _setmodel(this, this.model);
-       setsize(this, BALL_MINS, BALL_MAXS);
-       ball_scale = this.scale;
-
-       relocate_nexball(this);
-       this.spawnorigin = this.origin;
-
-       this.effects = this.effects | EF_LOWPRECISION;
-
-       if(cvar(strcat("g_", this.classname, "_trail")))  //nexball_basketball :p
-       {
-               this.glow_color = autocvar_g_nexball_trail_color;
-               this.glow_trail = true;
-       }
-
-       set_movetype(this, MOVETYPE_FLY);
-
-       if(autocvar_g_nexball_playerclip_collisions)
-               this.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID | DPCONTENTS_PLAYERCLIP;
-
-       if(!autocvar_g_nexball_sound_bounce)
-               this.noise = "";
-       else if(this.noise == "")
-               this.noise = strzone(SND(NB_BOUNCE));
-       //bounce sound placeholder (FIXME)
-       if(this.noise1 == "")
-               this.noise1 = strzone(SND(NB_DROP));
-       //ball drop sound placeholder (FIXME)
-       if(this.noise2 == "")
-               this.noise2 = strzone(SND(NB_STEAL));
-       //stealing sound placeholder (FIXME)
-       if(this.noise) precache_sound(this.noise);
-       precache_sound(this.noise1);
-       precache_sound(this.noise2);
-
-       WaypointSprite_AttachCarrier(WP_NbBall, this, RADARICON_FLAGCARRIER); // the ball's team is not set yet, no rule update needed
-
-       this.reset = ball_restart;
-       setthink(this, InitBall);
-       this.nextthink = game_starttime + autocvar_g_nexball_delay_start;
-}
-
-spawnfunc(nexball_basketball)
-{
-       nexball_mode |= NBM_BASKETBALL;
-       this.classname = "nexball_basketball";
-       if (!(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(!this.effects)
-               this.effects = autocvar_g_nexball_basketball_effects_default;
-       this.solid = SOLID_TRIGGER;
-       this.pushable = autocvar_g_nexball_basketball_jumppad;
-       balls |= BALL_BASKET;
-       this.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
-       this.bouncestop = autocvar_g_nexball_basketball_bouncestop;
-       SpawnBall(this);
-}
-
-spawnfunc(nexball_football)
-{
-       nexball_mode |= NBM_FOOTBALL;
-       this.classname = "nexball_football";
-       this.solid = SOLID_TRIGGER;
-       balls |= BALL_FOOT;
-       this.pushable = autocvar_g_nexball_football_jumppad;
-       this.bouncefactor = autocvar_g_nexball_football_bouncefactor;
-       this.bouncestop = autocvar_g_nexball_football_bouncestop;
-       SpawnBall(this);
-}
-
-bool nb_Goal_Customize(entity this, entity client)
-{
-       entity e = WaypointSprite_getviewentity(client);
-       entity wp_owner = this.owner;
-       if(SAME_TEAM(e, wp_owner)) { return false; }
-
-       return true;
-}
-
-void SpawnGoal(entity this)
-{
-       if(!g_nexball) { delete(this); return; }
-
-       EXACTTRIGGER_INIT;
-
-       if(this.team != GOAL_OUT && Team_IsValidTeam(this.team))
-       {
-               entity wp = WaypointSprite_SpawnFixed(WP_NbGoal, (this.absmin + this.absmax) * 0.5, this, sprite, RADARICON_NONE);
-               wp.colormod = ((this.team) ? Team_ColorRGB(this.team) : '1 0.5 0');
-               setcefc(this.sprite, nb_Goal_Customize);
-       }
-
-       this.classname = "nexball_goal";
-       if(this.noise == "")
-               this.noise = "ctf/respawn.wav";
-       precache_sound(this.noise);
-       settouch(this, GoalTouch);
-}
-
-spawnfunc(nexball_redgoal)
-{
-       this.team = NUM_TEAM_1;
-       SpawnGoal(this);
-}
-spawnfunc(nexball_bluegoal)
-{
-       this.team = NUM_TEAM_2;
-       SpawnGoal(this);
-}
-spawnfunc(nexball_yellowgoal)
-{
-       this.team = NUM_TEAM_3;
-       SpawnGoal(this);
-}
-spawnfunc(nexball_pinkgoal)
-{
-       this.team = NUM_TEAM_4;
-       SpawnGoal(this);
-}
-
-spawnfunc(nexball_fault)
-{
-       this.team = GOAL_FAULT;
-       if(this.noise == "")
-               this.noise = strzone(SND(TYPEHIT));
-       SpawnGoal(this);
-}
-
-spawnfunc(nexball_out)
-{
-       this.team = GOAL_OUT;
-       if(this.noise == "")
-               this.noise = strzone(SND(TYPEHIT));
-       SpawnGoal(this);
-}
-
-//
-//Spawnfuncs preserved for compatibility
-//
-
-spawnfunc(ball)
-{
-       spawnfunc_nexball_football(this);
-}
-spawnfunc(ball_football)
-{
-       spawnfunc_nexball_football(this);
-}
-spawnfunc(ball_basketball)
-{
-       spawnfunc_nexball_basketball(this);
-}
-// The "red goal" is defended by blue team. A ball in there counts as a point for red.
-spawnfunc(ball_redgoal)
-{
-       spawnfunc_nexball_bluegoal(this);       // I blame Revenant
-}
-spawnfunc(ball_bluegoal)
-{
-       spawnfunc_nexball_redgoal(this);        // but he didn't mean to cause trouble :p
-}
-spawnfunc(ball_fault)
-{
-       spawnfunc_nexball_fault(this);
-}
-spawnfunc(ball_bound)
-{
-       spawnfunc_nexball_out(this);
-}
-
-bool ball_customize(entity this, entity client)
-{
-       if(!this.owner)
-       {
-               this.effects &= ~EF_FLAME;
-               this.scale = 1;
-               setcefc(this, func_null);
-               return true;
-       }
-
-       if(client == this.owner)
-       {
-               this.scale = autocvar_g_nexball_viewmodel_scale;
-               if(this.enemy)
-                       this.effects |= EF_FLAME;
-               else
-                       this.effects &= ~EF_FLAME;
-       }
-       else
-       {
-               this.effects &= ~EF_FLAME;
-               this.scale = 1;
-       }
-
-       return true;
-}
-
-void nb_DropBall(entity player)
-{
-       if(player.ballcarried && g_nexball)
-               DropBall(player.ballcarried, player.origin, player.velocity);
-}
-
-MUTATOR_HOOKFUNCTION(nb, ClientDisconnect)
-{
-       entity player = M_ARGV(0, entity);
-
-       nb_DropBall(player);
-}
-
-MUTATOR_HOOKFUNCTION(nb, PlayerDies)
-{
-       entity frag_target = M_ARGV(2, entity);
-
-       nb_DropBall(frag_target);
-}
-
-MUTATOR_HOOKFUNCTION(nb, MakePlayerObserver)
-{
-       entity player = M_ARGV(0, entity);
-
-       nb_DropBall(player);
-       return false;
-}
-
-MUTATOR_HOOKFUNCTION(nb, PlayerPreThink)
-{
-       entity player = M_ARGV(0, entity);
-
-       makevectors(player.v_angle);
-       if(nexball_mode & NBM_BASKETBALL)
-       {
-               if(player.ballcarried)
-               {
-                       // 'view ball'
-                       player.ballcarried.velocity = player.velocity;
-                       setcefc(player.ballcarried, ball_customize);
-
-                       vector org = player.origin + player.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;
-                       setorigin(player.ballcarried, org);
-
-                       // 'safe passing'
-                       if(autocvar_g_nexball_safepass_maxdist)
-                       {
-                               if(player.ballcarried.wait < time && player.ballcarried.enemy)
-                               {
-                                       //centerprint(player, sprintf("Lost lock on %s", player.ballcarried.enemy.netname));
-                                       player.ballcarried.enemy = NULL;
-                               }
-
-
-                               //tracebox(player.origin + player.view_ofs, '-2 -2 -2', '2 2 2', player.origin + player.view_ofs + v_forward * autocvar_g_nexball_safepass_maxdist);
-                               crosshair_trace(player);
-                               if( trace_ent &&
-                                       IS_CLIENT(trace_ent) &&
-                                       !IS_DEAD(trace_ent) &&
-                                       trace_ent.team == player.team &&
-                                       vdist(trace_ent.origin - player.origin, <=, autocvar_g_nexball_safepass_maxdist) )
-                               {
-
-                                       //if(player.ballcarried.enemy != trace_ent)
-                                       //      centerprint(player, sprintf("Locked to %s", trace_ent.netname));
-                                       player.ballcarried.enemy = trace_ent;
-                                       player.ballcarried.wait = time + autocvar_g_nexball_safepass_holdtime;
-
-
-                               }
-                       }
-               }
-               else
-               {
-                       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-                       {
-                               .entity weaponentity = weaponentities[slot];
-
-                               if(STAT(WEAPONS, player.(weaponentity)))
-                               {
-                                       STAT(WEAPONS, player) = STAT(WEAPONS, player.(weaponentity));
-                                       Weapon w = WEP_NEXBALL;
-                                       w.wr_resetplayer(w, player);
-                                       player.(weaponentity).m_switchweapon = player.m_switchweapon;
-                                       W_SwitchWeapon(player, player.(weaponentity).m_switchweapon, weaponentity);
-
-                                       STAT(WEAPONS, player.(weaponentity)) = '0 0 0';
-                               }
-                       }
-               }
-
-       }
-
-       nexball_setstatus(player);
-}
-
-MUTATOR_HOOKFUNCTION(nb, SpectateCopy)
-{
-       entity spectatee = M_ARGV(0, entity);
-       entity client = M_ARGV(1, entity);
-
-       STAT(NB_METERSTART, client) = STAT(NB_METERSTART, spectatee);
-}
-
-MUTATOR_HOOKFUNCTION(nb, PlayerSpawn)
-{
-       entity player = M_ARGV(0, entity);
-
-       STAT(NB_METERSTART, player) = 0;
-       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-       {
-               .entity weaponentity = weaponentities[slot];
-               STAT(WEAPONS, player.(weaponentity)) = '0 0 0';
-       }
-
-       if (nexball_mode & NBM_BASKETBALL)
-               STAT(WEAPONS, player) |= WEPSET(NEXBALL);
-       else
-               STAT(WEAPONS, player) = '0 0 0';
-
-       return false;
-}
-
-MUTATOR_HOOKFUNCTION(nb, PlayerPhysics_UpdateStats)
-{
-       entity player = M_ARGV(0, entity);
-       // these automatically reset, no need to worry
-
-       if(player.ballcarried)
-               STAT(MOVEVARS_HIGHSPEED, player) *= autocvar_g_nexball_basketball_carrier_highspeed;
-}
-
-MUTATOR_HOOKFUNCTION(nb, ForbidThrowCurrentWeapon)
-{
-       //entity player = M_ARGV(0, entity);
-       entity wepent = M_ARGV(1, entity);
-
-       return wepent.m_weapon == WEP_NEXBALL;
-}
-
-MUTATOR_HOOKFUNCTION(nb, ForbidDropCurrentWeapon)
-{
-       //entity player = M_ARGV(0, entity);
-       int wep = M_ARGV(1, int);
-
-       return wep == WEP_MORTAR.m_id; // TODO: what is this for?
-}
-
-MUTATOR_HOOKFUNCTION(nb, FilterItem)
-{
-       entity item = M_ARGV(0, entity);
-
-       if(Item_IsLoot(item))
-       if(item.weapon == WEP_NEXBALL.m_id)
-               return true;
-
-       return false;
-}
-
-MUTATOR_HOOKFUNCTION(nb, ItemTouch)
-{
-       entity item = M_ARGV(0, entity);
-       entity toucher = M_ARGV(1, entity);
-
-       if(item.weapon && toucher.ballcarried)
-               return MUT_ITEMTOUCH_RETURN; // no new weapons for you, mister!
-
-       return MUT_ITEMTOUCH_CONTINUE;
-}
-
-MUTATOR_HOOKFUNCTION(nb, TeamBalance_CheckAllowedTeams)
-{
-       M_ARGV(1, string) = "nexball_team";
-       return true;
-}
-
-MUTATOR_HOOKFUNCTION(nb, WantWeapon)
-{
-       M_ARGV(1, float) = 0; // weapon is set a few lines later, apparently
-       return true;
-}
-
-MUTATOR_HOOKFUNCTION(nb, DropSpecialItems)
-{
-       entity frag_target = M_ARGV(0, entity);
-
-       if(frag_target.ballcarried)
-               DropBall(frag_target.ballcarried, frag_target.origin, frag_target.velocity);
-
-       return false;
-}
-
-MUTATOR_HOOKFUNCTION(nb, SendWaypoint)
-{
-       M_ARGV(2, int) &= ~0x80;
-}
-
-REGISTER_MUTATOR(nb, g_nexball)
-{
-    MUTATOR_STATIC();
-       MUTATOR_ONADD
-       {
-               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
-
-               // 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(NULL, nb_delayedinit, INITPRIO_GAMETYPE);
-               WEP_NEXBALL.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
-
-               GameRules_teams(true);
-               GameRules_limit_score(autocvar_g_nexball_goallimit);
-               GameRules_limit_lead(autocvar_g_nexball_goalleadlimit);
-       }
-
-       MUTATOR_ONROLLBACK_OR_REMOVE
-       {
-               WEP_NEXBALL.spawnflags |= WEP_FLAG_MUTATORBLOCKED;
-       }
-       return 0;
-}
-
-#endif
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh
deleted file mode 100644 (file)
index 53797d2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#pragma once
-
-#ifdef SVQC
-//EF_BRIGHTFIELD|EF_BRIGHTLIGHT|EF_DIMLIGHT|EF_BLUE|EF_RED|EF_FLAME
-const float BALL_EFFECTMASK = 1229;
-const vector BALL_MINS = '-16 -16 -16'; // The model is 24*24*24
-const vector BALL_MAXS = '16 16 16';
-const vector BALL_ATTACHORG = '3 0 16';
-const float BALL_FOOT = 1;
-const float BALL_BASKET = 2;
-//spawnflags
-const float GOAL_TOUCHPLAYER = 1;
-//goal types
-const float GOAL_FAULT = -1;
-const float 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;
-
-.entity nb_dropper;
-.float nb_droptime;
-
-.float teamtime;
-#endif
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qc
new file mode 100644 (file)
index 0000000..38b7a7f
--- /dev/null
@@ -0,0 +1,969 @@
+#include "sv_nexball.qh"
+
+.entity ballcarried;
+
+int autocvar_g_nexball_goalleadlimit;
+#define autocvar_g_nexball_goallimit cvar("g_nexball_goallimit")
+
+bool autocvar_g_nexball_basketball_jumppad = true;
+float autocvar_g_nexball_basketball_bouncefactor;
+float autocvar_g_nexball_basketball_bouncestop;
+float autocvar_g_nexball_basketball_carrier_highspeed;
+bool autocvar_g_nexball_basketball_meter;
+float autocvar_g_nexball_basketball_meter_maxpower;
+float autocvar_g_nexball_basketball_meter_minpower;
+float autocvar_g_nexball_delay_collect;
+float autocvar_g_nexball_delay_goal;
+float autocvar_g_nexball_delay_start;
+bool autocvar_g_nexball_football_jumppad = true;
+float autocvar_g_nexball_football_bouncefactor;
+float autocvar_g_nexball_football_bouncestop;
+bool autocvar_g_nexball_radar_showallplayers;
+bool autocvar_g_nexball_sound_bounce;
+int autocvar_g_nexball_trail_color;
+bool autocvar_g_nexball_playerclip_collisions = true;
+
+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;
+
+float autocvar_g_balance_nexball_primary_animtime;
+float autocvar_g_balance_nexball_primary_refire;
+float autocvar_g_balance_nexball_primary_speed;
+float autocvar_g_balance_nexball_secondary_animtime;
+float autocvar_g_balance_nexball_secondary_force;
+float autocvar_g_balance_nexball_secondary_lifetime;
+float autocvar_g_balance_nexball_secondary_refire;
+float autocvar_g_balance_nexball_secondary_speed;
+
+void basketball_touch(entity this, entity toucher);
+void football_touch(entity this, entity toucher);
+void ResetBall(entity this);
+const int NBM_NONE = 0;
+const int NBM_FOOTBALL = 2;
+const int NBM_BASKETBALL = 4;
+float nexball_mode;
+
+float OtherTeam(float t)  //works only if there are two teams on the map!
+{
+       entity e;
+       e = find(NULL, classname, "nexball_team");
+       if(e.team == t)
+               e = find(e, classname, "nexball_team");
+       return e.team;
+}
+
+const int ST_NEXBALL_GOALS = 1;
+void nb_ScoreRules(int teams)
+{
+    GameRules_scoring(teams, 0, 0, {
+        field_team(ST_NEXBALL_GOALS, "goals", SFL_SORT_PRIO_PRIMARY);
+        field(SP_NEXBALL_GOALS, "goals", SFL_SORT_PRIO_PRIMARY);
+        field(SP_NEXBALL_FAULTS, "faults", SFL_SORT_PRIO_SECONDARY | SFL_LOWER_IS_BETTER);
+    });
+}
+
+void LogNB(string mode, entity actor)
+{
+       string s;
+       if(!autocvar_sv_eventlog)
+               return;
+       s = strcat(":nexball:", mode);
+       if(actor != NULL)
+               s = strcat(s, ":", ftos(actor.playerid));
+       GameLogEcho(s);
+}
+
+void ball_restart(entity this)
+{
+       if(this.owner)
+               DropBall(this, this.owner.origin, '0 0 0');
+       ResetBall(this);
+}
+
+void nexball_setstatus(entity this)
+{
+       this.items &= ~IT_KEY1;
+       if(this.ballcarried)
+       {
+               if(this.ballcarried.teamtime && (this.ballcarried.teamtime < time))
+               {
+                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_NEXBALL_RETURN_HELD));
+                       entity e = this.ballcarried;
+                       DropBall(this.ballcarried, this.ballcarried.owner.origin, '0 0 0');
+                       ResetBall(e);
+               }
+               else
+                       this.items |= IT_KEY1;
+       }
+}
+
+void relocate_nexball(entity this)
+{
+       tracebox(this.origin, BALL_MINS, BALL_MAXS, this.origin, true, this);
+       if(trace_startsolid)
+       {
+               vector o = this.origin;
+               if (!move_out_of_solid(this)) {
+                       objerror(this, "could not get out of solid at all!");
+        }
+        LOG_INFOF(
+            "^1NOTE: this map needs FIXING. %s at %s needs to be moved out of solid, e.g. by %s",
+            this.classname,
+            vtos(o - '0 0 1'),
+            vtos(this.origin - o)
+        );
+               this.origin = o;
+       }
+}
+
+void DropOwner(entity this)
+{
+       entity ownr;
+       ownr = this.owner;
+       DropBall(this, ownr.origin, ownr.velocity);
+       makevectors(ownr.v_angle.y * '0 1 0');
+       ownr.velocity += ('0 0 0.75' - v_forward) * 1000;
+       UNSET_ONGROUND(ownr);
+}
+
+void GiveBall(entity plyr, entity ball)
+{
+       .entity weaponentity = weaponentities[0]; // TODO: find ballstealer
+       entity ownr = ball.owner;
+       if(ownr)
+       {
+               ownr.effects &= ~autocvar_g_nexball_basketball_effects_default;
+               ownr.ballcarried = NULL;
+               GameRules_scoring_vip(ownr, false);
+               if(STAT(NB_METERSTART, ownr))
+               {
+                       STAT(NB_METERSTART, ownr) = 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.weaponentity_fld = weaponentity;
+       ball.team = plyr.team;
+       plyr.ballcarried = ball;
+       GameRules_scoring_vip(plyr, true);
+       ball.nb_dropper = plyr;
+
+       plyr.effects |= autocvar_g_nexball_basketball_effects_default;
+       ball.effects &= ~autocvar_g_nexball_basketball_effects_default;
+
+       ball.velocity = '0 0 0';
+       set_movetype(ball, MOVETYPE_NONE);
+       settouch(ball, func_null);
+       ball.effects |= EF_NOSHADOW;
+       ball.scale = 1; // scale down.
+
+       WaypointSprite_AttachCarrier(WP_NbBall, plyr, RADARICON_FLAGCARRIER);
+       WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       if(autocvar_g_nexball_basketball_delay_hold)
+       {
+               setthink(ball, DropOwner);
+               ball.nextthink = time + autocvar_g_nexball_basketball_delay_hold;
+       }
+
+       STAT(WEAPONS, plyr.(weaponentity)) = STAT(WEAPONS, plyr);
+       plyr.m_switchweapon = plyr.(weaponentity).m_weapon;
+       STAT(WEAPONS, plyr) = WEPSET(NEXBALL);
+       Weapon w = WEP_NEXBALL;
+       w.wr_resetplayer(w, plyr);
+       plyr.(weaponentity).m_switchweapon = WEP_NEXBALL;
+       W_SwitchWeapon(plyr, WEP_NEXBALL, weaponentity);
+}
+
+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, NULL, "");
+       setorigin(ball, org);
+       set_movetype(ball, MOVETYPE_BOUNCE);
+       UNSET_ONGROUND(ball);
+       ball.scale = ball_scale;
+       ball.velocity = vel;
+       ball.nb_droptime = time;
+       settouch(ball, basketball_touch);
+       setthink(ball, ResetBall);
+       ball.nextthink = min(time + autocvar_g_nexball_delay_idle, ball.teamtime);
+
+       if(STAT(NB_METERSTART, ball.owner))
+       {
+               STAT(NB_METERSTART, ball.owner) = 0;
+               .entity weaponentity = ball.weaponentity_fld;
+               ball.owner.(weaponentity).state = WS_READY;
+       }
+
+       WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
+       WaypointSprite_Spawn(WP_NbBall, 0, 0, ball, '0 0 64', NULL, ball.team, ball, waypointsprite_attachedforcarrier, false, RADARICON_FLAGCARRIER); // no health bar please
+       WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
+
+       entity e = ball.owner; ball.owner = NULL;
+       e.ballcarried = NULL;
+       GameRules_scoring_vip(e, false);
+}
+
+void InitBall(entity this)
+{
+       if(game_stopped) return;
+       UNSET_ONGROUND(this);
+       set_movetype(this, MOVETYPE_BOUNCE);
+       if(this.classname == "nexball_basketball")
+               settouch(this, basketball_touch);
+       else if(this.classname == "nexball_football")
+               settouch(this, football_touch);
+       this.cnt = 0;
+       setthink(this, ResetBall);
+       this.nextthink = time + autocvar_g_nexball_delay_idle + 3;
+       this.teamtime = 0;
+       this.pusher = NULL;
+       this.team = false;
+       _sound(this, CH_TRIGGER, this.noise1, VOL_BASE, ATTEN_NORM);
+       WaypointSprite_Ping(this.waypointsprite_attachedforcarrier);
+       LogNB("init", NULL);
+}
+
+void ResetBall(entity this)
+{
+       if(this.cnt < 2)        // step 1
+       {
+               if(time == this.teamtime)
+                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_NEXBALL_RETURN_HELD));
+
+               settouch(this, func_null);
+               set_movetype(this, MOVETYPE_NOCLIP);
+               this.velocity = '0 0 0'; // just in case?
+               if(!this.cnt)
+                       LogNB("resetidle", NULL);
+               this.cnt = 2;
+               this.nextthink = time;
+       }
+       else if(this.cnt < 4)     // step 2 and 3
+       {
+//             dprint("Step ", ftos(this.cnt), ": Calculated velocity: ", vtos(this.spawnorigin - this.origin), ", time: ", ftos(time), "\n");
+               this.velocity = (this.spawnorigin - this.origin) * (this.cnt - 1); // 1 or 0.5 second movement
+               this.nextthink = time + 0.5;
+               this.cnt += 1;
+       }
+       else     // step 4
+       {
+//             dprint("Step 4: time: ", ftos(time), "\n");
+               if(vdist(this.origin - this.spawnorigin, >, 10)) // should not happen anymore
+                       LOG_TRACE("The ball moved too far away from its spawn origin.\nOffset: ",
+                                  vtos(this.origin - this.spawnorigin), " Velocity: ", vtos(this.velocity), "\n");
+               this.velocity = '0 0 0';
+               setorigin(this, this.spawnorigin); // make sure it's positioned correctly anyway
+               set_movetype(this, MOVETYPE_NONE);
+               setthink(this, InitBall);
+               this.nextthink = max(time, game_starttime) + autocvar_g_nexball_delay_start;
+       }
+}
+
+void football_touch(entity this, entity toucher)
+{
+       if(toucher.solid == SOLID_BSP)
+       {
+               if(time > this.lastground + 0.1)
+               {
+                       _sound(this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
+                       this.lastground = time;
+               }
+               if(this.velocity && !this.cnt)
+                       this.nextthink = time + autocvar_g_nexball_delay_idle;
+               return;
+       }
+       if (!IS_PLAYER(toucher) && !IS_VEHICLE(toucher))
+               return;
+       if(GetResource(toucher, RES_HEALTH) < 1)
+               return;
+       if(!this.cnt)
+               this.nextthink = time + autocvar_g_nexball_delay_idle;
+
+       this.pusher = toucher;
+       this.team = toucher.team;
+
+       if(autocvar_g_nexball_football_physics == -1)   // MrBougo try 1, before decompiling Rev's original
+       {
+               if(toucher.velocity)
+                       this.velocity = toucher.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(toucher.v_angle);
+               this.velocity = toucher.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(toucher.v_angle.y * '0 1 0');
+               this.velocity = toucher.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(toucher.v_angle);
+               this.velocity = toucher.velocity + v_forward * autocvar_g_nexball_football_boost_forward + v_up * autocvar_g_nexball_football_boost_up;
+       }
+       this.avelocity = -250 * v_forward;  // maybe there is a way to make it look better?
+}
+
+void basketball_touch(entity this, entity toucher)
+{
+       if(toucher.ballcarried)
+       {
+               football_touch(this, toucher);
+               return;
+       }
+       if(!this.cnt && IS_PLAYER(toucher) && !STAT(FROZEN, toucher) && !IS_DEAD(toucher) && (toucher != this.nb_dropper || time > this.nb_droptime + autocvar_g_nexball_delay_collect))
+       {
+               if(GetResource(toucher, RES_HEALTH) < 1)
+                       return;
+               LogNB("caught", toucher);
+               GiveBall(toucher, this);
+       }
+       else if(toucher.solid == SOLID_BSP)
+       {
+               _sound(this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
+               if(this.velocity && !this.cnt)
+                       this.nextthink = min(time + autocvar_g_nexball_delay_idle, this.teamtime);
+       }
+}
+
+void GoalTouch(entity this, entity toucher)
+{
+       entity ball;
+       float isclient, pscore, otherteam;
+       string pname;
+
+       if(game_stopped) return;
+       if((this.spawnflags & GOAL_TOUCHPLAYER) && toucher.ballcarried)
+               ball = toucher.ballcarried;
+       else
+               ball = toucher;
+       if(ball.classname != "nexball_basketball")
+               if(ball.classname != "nexball_football")
+                       return;
+       if((!ball.pusher && this.team != GOAL_OUT) || ball.cnt)
+               return;
+       EXACTTRIGGER_TOUCH(this, toucher);
+
+
+       if(NumTeams(nb_teams) == 2)
+               otherteam = OtherTeam(ball.team);
+       else
+               otherteam = 0;
+
+       if((isclient = IS_CLIENT(ball.pusher)))
+               pname = ball.pusher.netname;
+       else
+               pname = "Someone (?)";
+
+       if(ball.team == this.team)               //owngoal (regular goals)
+       {
+               LogNB("owngoal", ball.pusher);
+               bprint("Boo! ", pname, "^7 scored a goal against their own team!\n");
+               pscore = -1;
+       }
+       else if(this.team == GOAL_FAULT)
+       {
+               LogNB("fault", ball.pusher);
+               if(NumTeams(nb_teams) == 2)
+                       bprint(Team_ColoredFullName(otherteam), " gets a point due to ", pname, "^7's silliness.\n");
+               else
+                       bprint(Team_ColoredFullName(ball.team), " loses a point due to ", pname, "^7's silliness.\n");
+               pscore = -1;
+       }
+       else if(this.team == GOAL_OUT)
+       {
+               LogNB("out", ball.pusher);
+               if((this.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(this.team)), ball.pusher);
+               bprint("Goaaaaal! ", pname, "^7 scored a point for the ", Team_ColoredFullName(ball.team), ".\n");
+               pscore = 1;
+       }
+
+       _sound(ball, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NONE);
+
+       if(ball.team && pscore)
+       {
+               if(NumTeams(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)
+                       GameRules_scoring_add(ball.pusher, NEXBALL_GOALS, pscore);
+               else if(pscore < 0)
+                       GameRules_scoring_add(ball.pusher, 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;
+       setthink(ball, ResetBall);
+       if(ball.classname == "nexball_basketball")
+               settouch(ball, football_touch); // better than func_null: football control until the ball gets reset
+       ball.nextthink = time + autocvar_g_nexball_delay_goal * (this.team != GOAL_OUT);
+}
+
+//=======================//
+//        team ents       //
+//=======================//
+spawnfunc(nexball_team)
+{
+       if(!g_nexball)
+       {
+               delete(this);
+               return;
+       }
+       this.team = this.cnt + 1;
+}
+
+void nb_spawnteam(string teamname, float teamcolor)
+{
+       LOG_TRACE("^2spawned team ", teamname);
+       entity e = new(nexball_team);
+       e.netname = teamname;
+       e.cnt = teamcolor;
+       e.team = e.cnt + 1;
+       //nb_teams += 1;
+}
+
+void nb_spawnteams()
+{
+       bool t_red = false, t_blue = false, t_yellow = false, t_pink = false;
+       entity e;
+       for(e = NULL; (e = find(e, classname, "nexball_goal"));)
+       {
+               switch(e.team)
+               {
+               case NUM_TEAM_1:
+                       if(!t_red)
+                       {
+                               nb_spawnteam("Red", e.team-1)   ;
+                               nb_teams |= BIT(0);
+                               t_red = true;
+                       }
+                       break;
+               case NUM_TEAM_2:
+                       if(!t_blue)
+                       {
+                               nb_spawnteam("Blue", e.team-1)  ;
+                               t_blue = true;
+                               nb_teams |= BIT(1);
+                       }
+                       break;
+               case NUM_TEAM_3:
+                       if(!t_yellow)
+                       {
+                               nb_spawnteam("Yellow", e.team-1);
+                               t_yellow = true;
+                               nb_teams |= BIT(2);
+                       }
+                       break;
+               case NUM_TEAM_4:
+                       if(!t_pink)
+                       {
+                               nb_spawnteam("Pink", e.team-1)  ;
+                               t_pink = true;
+                               nb_teams |= BIT(3);
+                       }
+                       break;
+               }
+       }
+}
+
+void nb_delayedinit(entity this)
+{
+       if(find(NULL, classname, "nexball_team") == NULL)
+               nb_spawnteams();
+       nb_ScoreRules(nb_teams);
+}
+
+
+//=======================//
+//       spawnfuncs       //
+//=======================//
+
+void SpawnBall(entity this)
+{
+       if(!g_nexball) { delete(this); return; }
+
+//     balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine
+
+       if(this.model == "")
+       {
+               this.model = "models/nexball/ball.md3";
+               this.scale = 1.3;
+       }
+
+       precache_model(this.model);
+       _setmodel(this, this.model);
+       setsize(this, BALL_MINS, BALL_MAXS);
+       ball_scale = this.scale;
+
+       relocate_nexball(this);
+       this.spawnorigin = this.origin;
+
+       this.effects = this.effects | EF_LOWPRECISION;
+
+       if(cvar(strcat("g_", this.classname, "_trail")))  //nexball_basketball :p
+       {
+               this.glow_color = autocvar_g_nexball_trail_color;
+               this.glow_trail = true;
+       }
+
+       set_movetype(this, MOVETYPE_FLY);
+
+       if(autocvar_g_nexball_playerclip_collisions)
+               this.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID | DPCONTENTS_PLAYERCLIP;
+
+       if(!autocvar_g_nexball_sound_bounce)
+               this.noise = "";
+       else if(this.noise == "")
+               this.noise = strzone(SND(NB_BOUNCE));
+       //bounce sound placeholder (FIXME)
+       if(this.noise1 == "")
+               this.noise1 = strzone(SND(NB_DROP));
+       //ball drop sound placeholder (FIXME)
+       if(this.noise2 == "")
+               this.noise2 = strzone(SND(NB_STEAL));
+       //stealing sound placeholder (FIXME)
+       if(this.noise) precache_sound(this.noise);
+       precache_sound(this.noise1);
+       precache_sound(this.noise2);
+
+       WaypointSprite_AttachCarrier(WP_NbBall, this, RADARICON_FLAGCARRIER); // the ball's team is not set yet, no rule update needed
+
+       this.reset = ball_restart;
+       setthink(this, InitBall);
+       this.nextthink = game_starttime + autocvar_g_nexball_delay_start;
+}
+
+spawnfunc(nexball_basketball)
+{
+       nexball_mode |= NBM_BASKETBALL;
+       this.classname = "nexball_basketball";
+       if (!(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(!this.effects)
+               this.effects = autocvar_g_nexball_basketball_effects_default;
+       this.solid = SOLID_TRIGGER;
+       this.pushable = autocvar_g_nexball_basketball_jumppad;
+       balls |= BALL_BASKET;
+       this.bouncefactor = autocvar_g_nexball_basketball_bouncefactor;
+       this.bouncestop = autocvar_g_nexball_basketball_bouncestop;
+       SpawnBall(this);
+}
+
+spawnfunc(nexball_football)
+{
+       nexball_mode |= NBM_FOOTBALL;
+       this.classname = "nexball_football";
+       this.solid = SOLID_TRIGGER;
+       balls |= BALL_FOOT;
+       this.pushable = autocvar_g_nexball_football_jumppad;
+       this.bouncefactor = autocvar_g_nexball_football_bouncefactor;
+       this.bouncestop = autocvar_g_nexball_football_bouncestop;
+       SpawnBall(this);
+}
+
+bool nb_Goal_Customize(entity this, entity client)
+{
+       entity e = WaypointSprite_getviewentity(client);
+       entity wp_owner = this.owner;
+       if(SAME_TEAM(e, wp_owner)) { return false; }
+
+       return true;
+}
+
+void SpawnGoal(entity this)
+{
+       if(!g_nexball) { delete(this); return; }
+
+       EXACTTRIGGER_INIT;
+
+       if(this.team != GOAL_OUT && Team_IsValidTeam(this.team))
+       {
+               entity wp = WaypointSprite_SpawnFixed(WP_NbGoal, (this.absmin + this.absmax) * 0.5, this, sprite, RADARICON_NONE);
+               wp.colormod = ((this.team) ? Team_ColorRGB(this.team) : '1 0.5 0');
+               setcefc(this.sprite, nb_Goal_Customize);
+       }
+
+       this.classname = "nexball_goal";
+       if(this.noise == "")
+               this.noise = "ctf/respawn.wav";
+       precache_sound(this.noise);
+       settouch(this, GoalTouch);
+}
+
+spawnfunc(nexball_redgoal)
+{
+       this.team = NUM_TEAM_1;
+       SpawnGoal(this);
+}
+spawnfunc(nexball_bluegoal)
+{
+       this.team = NUM_TEAM_2;
+       SpawnGoal(this);
+}
+spawnfunc(nexball_yellowgoal)
+{
+       this.team = NUM_TEAM_3;
+       SpawnGoal(this);
+}
+spawnfunc(nexball_pinkgoal)
+{
+       this.team = NUM_TEAM_4;
+       SpawnGoal(this);
+}
+
+spawnfunc(nexball_fault)
+{
+       this.team = GOAL_FAULT;
+       if(this.noise == "")
+               this.noise = strzone(SND(TYPEHIT));
+       SpawnGoal(this);
+}
+
+spawnfunc(nexball_out)
+{
+       this.team = GOAL_OUT;
+       if(this.noise == "")
+               this.noise = strzone(SND(TYPEHIT));
+       SpawnGoal(this);
+}
+
+//
+//Spawnfuncs preserved for compatibility
+//
+
+spawnfunc(ball)
+{
+       spawnfunc_nexball_football(this);
+}
+spawnfunc(ball_football)
+{
+       spawnfunc_nexball_football(this);
+}
+spawnfunc(ball_basketball)
+{
+       spawnfunc_nexball_basketball(this);
+}
+// The "red goal" is defended by blue team. A ball in there counts as a point for red.
+spawnfunc(ball_redgoal)
+{
+       spawnfunc_nexball_bluegoal(this);       // I blame Revenant
+}
+spawnfunc(ball_bluegoal)
+{
+       spawnfunc_nexball_redgoal(this);        // but he didn't mean to cause trouble :p
+}
+spawnfunc(ball_fault)
+{
+       spawnfunc_nexball_fault(this);
+}
+spawnfunc(ball_bound)
+{
+       spawnfunc_nexball_out(this);
+}
+
+bool ball_customize(entity this, entity client)
+{
+       if(!this.owner)
+       {
+               this.effects &= ~EF_FLAME;
+               this.scale = 1;
+               setcefc(this, func_null);
+               return true;
+       }
+
+       if(client == this.owner)
+       {
+               this.scale = autocvar_g_nexball_viewmodel_scale;
+               if(this.enemy)
+                       this.effects |= EF_FLAME;
+               else
+                       this.effects &= ~EF_FLAME;
+       }
+       else
+       {
+               this.effects &= ~EF_FLAME;
+               this.scale = 1;
+       }
+
+       return true;
+}
+
+void nb_DropBall(entity player)
+{
+       if(player.ballcarried && g_nexball)
+               DropBall(player.ballcarried, player.origin, player.velocity);
+}
+
+MUTATOR_HOOKFUNCTION(nb, ClientDisconnect)
+{
+       entity player = M_ARGV(0, entity);
+
+       nb_DropBall(player);
+}
+
+MUTATOR_HOOKFUNCTION(nb, PlayerDies)
+{
+       entity frag_target = M_ARGV(2, entity);
+
+       nb_DropBall(frag_target);
+}
+
+MUTATOR_HOOKFUNCTION(nb, MakePlayerObserver)
+{
+       entity player = M_ARGV(0, entity);
+
+       nb_DropBall(player);
+       return false;
+}
+
+MUTATOR_HOOKFUNCTION(nb, PlayerPreThink)
+{
+       entity player = M_ARGV(0, entity);
+
+       makevectors(player.v_angle);
+       if(nexball_mode & NBM_BASKETBALL)
+       {
+               if(player.ballcarried)
+               {
+                       // 'view ball'
+                       player.ballcarried.velocity = player.velocity;
+                       setcefc(player.ballcarried, ball_customize);
+
+                       vector org = player.origin + player.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;
+                       setorigin(player.ballcarried, org);
+
+                       // 'safe passing'
+                       if(autocvar_g_nexball_safepass_maxdist)
+                       {
+                               if(player.ballcarried.wait < time && player.ballcarried.enemy)
+                               {
+                                       //centerprint(player, sprintf("Lost lock on %s", player.ballcarried.enemy.netname));
+                                       player.ballcarried.enemy = NULL;
+                               }
+
+
+                               //tracebox(player.origin + player.view_ofs, '-2 -2 -2', '2 2 2', player.origin + player.view_ofs + v_forward * autocvar_g_nexball_safepass_maxdist);
+                               crosshair_trace(player);
+                               if( trace_ent &&
+                                       IS_CLIENT(trace_ent) &&
+                                       !IS_DEAD(trace_ent) &&
+                                       trace_ent.team == player.team &&
+                                       vdist(trace_ent.origin - player.origin, <=, autocvar_g_nexball_safepass_maxdist) )
+                               {
+
+                                       //if(player.ballcarried.enemy != trace_ent)
+                                       //      centerprint(player, sprintf("Locked to %s", trace_ent.netname));
+                                       player.ballcarried.enemy = trace_ent;
+                                       player.ballcarried.wait = time + autocvar_g_nexball_safepass_holdtime;
+
+
+                               }
+                       }
+               }
+               else
+               {
+                       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+                       {
+                               .entity weaponentity = weaponentities[slot];
+
+                               if(STAT(WEAPONS, player.(weaponentity)))
+                               {
+                                       STAT(WEAPONS, player) = STAT(WEAPONS, player.(weaponentity));
+                                       Weapon w = WEP_NEXBALL;
+                                       w.wr_resetplayer(w, player);
+                                       player.(weaponentity).m_switchweapon = player.m_switchweapon;
+                                       W_SwitchWeapon(player, player.(weaponentity).m_switchweapon, weaponentity);
+
+                                       STAT(WEAPONS, player.(weaponentity)) = '0 0 0';
+                               }
+                       }
+               }
+
+       }
+
+       nexball_setstatus(player);
+}
+
+MUTATOR_HOOKFUNCTION(nb, SpectateCopy)
+{
+       entity spectatee = M_ARGV(0, entity);
+       entity client = M_ARGV(1, entity);
+
+       STAT(NB_METERSTART, client) = STAT(NB_METERSTART, spectatee);
+}
+
+MUTATOR_HOOKFUNCTION(nb, PlayerSpawn)
+{
+       entity player = M_ARGV(0, entity);
+
+       STAT(NB_METERSTART, player) = 0;
+       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+       {
+               .entity weaponentity = weaponentities[slot];
+               STAT(WEAPONS, player.(weaponentity)) = '0 0 0';
+       }
+
+       if (nexball_mode & NBM_BASKETBALL)
+               STAT(WEAPONS, player) |= WEPSET(NEXBALL);
+       else
+               STAT(WEAPONS, player) = '0 0 0';
+
+       return false;
+}
+
+MUTATOR_HOOKFUNCTION(nb, PlayerPhysics_UpdateStats)
+{
+       entity player = M_ARGV(0, entity);
+       // these automatically reset, no need to worry
+
+       if(player.ballcarried)
+               STAT(MOVEVARS_HIGHSPEED, player) *= autocvar_g_nexball_basketball_carrier_highspeed;
+}
+
+MUTATOR_HOOKFUNCTION(nb, ForbidThrowCurrentWeapon)
+{
+       //entity player = M_ARGV(0, entity);
+       entity wepent = M_ARGV(1, entity);
+
+       return wepent.m_weapon == WEP_NEXBALL;
+}
+
+MUTATOR_HOOKFUNCTION(nb, ForbidDropCurrentWeapon)
+{
+       //entity player = M_ARGV(0, entity);
+       int wep = M_ARGV(1, int);
+
+       return wep == WEP_MORTAR.m_id; // TODO: what is this for?
+}
+
+MUTATOR_HOOKFUNCTION(nb, FilterItem)
+{
+       entity item = M_ARGV(0, entity);
+
+       if(Item_IsLoot(item))
+       if(item.weapon == WEP_NEXBALL.m_id)
+               return true;
+
+       return false;
+}
+
+MUTATOR_HOOKFUNCTION(nb, ItemTouch)
+{
+       entity item = M_ARGV(0, entity);
+       entity toucher = M_ARGV(1, entity);
+
+       if(item.weapon && toucher.ballcarried)
+               return MUT_ITEMTOUCH_RETURN; // no new weapons for you, mister!
+
+       return MUT_ITEMTOUCH_CONTINUE;
+}
+
+MUTATOR_HOOKFUNCTION(nb, TeamBalance_CheckAllowedTeams)
+{
+       M_ARGV(1, string) = "nexball_team";
+       return true;
+}
+
+MUTATOR_HOOKFUNCTION(nb, WantWeapon)
+{
+       M_ARGV(1, float) = 0; // weapon is set a few lines later, apparently
+       return true;
+}
+
+MUTATOR_HOOKFUNCTION(nb, DropSpecialItems)
+{
+       entity frag_target = M_ARGV(0, entity);
+
+       if(frag_target.ballcarried)
+               DropBall(frag_target.ballcarried, frag_target.origin, frag_target.velocity);
+
+       return false;
+}
+
+MUTATOR_HOOKFUNCTION(nb, SendWaypoint)
+{
+       M_ARGV(2, int) &= ~0x80;
+}
+
+REGISTER_MUTATOR(nb, false)
+{
+    MUTATOR_STATIC();
+       MUTATOR_ONADD
+       {
+               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
+
+               // 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(NULL, nb_delayedinit, INITPRIO_GAMETYPE);
+               WEP_NEXBALL.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
+
+               GameRules_teams(true);
+               GameRules_limit_score(autocvar_g_nexball_goallimit);
+               GameRules_limit_lead(autocvar_g_nexball_goalleadlimit);
+       }
+
+       MUTATOR_ONROLLBACK_OR_REMOVE
+       {
+               WEP_NEXBALL.spawnflags |= WEP_FLAG_MUTATORBLOCKED;
+       }
+       return 0;
+}
diff --git a/qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qh b/qcsrc/common/gamemodes/gamemode/nexball/sv_nexball.qh
new file mode 100644 (file)
index 0000000..d7cde3a
--- /dev/null
@@ -0,0 +1,34 @@
+#pragma once
+
+//EF_BRIGHTFIELD|EF_BRIGHTLIGHT|EF_DIMLIGHT|EF_BLUE|EF_RED|EF_FLAME
+const float BALL_EFFECTMASK = 1229;
+const vector BALL_MINS = '-16 -16 -16'; // The model is 24*24*24
+const vector BALL_MAXS = '16 16 16';
+const vector BALL_ATTACHORG = '3 0 16';
+const float BALL_FOOT = 1;
+const float BALL_BASKET = 2;
+//spawnflags
+const float GOAL_TOUCHPLAYER = 1;
+//goal types
+const float GOAL_FAULT = -1;
+const float 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;
+
+.entity nb_dropper;
+.float nb_droptime;
+
+.float teamtime;
index 73b887260c10b785d4a60c013f6dd0ef87925625..7790663ace981cee2d938bdb75f4bf11debc25db 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 CLASS(BallStealer, PortoLaunch)
-/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED);
+/* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
 /* impulse   */ ATTRIB(BallStealer, impulse, int, 0);
 /* refname   */ ATTRIB(BallStealer, netname, string, "ballstealer");
 /* wepname   */ ATTRIB(BallStealer, m_name, string, _("Ball Stealer"));
index d4303efbd97124579a115c916b86aee7a0a54056..3128bae26684ecace22264ff3ef5fba9c3bd5d2a 100644 (file)
@@ -988,7 +988,7 @@ void ons_GeneratorThink(entity this)
                {
                        Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_ONS_NOTSHIELDED_TEAM);
                        msg_entity = it;
-                       soundto(MSG_ONE, this, CHAN_AUTO, SND(KH_ALARM), VOL_BASE, ATTEN_NONE); // FIXME: unique sound?
+                       soundto(MSG_ONE, this, CHAN_AUTO, SND(ONS_GENERATOR_ALARM), VOL_BASE, ATTEN_NONE);
                }
                else
                        Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_ONS_NOTSHIELDED));
index a0f67b759b9981c72d7e2e27a5394479c111a275..729f7e236e697e2aaef3a696b2f8d3f94a694e31 100644 (file)
@@ -10,12 +10,26 @@ bool corner_send(entity this, entity to, int sf)
 
        WriteVector(MSG_ENTITY, this.origin);
 
-       WriteString(MSG_ENTITY, this.target);
-       WriteString(MSG_ENTITY, this.target2);
-       WriteString(MSG_ENTITY, this.target3);
-       WriteString(MSG_ENTITY, this.target4);
-       WriteString(MSG_ENTITY, this.targetname);
-       WriteByte(MSG_ENTITY, this.target_random);
+       sf = 0;
+       sf = BITSET(sf, BIT(0), this.target_random);
+
+       sf = BITSET(sf, BIT(1), this.target && this.target != "");
+       sf = BITSET(sf, BIT(2), this.target2 && this.target2 != "");
+       sf = BITSET(sf, BIT(3), this.target3 && this.target3 != "");
+       sf = BITSET(sf, BIT(4), this.target4 && this.target4 != "");
+       sf = BITSET(sf, BIT(5), this.targetname && this.targetname != "");
+
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & BIT(1))
+               WriteString(MSG_ENTITY, this.target);
+       if(sf & BIT(2))
+               WriteString(MSG_ENTITY, this.target2);
+       if(sf & BIT(3))
+               WriteString(MSG_ENTITY, this.target3);
+       if(sf & BIT(4))
+               WriteString(MSG_ENTITY, this.target4);
+       if(sf & BIT(5))
+               WriteString(MSG_ENTITY, this.targetname);
 
        WriteByte(MSG_ENTITY, this.wait);
 
@@ -54,12 +68,14 @@ NET_HANDLE(ENT_CLIENT_CORNER, bool isnew)
        this.origin = ReadVector();
        setorigin(this, this.origin);
 
-       this.target = strzone(ReadString());
-       this.target2 = strzone(ReadString());
-       this.target3 = strzone(ReadString());
-       this.target4 = strzone(ReadString());
-       this.targetname = strzone(ReadString());
-       this.target_random = ReadByte();
+       int targbits = ReadByte();
+       this.target_random = (targbits & BIT(0));
+
+       this.target = ((targbits & BIT(1)) ? strzone(ReadString()) : string_null);
+       this.target2 = ((targbits & BIT(2)) ? strzone(ReadString()) : string_null);
+       this.target3 = ((targbits & BIT(3)) ? strzone(ReadString()) : string_null);
+       this.target4 = ((targbits & BIT(4)) ? strzone(ReadString()) : string_null);
+       this.targetname = ((targbits & BIT(5)) ? strzone(ReadString()) : string_null);
 
        this.wait = ReadByte();
 
index 7c70b8444e0fac5490ff7a0d5cf8882ef1dd59a7..6e9f02b874a2c51610282c881121da037dbfc2c5 100644 (file)
@@ -46,7 +46,7 @@ void dynlight_think(entity this)
 void dynlight_find_aiment(entity this)
 {
        entity targ;
-       if (!this.target)
+       if (!this.target || this.target == "")
                objerror (this, "dynlight: no target to follow");
 
        targ = find(NULL, targetname, this.target);
@@ -62,7 +62,7 @@ void dynlight_find_aiment(entity this)
 void dynlight_find_path(entity this)
 {
        entity targ;
-       if (!this.target)
+       if (!this.target || this.target == "")
                objerror (this, "dynlight: no target to follow");
 
        targ = find(NULL, targetname, this.target);
@@ -74,7 +74,7 @@ void dynlight_find_path(entity this)
 void dynlight_find_target(entity this)
 {
        entity targ;
-       if (!this.target)
+       if (!this.target || this.target == "")
                objerror (this, "dynlight: no target to follow");
 
        targ = find(NULL, targetname, this.target);
index 5a63872dbd6c46b6742b3534be7b4531c0d38ef2..55ccf41fbf2db9da6b46b1e3008a027795d16878 100644 (file)
@@ -272,7 +272,7 @@ void Net_TargetMusic()
 
 void Ent_TriggerMusic_Think(entity this)
 {
-       if(this.active == ACTIVE_NOT)
+       if(this.active == ACTIVE_NOT || intermission)
        {
                return;
        }
index 9156439f99e3bf19bb9bdc8425efe1fdcd06d53d..db255ebb7aff0d80f596dfeb91cdf35a43cf988d 100644 (file)
@@ -5,7 +5,7 @@ void counter_reset(entity this);
 void counter_use(entity this, entity actor, entity trigger)
 {
        entity store = this;
-       if(this.spawnflags & COUNTER_PER_PLAYER)
+       if(this.spawnflags & COUNTER_PER_PLAYER) // FIXME: multiple counters in the map will not function correctly, and upon trigger reset the player won't be able to use it again!
        {
                if(!IS_PLAYER(actor))
                        return;
index 94abd4041d3d1ff9a1a6f24f5a7db8284819244e..b110d9913fd97baa5b1d628b69c78fd173d32578 100644 (file)
@@ -18,7 +18,7 @@ void trigger_heal_touch(entity this, entity toucher)
                                toucher.triggerhealtime = time + this.delay;
 
                        bool playthesound = (this.spawnflags & HEAL_SOUND_ALWAYS);
-                       bool healed = Heal(toucher, this, GetResource(this, RES_HEALTH), this.max_health);
+                       bool healed = Heal(toucher, this, this.health, this.max_health);
 
                        if(playthesound || healed)
                                _sound (toucher, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
@@ -36,8 +36,8 @@ void trigger_heal_init(entity this)
        this.active = ACTIVE_ACTIVE;
        if(!this.delay)
                this.delay = 1;
-       if(!GetResource(this, RES_HEALTH))
-               SetResourceExplicit(this, RES_HEALTH, 10); // TODO: use a special field for this, it doesn't have actual health!
+       if(!this.health)
+               this.health = 10;
        if(!this.max_health)
                this.max_health = 200; // max health topoff for field
        if(this.noise == "")
index 16118cb9d6e54906ea35f5634d095ad879f2a96f..7321fe23f996a4e50b885194fb3c98fd26e2d8a3 100644 (file)
@@ -1,7 +1,7 @@
 #include "magicear.qh"
 #ifdef SVQC
-float magicear_matched;
-float W_Tuba_HasPlayed(entity pl, .entity weaponentity, string melody, float instrument, float ignorepitch, float mintempo, float maxtempo);
+#include <common/weapons/weapon/tuba.qh>
+bool magicear_matched;
 string trigger_magicear_processmessage(entity ear, entity source, float teamsay, entity privatesay, string msgin)
 {
        float domatch, dotrigger, matchstart, l;
index 0717f4beadd4eeb4aa0ae1c2a7cfcc94af38a0f9..f7d9df2900c4c8c40403ede1f45bc71ea3fcf326 100644 (file)
 
 /*
 *              t_swamp.c
-*              Adds spawnfunc_trigger_swamp and suppoart routines for xonotic 1.2.1+
+*              Adds spawnfunc_trigger_swamp and support routines for nexuiz 1.2.1+ and xonotic
 *              Author tZork (Jakob MG)
 *              jakob@games43.se
 *              2005 11 29
 */
 
-.float swamp_interval; //Hurt players in swamp with this interval
-.float swamp_slowdown; //Players in swamp get slowd down by this mutch 0-1 is slowdown 1-~ is speedup (!?)
-.float swamp_lifetime;  // holds the points remaining until slug dies (not quite health!) 
-.entity swampslug;
-
-#ifdef SVQC
-spawnfunc(trigger_swamp);
-#endif
-void swamp_touch(entity this, entity toucher);
-void swampslug_think(entity this);
-
 
 /*
 * Uses a entity calld swampslug to handle players in the swamp
@@ -46,7 +35,11 @@ void swampslug_think(entity this)
        //Slug dead? then remove curses.
        if(GetResource(this, RES_HEALTH) <= 0)
        {
-               this.owner.in_swamp = 0;
+               if(this.owner.swampslug == this)
+               {
+                       this.owner.in_swamp = false;
+                       this.owner.swampslug = NULL;
+               }
                delete(this);
                //centerprint(this.owner,"Killing slug...\n");
                return;
@@ -72,11 +65,12 @@ void swamp_touch(entity this, entity toucher)
        EXACTTRIGGER_TOUCH(this, toucher);
 
        // Chech if player alredy got a swampslug.
-       if(toucher.in_swamp != 1)
+       if(!toucher.in_swamp)
        {
                // If not attach one.
                //centerprint(toucher,"Entering swamp!\n");
-               toucher.swampslug = spawn();
+               if(!toucher.swampslug) // just incase
+                       toucher.swampslug = spawn();
                toucher.swampslug.swamp_lifetime = 2;
                setthink(toucher.swampslug, swampslug_think);
                toucher.swampslug.nextthink = time;
@@ -84,11 +78,11 @@ void swamp_touch(entity this, entity toucher)
                toucher.swampslug.dmg = this.dmg;
                toucher.swampslug.swamp_interval = this.swamp_interval;
                toucher.swamp_slowdown = this.swamp_slowdown;
-               toucher.in_swamp = 1;
+               toucher.in_swamp = true;
                return;
        }
 
-       //toucher.in_swamp = 1;
+       //toucher.in_swamp = true;
 
        //Revitalize players swampslug
        toucher.swampslug.swamp_lifetime = 2;
@@ -116,8 +110,8 @@ void swamp_link(entity this)
 }
 
 /*QUAKED spawnfunc_trigger_swamp (.5 .5 .5) ?
-Players gettin into the swamp will
-get slowd down and damaged
+Players in the swamp will be
+slowed down and damaged over time
 */
 spawnfunc(trigger_swamp)
 {
index f4df98378d544659b1c22f0c663919fb95f90c17..bfe860ed03af9561d2c4e37720adb873a4f83438 100644 (file)
@@ -2,7 +2,16 @@
 
 .float swamp_interval; //Hurt players in swamp with this interval
 .float swamp_slowdown; //Players in swamp get slowd down by this mutch 0-1 is slowdown 1-~ is speedup (!?)
-.entity swampslug;
 
-.float in_swamp;              // bool
+.bool in_swamp;
 .entity swampslug;            // Uses this to release from swamp ("untouch" fix)
+
+.float swamp_interval; //Hurt players in swamp with this interval
+.float swamp_slowdown; //Players in swamp get slowd down by this mutch 0-1 is slowdown 1-~ is speedup (!?)
+.float swamp_lifetime;  // holds the points remaining until slug dies (not quite health!)
+
+#ifdef SVQC
+spawnfunc(trigger_swamp);
+#endif
+void swamp_touch(entity this, entity toucher);
+void swampslug_think(entity this);
index 84e43709c5c3adb9364c903ae08c27b1869a65e9..744dab71af518124cae264d9708fde3f47c189d2 100644 (file)
@@ -1311,11 +1311,16 @@ int bd_client_event(entity minigame, string event, ...)
        {
                case "activate":
                {
-                       minigame.message = bd_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, bd_turn_to_string(minigame.minigame_flags));
                        bd_set_curr_pos("");
                        bd_curr_tile = BD_TILE_BRICK1;
                        return false;
                }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
+                       return false;
+               }
                case "key_pressed":
                {
                        if(minigame.minigame_flags & BD_TURN_MOVE)
@@ -1370,7 +1375,7 @@ int bd_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = bd_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, bd_turn_to_string(sent.minigame_flags));
                                        //if ( sent.minigame_flags & minigame_self.team )
                                                //minigame_prompt();
                                }
index a35ada8cdffcb90a1bbea8ce09e88277ea068a30..be65e6ac13528bc4446b8b0e1ee8768636387fff 100644 (file)
@@ -413,7 +413,12 @@ int c4_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        c4_set_curr_pos("");
-                       minigame.message = c4_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, c4_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -490,7 +495,7 @@ int c4_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = c4_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, c4_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                }
index fbb6f4b727e762c39e563e0eeb22420846cdb845..72b65e75691ede0428b7cf4acffd85ee37c96506 100644 (file)
@@ -628,12 +628,13 @@ int nmm_client_event(entity minigame, string event, ...)
        {
                nmm_fromtile = NULL;
                nmm_init_tiles(minigame);
-               minigame.message = nmm_turn_to_string(minigame.minigame_flags);
+               strcpy(minigame.message, nmm_turn_to_string(minigame.minigame_flags));
        }
        else if ( event == "deactivate" )
        {
                nmm_fromtile = NULL;
                nmm_kill_tiles(minigame);
+               strfree(minigame.message);
        }
        else if ( event == "key_pressed" && (minigame.minigame_flags&NMM_TURN_TEAM) == minigame_self.team )
        {
@@ -755,7 +756,7 @@ int nmm_client_event(entity minigame, string event, ...)
                }
                else if ( sent.classname == "minigame" && ( ...(1,int) & MINIG_SF_UPDATE ) )
                {
-                       sent.message = nmm_turn_to_string(sent.minigame_flags);
+                       strcpy(sent.message, nmm_turn_to_string(sent.minigame_flags));
                        if ( sent.minigame_flags & minigame_self.team )
                                minigame_prompt();
                }
index 3f4810078ac243d43f21705efdbc6340df81fb18..407eb4e8fdfeafbaa12680abdc9655bb7862bbcd 100644 (file)
@@ -614,6 +614,11 @@ int pong_client_event(entity minigame, string event, ...)
        {
                case "activate":
                        return false;
+               case "deactivate":
+               {
+                       strfree(minigame.message);
+                       return false;
+               }
                case "key_pressed":
                        switch ( ...(0,int) )
                        {
@@ -664,7 +669,7 @@ int pong_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = pong_message(sent.minigame_flags);
+                                       strcpy(sent.message, pong_message(sent.minigame_flags));
                                }
                        }
                        return false;
index 269d39583926dcb3632a343be3a296c567d0fac1..e8aed878aab9c31ce663bd453747d996e1a191a2 100644 (file)
@@ -439,6 +439,7 @@ string pp_turn_to_string(int turnflags)
 
        if ( turnflags & PP_TURN_WIN )
        {
+               // translator-friendly messages composed of 2 existing messages
                if ( (turnflags&PP_TURN_TEAM) != minigame_self.team )
                        return strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
                return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
@@ -485,7 +486,12 @@ int pp_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        pp_set_curr_pos("");
-                       minigame.message = pp_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, pp_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -560,7 +566,7 @@ int pp_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = pp_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, pp_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                        sent.pp_team1_score = ReadByte();
index 8bf8cabe75738713164856171a1bc75b98817aa0..4457449e86b467417e9534b724d531241b9f9cb1 100644 (file)
@@ -532,7 +532,12 @@ int ps_client_event(entity minigame, string event, ...)
                {
                        ps_set_curr_pos("");
                        ps_curr_piece = NULL;
-                       minigame.message = ps_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, ps_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -609,7 +614,7 @@ int ps_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = ps_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, ps_turn_to_string(sent.minigame_flags));
                                        //if ( sent.minigame_flags & minigame_self.team )
                                                //minigame_prompt();
                                }
index 0c7c6fb5d31df48d78b37ea90bb15498b98784f5..6bac28c930b56f6a470c980a4e91dbf8fee0e892 100644 (file)
@@ -320,6 +320,8 @@ string ttt_turn_to_string(int turnflags)
 
        if ( turnflags & TTT_TURN_WIN )
        {
+               // translator-friendly messages composed of 2 existing messages
+               // TODO: proper "you win" banner instead of hijacking the help message
                if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
                        strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
                return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
@@ -520,7 +522,7 @@ void ttt_aimove(entity minigame)
                else
                        ttt_move(minigame,aiplayer,pos);
        }
-       minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+       strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
 }
 
 // Make the correct move
@@ -554,7 +556,12 @@ int ttt_client_event(entity minigame, string event, ...)
                case "activate":
                {
                        ttt_set_curr_pos("");
-                       minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+                       strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
+                       return false;
+               }
+               case "deactivate":
+               {
+                       strfree(minigame.message);
                        return false;
                }
                case "key_pressed":
@@ -629,7 +636,7 @@ int ttt_client_event(entity minigame, string event, ...)
                        {
                                if ( sf & MINIG_SF_UPDATE )
                                {
-                                       sent.message = ttt_turn_to_string(sent.minigame_flags);
+                                       strcpy(sent.message, ttt_turn_to_string(sent.minigame_flags));
                                        if ( sent.minigame_flags & minigame_self.team )
                                                minigame_prompt();
                                }
index 38aa4e33ada8d62930db4634610e5f2cb8610221..c6a1c2199b62b1c5a6ec305cbf81a28bbe3803e0 100644 (file)
@@ -17,7 +17,7 @@ CLASS(Model, Object)
             LOG_WARNF("Missing model: \"%s\"", s);
             return;
         }
-        profile(sprintf("precache_model(\"%s\")", s));
+        //profile(sprintf("precache_model(\"%s\")", s));
         precache_model(s);
         strcpy(this.model_str_, s);
     }
index 86e780e0a4657aa523489eb0b9ad82bc7bf9f698..efdd836d21e8af7bedd7de2ebffe8555031e173a 100644 (file)
@@ -36,7 +36,8 @@ CLASS(OffhandMageTeleport, OffhandWeapon)
         player.OffhandMageTeleport_key_pressed = key_pressed;
     }
 ENDCLASS(OffhandMageTeleport)
-OffhandMageTeleport OFFHAND_MAGE_TELEPORT; STATIC_INIT(OFFHAND_MAGE_TELEPORT) { OFFHAND_MAGE_TELEPORT = NEW(OffhandMageTeleport); }
+OffhandMageTeleport OFFHAND_MAGE_TELEPORT;
+STATIC_INIT(OFFHAND_MAGE_TELEPORT) { OFFHAND_MAGE_TELEPORT = NEW(OffhandMageTeleport); }
 
 float autocvar_g_monster_mage_health;
 float autocvar_g_monster_mage_damageforcescale = 0.5;
index 97a68b5f8f92877e95d115b0bf6c50d03b804088..c707f8c38e5ede6509fd6620456bbbd7288468e7 100644 (file)
@@ -1095,15 +1095,12 @@ void Monster_Move_2D(entity this, float mspeed, bool allow_jumpoff)
        if(trace_ent && IS_MONSTER(trace_ent))
                reverse = true;
 
-       // TODO: fix this... tracing is broken if the floor is thin
-       /*
-       if(!allow_jumpoff)
+       if(!allow_jumpoff && IS_ONGROUND(this))
        {
-               a = b - '0 0 32';
-               traceline(b, a, MOVE_WORLDONLY, this);
+               traceline(b, b - '0 0 32', MOVE_NORMAL, this);
                if(trace_fraction == 1.0)
                        reverse = true;
-       } */
+       }
 
        if(reverse)
        {
index d3f4ee740ab1543d2bf8fae2090e111842f251de..13c98e93fa1f64e75271e79cba146614c1b6dd94 100644 (file)
@@ -16,6 +16,7 @@ void spawner_use(entity this, entity actor, entity trigger)
        e.noalign = this.noalign;
        e.angles = this.angles;
        e.monster_skill = this.monster_skill;
+       e.skin = this.skin;
        e = spawnmonster(e, this.spawnmob, 0, this, this, this.origin, false, true, this.monster_moveflags);
 }
 
index c1d658576e2cb4b22e43a7e6446356312467265f..cc4cc0129593044474468adff6b9434636fcdcf9 100644 (file)
@@ -171,7 +171,8 @@ void Mutator_Remove(Mutator mut);
 bool mutator_log = false;
 .bool m_added;
 
-#define MUTATOR_IS_ENABLED(this) MUTATOR_##this.mutatorcheck()
+#define _MUTATOR_IS_ENABLED(this) this.mutatorcheck()
+#define MUTATOR_IS_ENABLED(this) _MUTATOR_IS_ENABLED(MUTATOR_##this)
 
 #ifdef GAMEQC
 /** server mutators activate corresponding client mutators for all clients */
@@ -276,7 +277,7 @@ STATIC_INIT(Mutators) {
 }
 
 STATIC_INIT_LATE(Mutators) {
-    FOREACH(Mutators, it.mutatorcheck(), Mutator_Add(it));
+    FOREACH(Mutators, _MUTATOR_IS_ENABLED(it), Mutator_Add(it));
 }
 
 #define MUTATOR_ONADD                   if (mode == MUTATOR_ADDING)
index 7d4e583675b812169ee16ebc076b57f3973ee7e3..5f626bee95c38299327ff43bbca8e60ca2c73206 100644 (file)
@@ -35,10 +35,10 @@ CLASS(Buff, Pickup)
 ENDCLASS(Buff)
 
 STATIC_INIT(REGISTER_BUFFS) {
-    FOREACH(Buffs, true, {
-        it.m_itemid = BIT(it.m_id - 1); \
-        it.m_sprite = strzone(strcat("buff-", it.netname)); \
-    });
+       FOREACH(Buffs, true, {
+               it.m_itemid = BIT(it.m_id - 1);
+               it.m_sprite = strzone(strcat("buff-", it.netname));
+       });
 }
 
 #ifdef SVQC
index e9d2acd8f1e4763349e0b8232a8ecd7ed50f1d9e..5e59fd9f3274471f866e363894bcb5c510eed6f8 100644 (file)
@@ -237,7 +237,7 @@ NET_HANDLE(damagetext, bool isNew)
 
     if (can_use_3d && !prefer_2d) {
         // world coords
-        // using 1 as minimum because of shotgun (same as menu)
+        // 1 as min because shotgun sends damagetext per pellet (see https://gitlab.com/xonotic/xonotic-data.pk3dir/issues/1994).
         for (entity e = findradius(entcs.origin, max(autocvar_cl_damagetext_accumulate_range, 1)); e; e = e.chain) {
             if (e.instanceOfDamageText
                 && !e.m_screen_coords // we're using origin for both world coords and screen coords so avoid mismatches
index 6ba83e922773224ba5c6feba26bff71faf3df1c6..1a00d15462c80b1aa2b0d0b798a82cc7e6518765 100644 (file)
@@ -26,19 +26,6 @@ CLASS(XonoticDamageTextSettings, XonoticTab)
                 setDependent(e, "cl_damagetext", 1, 1);
             this.TD(this, 1, 2, e = makeXonoticSlider(0, 50, 1, "cl_damagetext_size_max"));
                 setDependent(e, "cl_damagetext", 1, 1);
-        this.TR(this);
-            this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Accumulate range:")));
-                setDependent(e, "cl_damagetext", 1, 1);
-            // 1 as min because shotgun sends damagetext per pellet (see https://gitlab.com/xonotic/xonotic-data.pk3dir/issues/1994).
-            // It's capped to 1 in code too but let's not lie to users by allowing the slider to go to 0, it would still accumulate
-            // when hitting a stationary player using a weapon with no push.
-            this.TD(this, 1, 2, e = makeXonoticSlider(1, 500, 1, "cl_damagetext_accumulate_range"));
-                setDependent(e, "cl_damagetext", 1, 1);
-        this.TR(this);
-            this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Lifetime:")));
-                setDependent(e, "cl_damagetext", 1, 1);
-            this.TD(this, 1, 2, e = makeXonoticSlider(0, 10, 1, "cl_damagetext_alpha_lifetime"));
-                setDependent(e, "cl_damagetext", 1, 1);
         this.TR(this);
             this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Color:")));
                 setDependent(e, "cl_damagetext", 1, 1);
@@ -46,14 +33,7 @@ CLASS(XonoticDamageTextSettings, XonoticTab)
                 setDependent(e, "cl_damagetext", 1, 1);
         this.TR(this);
         this.TR(this);
-        // friendly fire
             this.TD(this, 1, 3, e = makeXonoticCheckBox(0, "cl_damagetext_friendlyfire", _("Draw damage numbers for friendly fire")));
                 setDependent(e, "cl_damagetext", 1, 1);
-        this.TR(this);
-            this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Color:")));
-                setDependentAND(e, "cl_damagetext", 1, 1, "cl_damagetext_friendlyfire", 1, 1);
-            this.TD(this, 2, 2, e = makeXonoticColorpickerString("cl_damagetext_friendlyfire_color", "cl_damagetext_friendlyfire_color"));
-                setDependentAND(e, "cl_damagetext", 1, 1, "cl_damagetext_friendlyfire", 1, 1);
-        this.TR(this);
     }
 ENDCLASS(XonoticDamageTextSettings)
index fc571678b2c7f22ea1032f2f4a3d6e580cc83a02..63f3182ea6ba4746abb57d5491c5c97d29294adc 100644 (file)
@@ -18,7 +18,7 @@ int autocvar_g_instagib_extralives;
 float autocvar_g_instagib_speed_highspeed;
 
 IntrusiveList g_instagib_items;
-STATIC_INIT()
+STATIC_INIT(instagib)
 {
        g_instagib_items = IL_NEW();
        IL_PUSH(g_instagib_items, ITEM_VaporizerCells);
index 1379d586f10fd4da14b9f82d98571cd00bbe6c78..8d2bb318f0f2443f1200545a675f23b1d31d433c 100644 (file)
@@ -28,16 +28,12 @@ NET_HANDLE(itemstime, bool isNew)
 #endif
 
 #ifdef CSQC
-void Item_ItemsTime_Init()
-{
-    FOREACH(Items, true, {
-        ItemsTime_time[it.m_id] = -1;
-    });
-    ItemsTime_time[Items_MAX] = -1;
-}
 
 STATIC_INIT(ItemsTime_Init) {
-    Item_ItemsTime_Init();
+       FOREACH(Items, true, {
+               ItemsTime_time[it.m_id] = -1;
+       });
+       ItemsTime_time[Items_MAX] = -1;
 }
 
 int autocvar_hud_panel_itemstime = 2;
@@ -77,17 +73,11 @@ bool Item_ItemsTime_Allow(GameItem it)
 // reserve one more spot for superweapons time
 float it_times[Items_MAX + 1];
 
-void Item_ItemsTime_Init()
-{
-    FOREACH(Items, Item_ItemsTime_Allow(it), {
-        it_times[it.m_id] = -1;
-    });
-    it_times[Items_MAX] = -1;
-}
-
 STATIC_INIT(ItemsTime_Init) {
-    // items time
-    Item_ItemsTime_Init();
+       FOREACH(Items, Item_ItemsTime_Allow(it), {
+               it_times[it.m_id] = -1;
+       });
+       it_times[Items_MAX] = -1;
 }
 
 void Item_ItemsTime_ResetTimes()
index 484aaddcdadc86a8cc9a72fecdd47799f9650747..8dc82dbcf9c200633a7361f42a8100c025edf881 100644 (file)
@@ -891,15 +891,18 @@ void nade_damage(entity this, entity inflictor, entity attacker, float damage, i
                damage = this.max_health * 0.1;
        else if(DEATH_ISWEAPON(deathtype, WEP_SHOCKWAVE) || DEATH_ISWEAPON(deathtype, WEP_SHOTGUN)) // WEAPONTODO
        {
-               if(deathtype & HITTYPE_SECONDARY)
-               {
-                       damage = this.max_health * 0.1;
-                       force *= 10;
-               }
-               else
+               if(!(deathtype & HITTYPE_SECONDARY))
                        damage = this.max_health * 1.15;
        }
 
+       // melee slaps
+       entity death_weapon = DEATH_WEAPONOF(deathtype);
+       if(((deathtype & HITTYPE_SECONDARY) ? (death_weapon.spawnflags & WEP_TYPE_MELEE_SEC) : (death_weapon.spawnflags & WEP_TYPE_MELEE_PRI)))
+       {
+               damage = this.max_health * 0.1;
+               force *= 10;
+       }
+
        this.velocity += force;
        UpdateCSQCProjectile(this);
 
@@ -1030,7 +1033,7 @@ void nades_GiveBonus(entity player, float score)
                if ( STAT(NADE_BONUS_SCORE, player) >= 1 )
                {
                        Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_NADE_BONUS);
-                       play2(player, SND(KH_ALARM));
+                       play2(player, SND(NADE_BONUS));
                        STAT(NADE_BONUS, player)++;
                        STAT(NADE_BONUS_SCORE, player) -= 1;
                }
@@ -1247,7 +1250,8 @@ CLASS(NadeOffhand, OffhandWeapon)
                }
     }
 ENDCLASS(NadeOffhand)
-NadeOffhand OFFHAND_NADE; STATIC_INIT(OFFHAND_NADE) { OFFHAND_NADE = NEW(NadeOffhand); }
+NadeOffhand OFFHAND_NADE;
+STATIC_INIT(OFFHAND_NADE) { OFFHAND_NADE = NEW(NadeOffhand); }
 
 MUTATOR_HOOKFUNCTION(nades, ForbidThrowCurrentWeapon, CBC_ORDER_LAST)
 {
@@ -1444,7 +1448,8 @@ MUTATOR_HOOKFUNCTION(nades, PlayerDies, CBC_ORDER_LAST)
 
        if(IS_PLAYER(frag_attacker))
        {
-               float killcount_bonus = ((CS(frag_attacker).killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * CS(frag_attacker).killcount, autocvar_g_nades_bonus_score_medium) : autocvar_g_nades_bonus_score_minor);
+               float killcount_bonus = ((CS(frag_attacker).killcount >= 1) ? bound(0, autocvar_g_nades_bonus_score_minor * CS(frag_attacker).killcount, autocvar_g_nades_bonus_score_medium) 
+                                                                                                                                       : autocvar_g_nades_bonus_score_minor);
 
                if (SAME_TEAM(frag_attacker, frag_target) || frag_attacker == frag_target)
                        nades_RemoveBonus(frag_attacker);
index 15a2fc2e0c972427c1270223e0f40ad178609b81..41ba2da62b0ada5c48b9d9c1baa1dcdcb7074d2a 100644 (file)
@@ -11,7 +11,7 @@ bool autocvar_g_overkill_itemwaypoints = true;
 .Weapon ok_lastwep[MAX_WEAPONSLOTS];
 
 IntrusiveList g_overkill_items;
-STATIC_INIT()
+STATIC_INIT(overkill)
 {
        g_overkill_items = IL_NEW();
        IL_PUSH(g_overkill_items, ITEM_HealthMega);
index 57df1b02bf205ab9e8160c20c90998a77c393cc2..12e4bdea43531a6fb1c8cbfc5154257f25fa9687 100644 (file)
@@ -1,20 +1,26 @@
 #include "sv_vampire.qh"
 
 string autocvar_g_vampire;
+float autocvar_g_vampire_factor = 1.0;
+bool autocvar_g_vampire_use_total_damage = false;
+
 REGISTER_MUTATOR(vampire, expr_evaluate(autocvar_g_vampire) && !MUTATOR_IS_ENABLED(mutator_instagib));
 
 MUTATOR_HOOKFUNCTION(vampire, PlayerDamage_SplitHealthArmor)
 {
        entity frag_attacker = M_ARGV(1, entity);
        entity frag_target = M_ARGV(2, entity);
-       float damage_take = M_ARGV(4, float);
+       float health_take = bound(0, M_ARGV(4, float), GetResource(frag_target, RES_HEALTH));
+        float armor_take = bound(0, M_ARGV(5, float), GetResource(frag_target, RES_ARMOR));
+        float damage_take = (autocvar_g_vampire_use_total_damage) ? health_take + armor_take : health_take;
 
-       if(time >= frag_target.spawnshieldtime)
-       if(frag_target != frag_attacker)
-       if(!IS_DEAD(frag_target))
+        if(time >= frag_target.spawnshieldtime &&
+           frag_target != frag_attacker &&
+           IS_PLAYER(frag_attacker) &&
+           !IS_DEAD(frag_target))
        {
                GiveResource(frag_attacker, RES_HEALTH,
-                       bound(0, damage_take, GetResource(frag_target, RES_HEALTH)));
+                       autocvar_g_vampire_factor * damage_take);
        }
 }
 
index e2190b66a26a9cef1c0efb477c51d53c7276422c..f08e2eceee3642b17f12d76ebd256e7d1869dcaf 100644 (file)
@@ -53,6 +53,7 @@ float autocvar_g_waypointsprite_timealphaexponent;
 bool autocvar_g_waypointsprite_turrets = true;
 float autocvar_g_waypointsprite_turrets_maxdist = 5000;
 bool autocvar_g_waypointsprite_turrets_text = false;
+bool autocvar_g_waypointsprite_turrets_onlyhurt = false;
 bool autocvar_g_waypointsprite_uppercase;
 bool autocvar_g_waypointsprite_text;
 float autocvar_g_waypointsprite_iconsize = 32;
index 31b5ed4873642ceb21b2fb3fae77b66c5770fd23..29f2946b059d7d4c65c9f2c9cf1e8cef3da52753 100644 (file)
@@ -198,6 +198,7 @@ SOUND(ONS_CONTROLPOINT_BUILT, "onslaught/controlpoint_built");
 SOUND(ONS_CONTROLPOINT_UNDERATTACK, "onslaught/controlpoint_underattack");
 SOUND(ONS_DAMAGEBLOCKEDBYSHIELD, "onslaught/damageblockedbyshield");
 SOUND(ONS_ELECTRICITY_EXPLODE, "onslaught/electricity_explode");
+SOUND(ONS_GENERATOR_ALARM, "kh/alarm"); // FIXME: unique sound
 SOUND(ONS_GENERATOR_DECAY, "onslaught/generator_decay");
 SOUND(ONS_GENERATOR_UNDERATTACK, "onslaught/generator_underattack");
 SOUND(ONS_HIT1, "onslaught/ons_hit1");
@@ -236,6 +237,7 @@ SOUND(VEH_SPIDERBOT_STRAFE, "vehicles/spiderbot_strafe");
 SOUND(VEH_SPIDERBOT_WALK, "vehicles/spiderbot_walk");
 
 SOUND(NADE_BEEP, "overkill/grenadebip");
+SOUND(NADE_BONUS, "kh/alarm"); // FIXME: unique sound
 
 SOUND(BUFF_LOST, "relics/relic_effect");
 
index b3eb1ea861397547734d91eaef173e8f1f9b59a1..45cd41f15e1041e28acdfe95d0265749db116b7f 100644 (file)
@@ -26,6 +26,7 @@ const int CH_AMBIENT_SINGLE = 9;
 
 const float ATTEN_NONE = 0;
 const float ATTEN_MIN = 0.015625;
+const float ATTEN_LOW = 0.2;
 const float ATTEN_NORM = 0.5;
 const float ATTEN_LARGE = 1;
 const float ATTEN_IDLE = 2;
@@ -129,7 +130,7 @@ CLASS(Sound, Object)
                TC(Sound, this);
                string s = _Sound_fixpath(this.sound_str());
                if (!s) return;
-               profile(sprintf("precache_sound(\"%s\")", s));
+               //profile(sprintf("precache_sound(\"%s\")", s));
                precache_sound(s);
                strcpy(this.sound_str_, s);
        }
index 9ea1925495fb16937da5ff8b225568f6ff5aefae..466b38311214c20d0aa66baefa1a7d35fcf93c98 100644 (file)
@@ -1215,6 +1215,9 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
                return;
        }
 
+       precache_model(this.model);
+       precache_sound(this.item_pickupsound);
+
        if (Item_IsLoot(this))
        {
                this.reset = SUB_Remove;
@@ -1306,9 +1309,6 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
 
                weaponsInMap |= WepSet_FromWeapon(Weapons_from(weaponid));
 
-               precache_model(this.model);
-               precache_sound(this.item_pickupsound);
-
                if (   def.instanceOfPowerup
                        || def.instanceOfWeaponPickup
                        || (def.instanceOfHealth && def != ITEM_HealthSmall)
@@ -1340,12 +1340,13 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default
                        this.ItemStatus |= ITS_ANIMATE2;
        }
 
+       if(Item_IsLoot(this))
+               this.gravity = 1;
+
        if(def.instanceOfWeaponPickup)
        {
                if (!Item_IsLoot(this)) // if dropped, colormap is already set up nicely
                        this.colormap = 1024; // color shirt=0 pants=0 grey
-               else
-                       this.gravity = 1;
                if (!(this.spawnflags & 1024))
                        this.ItemStatus |= ITS_ANIMATE1;
                this.SendFlags |= ISF_COLORMAP;
index f5ba71477982d4ec6b727d1312aaf36633269a1c..25c61b4b67b19c1192a7752b23a77f8cd7945581 100644 (file)
@@ -2,43 +2,6 @@
 
 #ifdef SVQC
 
-/**
-    turret_checkpoint
-**/
-
-
-//.entity checkpoint_target;
-
-/*
-#define checkpoint_cache_who  flagcarried
-#define checkpoint_cache_from lastrocket
-#define checkpoint_cache_to   selected_player
-*/
-
-/*
-entity path_makeorcache(entity forwho,entity start, entity end)
-{
-    entity pth;
-
-    //pth = pathlib_makepath(forwho, start.origin,end.origin,PFL_GROUNDSNAP,500,1.5,PT_QUICKSTAR);
-
-    return pth;
-}
-*/
-
-void turret_checkpoint_use()
-{
-}
-
-#if 0
-void turret_checkpoint_think(entity this)
-{
-    if(this.enemy)
-        te_lightning1(this,this.origin, this.enemy.origin);
-
-    this.nextthink = time + 0.25;
-}
-#endif
 /*QUAKED turret_checkpoint (1 0 1) (-32 -32 -32) (32 32 32)
 -----------KEYS------------
 target: .targetname of next waypoint in chain.
@@ -46,30 +9,25 @@ wait:   Pause at this point # seconds.
 -----------SPAWNFLAGS-----------
 ---------NOTES----------
 If a loop is of targets are formed, any unit entering this loop will patrol it indefinitly.
-If the checkpoint chain in not looped, the unit will go "Roaming" when the last point is reached.
+If the checkpoint chain is not looped, the unit will go "Roaming" when the last point is reached.
 */
-//float tc_acum;
 void turret_checkpoint_init(entity this)
 {
     traceline(this.origin + '0 0 16', this.origin - '0 0 1024', MOVE_WORLDONLY, this);
     setorigin(this, trace_endpos + '0 0 32');
 
-    if(this.target != "")
+    if(this.target && this.target != "")
     {
         this.enemy = find(NULL, targetname, this.target);
-        if(this.enemy == NULL)
-            LOG_TRACE("A turret_checkpoint faild to find its target!");
+        if(!this.enemy)
+            LOG_TRACE("A turret_checkpoint failed to find its target!");
     }
-    //setthink(this, turret_checkpoint_think);
-    //this.nextthink = time + tc_acum + 0.25;
-    //tc_acum += 0.25;
 }
 
 spawnfunc(turret_checkpoint)
 {
     setorigin(this, this.origin);
-    setthink(this, turret_checkpoint_init);
-    this.nextthink = time + 0.2;
+    InitializeEntity(this, turret_checkpoint_init, INITPRIO_FINDTARGET);
 }
 
 // Compat.
index f9374497c8114f35346cedc0e13a46a47817ce45..df20e1ad2f2d8371638de205f191a458be3db41e 100644 (file)
@@ -175,28 +175,37 @@ void turret_draw2d(entity this)
                t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
        }
 
-       o = drawspritearrow(o, M_PI, rgb, a, SPRITE_ARROW_SCALE * t);
-       if(autocvar_g_waypointsprite_turrets_text)
+       bool draw_healthbar = ((this.helpme && time < this.helpme) || !autocvar_g_waypointsprite_turrets_onlyhurt || hud != HUD_NORMAL);
+       bool draw_text = autocvar_g_waypointsprite_turrets_text;
+
+       if(draw_healthbar || draw_text) // make sure it's actually being drawn
+       {
+               o = drawspritearrow(o, M_PI, rgb, a, SPRITE_ARROW_SCALE * t);
+       }
+       if(draw_text)
        {
                o = drawsprite_TextOrIcon(true, o, M_PI, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
        }
-       drawhealthbar(
-                       o,
-                       0,
-                       GetResource(this, RES_HEALTH) / 255,
-                       '0 0 0',
-                       '0 0 0',
-                       0.5 * SPRITE_HEALTHBAR_WIDTH * t,
-                       0.5 * SPRITE_HEALTHBAR_HEIGHT * t,
-                       SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize,
-                       SPRITE_HEALTHBAR_BORDER * t,
-                       0,
-                       rgb,
-                       a * SPRITE_HEALTHBAR_BORDERALPHA,
-                       rgb,
-                       a * SPRITE_HEALTHBAR_HEALTHALPHA,
-                       DRAWFLAG_NORMAL
-                       );
+       if(draw_healthbar)
+       {
+               drawhealthbar(
+                               o,
+                               0,
+                               GetResource(this, RES_HEALTH) / 255,
+                               '0 0 0',
+                               '0 0 0',
+                               0.5 * SPRITE_HEALTHBAR_WIDTH * t,
+                               0.5 * SPRITE_HEALTHBAR_HEIGHT * t,
+                               SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize,
+                               SPRITE_HEALTHBAR_BORDER * t,
+                               0,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_BORDERALPHA,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_HEALTHALPHA,
+                               DRAWFLAG_NORMAL
+                               );
+       }
 }
 
 void turret_construct(entity this, bool isnew)
index 18197c078373f749c8d3127cc10f68396600889a..84aae19335fd0d970a32a2024090780e16c3d372 100644 (file)
@@ -756,6 +756,9 @@ float turret_validate_target(entity e_turret, entity e_target, float validate_fl
 
                        if (e_turret.team != e_target.owner.team)
                                return -12;
+
+                       if (e_turret.team != e_target.aiment.team)
+                               return -12; // portals
                }
                else
                {
@@ -764,6 +767,9 @@ float turret_validate_target(entity e_turret, entity e_target, float validate_fl
 
                        if (e_turret.team == e_target.owner.team)
                                return -14;
+
+                       if (e_turret.team == e_target.aiment.team)
+                               return -14; // portals
                }
        }
 
index 3b4b60eef0a6b3b875e020f778d9653281cf2b62..308a92fd87871bbe4972d441ef56ea40cd6ae0d1 100644 (file)
@@ -175,7 +175,7 @@ void spiderbot_rocket_do(entity this)
     if(!PHYS_INPUT_BUTTON_ATCK2(this.owner))
         return;
 
-    if(!weaponLocked(this.owner) && !weaponUseForbidden(this.owner))
+    if(weaponLocked(this.owner) || weaponUseForbidden(this.owner))
         return;
 
     v = gettaginfo(this.tur_head,gettagindex(this.tur_head,"tag_fire"));
index a2623ca201b6c6444c534d937961b61e68b427f4..8c025cb19f22a382ac24b9ee6be51a1be383e79c 100644 (file)
@@ -198,6 +198,7 @@ const int WEP_FLAG_DUALWIELD      =  BIT(11); // weapon can be dual wielded
 const int WEP_FLAG_NODUAL         =  BIT(12); // weapon doesn't work well with dual wielding (fireball etc just explode on fire), doesn't currently prevent anything
 const int WEP_FLAG_PENETRATEWALLS =  BIT(13); // weapon has high calibur bullets that can penetrate thick walls (WEAPONTODO)
 const int WEP_FLAG_BLEED          =  BIT(14); // weapon pierces and causes bleeding (used for damage effects)
+const int WEP_FLAG_NOTRUEAIM      =  BIT(15); // weapon doesn't aim directly at targets
 
 // variables:
 string weaponorder_byid;
index c9825adf0b06d5f3ed4d936d1216680318f278a9..6297bdf37b5f78875414d9ee01f8df09fd5cce36 100644 (file)
@@ -50,7 +50,8 @@ SPAWNFUNC_WEAPON(weapon_laser, WEP_BLASTER)
 
 CLASS(OffhandBlaster, OffhandWeapon)
 ENDCLASS(OffhandBlaster)
-OffhandBlaster OFFHAND_BLASTER; STATIC_INIT(OFFHAND_BLASTER) { OFFHAND_BLASTER = NEW(OffhandBlaster); }
+OffhandBlaster OFFHAND_BLASTER;
+STATIC_INIT(OFFHAND_BLASTER) { OFFHAND_BLASTER = NEW(OffhandBlaster); }
 
 #ifdef SVQC
 .float blaster_damage;
index 1d15d448ec5b7442e6a6a30ead436665fad4af9e..bff975e005479ce5d12eaf5751ec11b6b06843f2 100644 (file)
@@ -4,7 +4,7 @@ CLASS(Hook, Weapon)
 /* spawnfunc */ ATTRIB(Hook, m_canonical_spawnfunc, string, "weapon_hook");
 /* ammotype  */ ATTRIB(Hook, ammo_type, int, RES_FUEL);
 /* impulse   */ ATTRIB(Hook, impulse, int, 0);
-/* flags     */ ATTRIB(Hook, spawnflags, int, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH);
+/* flags     */ ATTRIB(Hook, spawnflags, int, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Hook, bot_pickupbasevalue, float, 0);
 /* color     */ ATTRIB(Hook, wpcolor, vector, '0 0.5 0');
 /* modelname */ ATTRIB(Hook, mdl, string, "hookgun");
@@ -62,7 +62,8 @@ CLASS(OffhandHook, OffhandWeapon)
     }
 #endif
 ENDCLASS(OffhandHook)
-OffhandHook OFFHAND_HOOK; STATIC_INIT(OFFHAND_HOOK) { OFFHAND_HOOK = NEW(OffhandHook); }
+OffhandHook OFFHAND_HOOK;
+STATIC_INIT(OFFHAND_HOOK) { OFFHAND_HOOK = NEW(OffhandHook); }
 
 #ifdef SVQC
 
index 6679f2135fe2079904ec6f920a911eb2758556b1..2d88a9deb29fc65189487f9006d34ee6fcba2751 100644 (file)
@@ -164,7 +164,7 @@ void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentit
                actor.punchangle_y = random() - 0.5;
        }
 
-       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, burst_speed), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), thiswep.m_id, EFFECT_BULLET);
+       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, burst_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), thiswep.m_id, EFFECT_BULLET);
 
        Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
 
index a53d17a8d97ee5b0cc94e0ae078c28c86866733c..19bba63a2bb1241e62107e6b9fbb313ea91f1f70 100644 (file)
@@ -24,7 +24,7 @@ CLASS(MachineGun, Weapon)
                P(class, prefix, burst_animtime, float, NONE) \
                P(class, prefix, burst_refire2, float, NONE) \
                P(class, prefix, burst_refire, float, NONE) \
-               P(class, prefix, burst_speed, float, NONE) \
+               P(class, prefix, burst_spread, float, NONE) \
                P(class, prefix, first, float, NONE) \
                P(class, prefix, first_ammo, float, NONE) \
                P(class, prefix, first_damage, float, NONE) \
index d83fe59dc6fd5ad6df18357689b051c617da4622..4593442379a023b0dc0c80b86e66bd2cf2c9538c 100644 (file)
@@ -4,7 +4,7 @@ CLASS(Mortar, Weapon)
 /* spawnfunc */ ATTRIB(Mortar, m_canonical_spawnfunc, string, "weapon_mortar");
 /* ammotype  */ ATTRIB(Mortar, ammo_type, int, RES_ROCKETS);
 /* impulse   */ ATTRIB(Mortar, impulse, int, 4);
-/* flags     */ ATTRIB(Mortar, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH);
+/* flags     */ ATTRIB(Mortar, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Mortar, bot_pickupbasevalue, float, 7000);
 /* color     */ ATTRIB(Mortar, wpcolor, vector, '1 0 0');
 /* modelname */ ATTRIB(Mortar, mdl, string, "gl");
index 722171b9589555ffba0ce2a734153cf13245f7be..0e482d8ae82db239dbdd14160070da41befea332 100644 (file)
@@ -1,5 +1,84 @@
 #include "porto.qh"
 
+#ifdef CSQC
+STATIC_INIT(Porto)
+{
+       entity e = new_pure(porto);
+       e.draw = Porto_Draw;
+       IL_PUSH(g_drawables, e);
+       e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+}
+
+const int polyline_length = 16;
+.vector polyline[polyline_length];
+void Porto_Draw(entity this)
+{
+       if (spectatee_status || intermission == 1 || intermission == 2 || STAT(HEALTH) <= 0 || WEP_CVAR(porto, secondary)) return;
+
+       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+       {
+               entity wepent = viewmodels[slot];
+
+               if (wepent.activeweapon != WEP_PORTO) continue;
+
+               vector pos = view_origin;
+               vector dir = view_forward;
+               makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles));
+               pos += v_right * -wepent.movedir.y
+                       +  v_up * wepent.movedir.z;
+
+               if (wepent.angles_held_status)
+               {
+                       makevectors(wepent.angles_held);
+                       dir = v_forward;
+               }
+
+               wepent.polyline[0] = pos;
+
+               int portal_number = 0, portal1_idx = 1, portal_max = 2;
+               int n = 1 + 2;  // 2 lines == 3 points
+               for (int idx = 0; idx < n && idx < polyline_length - 1; )
+               {
+                       traceline(pos, pos + 65536 * dir, true, this);
+                       dir = reflect(dir, trace_plane_normal);
+                       pos = trace_endpos;
+                       wepent.polyline[++idx] = pos;
+                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
+                       {
+                               n += 1;
+                               continue;
+                       }
+                       if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+                       {
+                               n = max(2, idx);
+                               break;
+                       }
+                       // check size
+                       {
+                               vector ang = vectoangles2(trace_plane_normal, dir);
+                               ang.x = -ang.x;
+                               makevectors(ang);
+                               if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
+                               {
+                                       n = max(2, idx);
+                                       break;
+                               }
+                       }
+                       portal_number += 1;
+                       if (portal_number >= portal_max) break;
+                       if (portal_number == 1) portal1_idx = idx;
+               }
+               for (int idx = 0; idx < n - 1; ++idx)
+               {
+                       vector p = wepent.polyline[idx], q = wepent.polyline[idx + 1];
+                       if (idx == 0) p -= view_up * 16;  // line from player
+                       vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1';
+                       Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin);
+               }
+       }
+}
+#endif
+
 #ifdef SVQC
 #include <common/mapobjects/trigger/jumppads.qh>
 #include <server/weapons/throwing.qh>
index 735426feb698366006f2dad88c9a330b724e146a..29820ef06baba6f4cc88eefbee9db167cd5a6246 100644 (file)
@@ -4,7 +4,7 @@ CLASS(PortoLaunch, Weapon)
 /* spawnfunc */ ATTRIB(PortoLaunch, m_canonical_spawnfunc, string, "weapon_porto");
 /* ammotype  */ ATTRIB(PortoLaunch, ammo_type, int, RES_NONE);
 /* impulse   */ ATTRIB(PortoLaunch, impulse, int, 0);
-/* flags     */ ATTRIB(PortoLaunch, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SUPERWEAPON | WEP_FLAG_NODUAL);
+/* flags     */ ATTRIB(PortoLaunch, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SUPERWEAPON | WEP_FLAG_NODUAL | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(PortoLaunch, bot_pickupbasevalue, float, 0);
 /* color     */ ATTRIB(PortoLaunch, wpcolor, vector, '0.5 0.5 0.5');
 /* modelname */ ATTRIB(PortoLaunch, mdl, string, "porto");
@@ -38,6 +38,10 @@ REGISTER_WEAPON(PORTO, porto, NEW(PortoLaunch));
 
 SPAWNFUNC_WEAPON(weapon_porto, WEP_PORTO)
 
+#ifdef CSQC
+void Porto_Draw(entity this);
+#endif
+
 #ifdef SVQC
 .entity porto_current;
 .vector porto_v_angle; // holds "held" view angles
index eb780808932fcd471d96d4727f6aa9cf6aae87a0..bf5fa0c98f271a2c012a49c7807c55c438fa4794 100644 (file)
@@ -268,7 +268,7 @@ void W_Tuba_NoteOn(entity actor, .entity weaponentity, float hittype)
        vector o;
        float n = W_Tuba_GetNote(actor, hittype);
 
-       hittype = 0;
+       hittype = HITTYPE_SOUND;
        if(actor.(weaponentity).tuba_instrument & 1)
                hittype |= HITTYPE_SECONDARY;
        if(actor.(weaponentity).tuba_instrument & 2)
index d932d98bd16f6d7554c32fb7f447ca9419be3c15..335326514d76fdfb85dbe49a43734737a11696dd 100644 (file)
@@ -3,7 +3,7 @@
 CLASS(Tuba, Weapon)
 /* spawnfunc */ ATTRIB(Tuba, m_canonical_spawnfunc, string, "weapon_tuba");
 /* impulse   */ ATTRIB(Tuba, impulse, int, 1);
-/* flags     */ ATTRIB(Tuba, spawnflags, int, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH | WEP_FLAG_NODUAL);
+/* flags     */ ATTRIB(Tuba, spawnflags, int, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH | WEP_FLAG_NODUAL | WEP_FLAG_NOTRUEAIM);
 /* rating    */ ATTRIB(Tuba, bot_pickupbasevalue, float, 2000);
 /* color     */ ATTRIB(Tuba, wpcolor, vector, '0 1 0');
 /* modelname */ ATTRIB(Tuba, mdl, string, "tuba");
@@ -51,3 +51,7 @@ classfield(Tuba) .float tuba_volume;
 classfield(Tuba) .float tuba_volume_initial;
 classfield(Tuba) .int tuba_instrument;
 #endif
+
+#ifdef SVQC
+bool W_Tuba_HasPlayed(entity pl, .entity weaponentity, string melody, int instrument, bool ignorepitch, float mintempo, float maxtempo);
+#endif
index 6b1797c664e9b38fa36f7eee6d6526d2eea4cd5c..9193c4ef1638af9dd797acfe8e666ae9f2d2c1df 100644 (file)
@@ -36,10 +36,10 @@ MACRO_END
     \
     PROP(false, porto_v_angle_held, WEPENT_SET_NORMAL, \
        { WriteByte(chan, this.porto_v_angle_held); if(this.porto_v_angle_held) { \
-                WriteAngle(chan, this.porto_v_angle.x); WriteAngle(chan, this.porto_v_angle.y); \
+                WriteAngle(chan, this.owner.porto_v_angle.x); WriteAngle(chan, this.owner.porto_v_angle.y); \
                } }, \
        { (viewmodels[this.m_wepent_slot]).angles_held_status = ReadByte(); if((viewmodels[this.m_wepent_slot]).angles_held_status) { \
-               (viewmodels[this.m_wepent_slot]).angles_held_x = ReadAngle(); (viewmodels[this.m_wepent_slot]).angles_held_y = ReadAngle(); (viewmodels[this.m_wepent_slot]).angles_held_z = 0; } \
+               (viewmodels[this.m_wepent_slot]).angles_held = vec2(ReadAngle(), ReadAngle()); } \
                else { (viewmodels[this.m_wepent_slot]).angles_held = '0 0 0'; } }) \
     \
     PROP(false, tuba_instrument, WEPENT_SET_NORMAL, \
index 4e8e09083f7749cb481655d64a0e01665f62b440..a48e83ac1a32593f7ccced9044b55de4308d7b79 100644 (file)
@@ -155,7 +155,7 @@ MACRO_END
 #define REGISTRY_HASH(id) Registry_hash_##id
 
 ERASEABLE
-ACCUMULATE void Registry_check(string r, string server) { }
+ACCUMULATE void Registry_check(string r, string sv) { }
 ERASEABLE
 ACCUMULATE void Registry_send_all() { }
 
@@ -170,9 +170,9 @@ void Registry_send(string id, string hash);
        STATIC_INIT(Registry_check_##id) \
        { \
                /* Note: SHA256 isn't always available, use MD4 instead */ \
-               string s = "", join = ":"; \
-               FOREACH(id, true, s = strcat(s, join, it.registered_id)); \
-               s = substring(s, strlen(join), -1); \
+               string s = ""; \
+               FOREACH(id, true, s = strcat(s, ":", it.registered_id)); \
+               s = substring(s, 1, -1); /* remove initial ":" */ \
                string h = REGISTRY_HASH(id) = strzone(digest_hex("MD4", s)); \
                LOG_DEBUGF(#id ": %s\n[%s]", h, s); \
        } \
index e2a25cbc76ef3ec1b8e2f674b1793f0d2eccc744..244665cc5f3c4cf47cf3062e7dd27660701f9244 100644 (file)
@@ -146,12 +146,14 @@ noref bool require_spawnfunc_prefix;
                FIELD_SCALAR(fld, health) \
                FIELD_SCALAR(fld, height) \
                FIELD_SCALAR(fld, impulse) \
+               FIELD_SCALAR(fld, item_pickupsound) \
                FIELD_SCALAR(fld, killtarget) \
                FIELD_SCALAR(fld, lerpfrac) \
                FIELD_SCALAR(fld, light_lev) \
                FIELD_SCALAR(fld, lip) \
                FIELD_SCALAR(fld, loddistance1) \
                FIELD_SCALAR(fld, lodmodel1) \
+               FIELD_SCALAR(fld, lodmodel2) \
                FIELD_SCALAR(fld, ltime) \
                FIELD_SCALAR(fld, map) \
                FIELD_SCALAR(fld, max_health) \
index 649eafd3f91d8bfd4b9808b3e9507d8ca0ba0ba8..c203a93030a6e986ca646ee5298a9cf6ba891c36 100644 (file)
@@ -542,18 +542,7 @@ float preMenuInit()
 
 string campaign_name_previous;
 float campaign_won_previous;
-#ifdef WATERMARK
-string autocvar_menu_watermark = WATERMARK;
-#else
-string autocvar_menu_watermark = "";
-#endif
-void postMenuDraw()
-{
-       if(autocvar_menu_watermark != "")
-       {
-               draw_CenterText('0.5 0.1 0', sprintf(_("^1%s TEST BUILD"), autocvar_menu_watermark), globalToBoxSize('32 32 0', draw_scale), '1 1 1', 0.05, 1);
-       }
-}
+void postMenuDraw() {}
 void DialogOpenButton_Click_withCoords(entity button, entity tab, vector theOrigin, vector theSize);
 .entity winnerDialog;
 void preMenuDraw()
index a763b97267b5a69dcec8883b66a4a8c71127bf70..4b71e28e8b4e74153e93bbf5c07f8a2497b9c692 100644 (file)
@@ -156,6 +156,7 @@ string autocvar_g_maplist_votable_screenshot_dir;
 bool autocvar_g_maplist_votable_suggestions;
 bool autocvar_g_maplist_votable_suggestions_override_mostrecent;
 float autocvar_g_maplist_votable_timeout;
+bool autocvar_g_maplist_ignore_sizes;
 int autocvar_g_maxplayers;
 float autocvar_g_maxplayers_spectator_blocktime;
 float autocvar_g_maxpushtime;
@@ -179,6 +180,7 @@ float autocvar_g_items_maxdist;
 int autocvar_g_pickup_items;
 float autocvar_g_player_alpha;
 float autocvar_g_player_brightness;
+float autocvar_g_player_damageforcescale = 2;
 bool autocvar_g_playerclip_collisions;
 int autocvar_g_powerups;
 int autocvar_g_projectiles_damage;
@@ -252,7 +254,6 @@ int autocvar_leadlimit_and_fraglimit;
 int autocvar_leadlimit_override;
 int autocvar_minplayers;
 int autocvar_minplayers_per_team;
-int autocvar_name_maxlength;
 string autocvar_nextmap;
 string autocvar_quit_and_redirect;
 float autocvar_quit_and_redirect_timer;
@@ -315,6 +316,7 @@ float autocvar_sv_mapchange_delay;
 float autocvar_sv_maxairspeed;
 float autocvar_sv_maxspeed;
 string autocvar_sv_motd;
+int autocvar_sv_name_maxlength = 64;
 bool autocvar_sv_precacheplayermodels;
 bool autocvar_sv_q3acompat_machineshotgunswap;
 bool autocvar_sv_servermodelsonly;
index 3f434dbecc7ab529dcc0794ba514e31c60e4eb68..35b52e3d9121de10f322853ea0d92d9c14a51e81 100644 (file)
@@ -15,9 +15,6 @@ const int WAYPOINTFLAG_DEAD_END = BIT(16);  // Useless WP detection temporary fl
 const int WAYPOINTFLAG_LADDER = BIT(15);
 const int WAYPOINTFLAG_JUMP = BIT(14);
 
-entity kh_worldkeylist;
-.entity kh_worldkeynext;
-
 float bot_custom_weapon;
 float bot_weapons_close[Weapons_MAX];
 float bot_weapons_far[Weapons_MAX];
index 6c056c27e718936952436c632f160a03c4b92872..2b2dfbf3cf5e86a4d9d3b19af56fd676be07c06b 100644 (file)
@@ -1,5 +1,7 @@
 #include "havocbot.qh"
 
+#include "roles.qh"
+
 #include <server/defs.qh>
 #include <server/miscfunctions.qh>
 #include "../cvars.qh"
@@ -24,8 +26,6 @@
 
 #include <lib/warpzone/common.qh>
 
-.float speed;
-
 void havocbot_ai(entity this)
 {
        if(this.draggedby)
@@ -193,82 +193,76 @@ void havocbot_ai(entity this)
 
 void havocbot_keyboard_movement(entity this, vector destorg)
 {
-       vector keyboard;
+       if(time <= this.havocbot_keyboardtime)
+               return;
 
-       if (time > this.havocbot_keyboardtime)
+       float sk = skill + this.bot_moveskill;
+       this.havocbot_keyboardtime =
+               max(
+                       this.havocbot_keyboardtime
+                               + 0.05 / max(1, sk + this.havocbot_keyboardskill)
+                               + random() * 0.025 / max(0.00025, skill + this.havocbot_keyboardskill)
+               , time);
+       vector keyboard = CS(this).movement / autocvar_sv_maxspeed;
+
+       float trigger = autocvar_bot_ai_keyboard_threshold;
+
+       // categorize forward movement
+       // at skill < 1.5 only forward
+       // at skill < 2.5 only individual directions
+       // at skill < 4.5 only individual directions, and forward diagonals
+       // at skill >= 4.5, all cases allowed
+       if (keyboard.x > trigger)
        {
-               float sk = skill + this.bot_moveskill;
-               this.havocbot_keyboardtime =
-                       max(
-                               this.havocbot_keyboardtime
-                                       + 0.05 / max(1, sk + this.havocbot_keyboardskill)
-                                       + random() * 0.025 / max(0.00025, skill + this.havocbot_keyboardskill)
-                       , time);
-               keyboard = CS(this).movement / autocvar_sv_maxspeed;
-
-               float trigger = autocvar_bot_ai_keyboard_threshold;
-
-               // categorize forward movement
-               // at skill < 1.5 only forward
-               // at skill < 2.5 only individual directions
-               // at skill < 4.5 only individual directions, and forward diagonals
-               // at skill >= 4.5, all cases allowed
-               if (keyboard.x > trigger)
-               {
-                       keyboard.x = 1;
-                       if (sk < 2.5)
-                               keyboard.y = 0;
-               }
-               else if (keyboard.x < -trigger && sk > 1.5)
-               {
-                       keyboard.x = -1;
-                       if (sk < 4.5)
-                               keyboard.y = 0;
-               }
-               else
-               {
-                       keyboard.x = 0;
-                       if (sk < 1.5)
-                               keyboard.y = 0;
-               }
+               keyboard.x = 1;
+               if (sk < 2.5)
+                       keyboard.y = 0;
+       }
+       else if (keyboard.x < -trigger && sk > 1.5)
+       {
+               keyboard.x = -1;
                if (sk < 4.5)
-                       keyboard.z = 0;
-
-               if (keyboard.y > trigger)
-                       keyboard.y = 1;
-               else if (keyboard.y < -trigger)
-                       keyboard.y = -1;
-               else
                        keyboard.y = 0;
+       }
+       else
+       {
+               keyboard.x = 0;
+               if (sk < 1.5)
+                       keyboard.y = 0;
+       }
+       if (sk < 4.5)
+               keyboard.z = 0;
 
-               if (keyboard.z > trigger)
-                       keyboard.z = 1;
-               else if (keyboard.z < -trigger)
-                       keyboard.z = -1;
-               else
-                       keyboard.z = 0;
+       if (keyboard.y > trigger)
+               keyboard.y = 1;
+       else if (keyboard.y < -trigger)
+               keyboard.y = -1;
+       else
+               keyboard.y = 0;
 
-               // make sure bots don't get stuck if havocbot_keyboardtime is very high
-               if (keyboard == '0 0 0')
-                       this.havocbot_keyboardtime = min(this.havocbot_keyboardtime, time + 0.2);
+       if (keyboard.z > trigger)
+               keyboard.z = 1;
+       else if (keyboard.z < -trigger)
+               keyboard.z = -1;
+       else
+               keyboard.z = 0;
 
-               this.havocbot_keyboard = keyboard * autocvar_sv_maxspeed;
-               if (this.havocbot_ducktime > time)
-                       PHYS_INPUT_BUTTON_CROUCH(this) = true;
+       // make sure bots don't get stuck if havocbot_keyboardtime is very high
+       if (keyboard == '0 0 0')
+               this.havocbot_keyboardtime = min(this.havocbot_keyboardtime, time + 0.2);
 
-               keyboard = this.havocbot_keyboard;
-               float blend = bound(0, vlen(destorg - this.origin) / autocvar_bot_ai_keyboard_distance, 1); // When getting close move with 360 degree
-               //dprint("movement ", vtos(CS(this).movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
-               CS(this).movement = CS(this).movement + (keyboard - CS(this).movement) * blend;
-       }
+       this.havocbot_keyboard = keyboard * autocvar_sv_maxspeed;
+       if (this.havocbot_ducktime > time)
+               PHYS_INPUT_BUTTON_CROUCH(this) = true;
+
+       keyboard = this.havocbot_keyboard;
+       float blend = bound(0, vlen(destorg - this.origin) / autocvar_bot_ai_keyboard_distance, 1); // When getting close move with 360 degree
+       //dprint("movement ", vtos(CS(this).movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
+       CS(this).movement = CS(this).movement + (keyboard - CS(this).movement) * blend;
 }
 
 void havocbot_bunnyhop(entity this, vector dir)
 {
-       float bunnyhopdistance;
-       vector deviation;
-       float maxspeed;
-
        // Don't jump when attacking
        if(this.aistatus & AI_STATUS_ATTACKING)
                return;
@@ -276,10 +270,8 @@ void havocbot_bunnyhop(entity this, vector dir)
        if(IS_PLAYER(this.goalcurrent))
                return;
 
-       maxspeed = autocvar_sv_maxspeed;
-
-       if(this.aistatus & AI_STATUS_RUNNING && vdist(this.velocity, <, autocvar_sv_maxspeed * 0.75)
-               || this.aistatus & AI_STATUS_DANGER_AHEAD)
+       if((this.aistatus & AI_STATUS_RUNNING) && vdist(this.velocity, <, autocvar_sv_maxspeed * 0.75)
+               || (this.aistatus & AI_STATUS_DANGER_AHEAD))
        {
                this.aistatus &= ~AI_STATUS_RUNNING;
                PHYS_INPUT_BUTTON_JUMP(this) = false;
@@ -301,110 +293,80 @@ void havocbot_bunnyhop(entity this, vector dir)
        }
 
        vector gco = get_closer_dest(this.goalcurrent, this.origin);
-       bunnyhopdistance = vlen(this.origin - gco);
 
        // Run only to visible goals
        if(IS_ONGROUND(this))
-       if(vdist(vec2(this.velocity), >=, autocvar_sv_maxspeed)) // if -really- running
+       if(vdist(vec2(this.velocity), >=, autocvar_sv_maxspeed))
        if(checkpvs(this.origin + this.view_ofs, this.goalcurrent))
        {
-                       this.bot_lastseengoal = this.goalcurrent;
+               this.bot_lastseengoal = this.goalcurrent;
 
-                       // seen it before
-                       if(this.bot_timelastseengoal)
+               // seen it before
+               if(this.bot_timelastseengoal)
+               {
+                       // for a period of time
+                       if(time - this.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay)
                        {
-                               // for a period of time
-                               if(time - this.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay)
-                               {
-                                       float checkdistance;
-                                       checkdistance = true;
+                               bool checkdistance = true;
 
-                                       // don't run if it is too close
-                                       if(this.bot_canruntogoal==0)
-                                       {
-                                               if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_startdistance)
-                                                       this.bot_canruntogoal = 1;
-                                               else
-                                                       this.bot_canruntogoal = -1;
-                                       }
+                               // don't run if it is too close
+                               if(this.bot_canruntogoal==0)
+                               {
+                                       if(vdist(this.origin - gco, >, autocvar_bot_ai_bunnyhop_startdistance))
+                                               this.bot_canruntogoal = 1;
+                                       else
+                                               this.bot_canruntogoal = -1;
+                               }
 
-                                       if(this.bot_canruntogoal != 1)
-                                               return;
+                               if(this.bot_canruntogoal != 1)
+                                       return;
 
-                                       if(this.aistatus & AI_STATUS_ROAMING)
-                                       if(this.goalcurrent.classname=="waypoint")
-                                       if (!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL))
-                                       if(fabs(gco.z - this.origin.z) < this.maxs.z - this.mins.z)
-                                       if(this.goalstack01 && !wasfreed(this.goalstack01))
+                               if(this.aistatus & AI_STATUS_ROAMING)
+                               if(this.goalcurrent.classname == "waypoint")
+                               if(!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL))
+                               if(fabs(gco.z - this.origin.z) < this.maxs.z - this.mins.z)
+                               if(this.goalstack01 && !wasfreed(this.goalstack01))
+                               {
+                                       vector gno = (this.goalstack01.absmin + this.goalstack01.absmax) * 0.5;
+                                       vector deviation = vectoangles(gno - this.origin) - vectoangles(gco - this.origin);
+                                       while (deviation.y < -180) deviation.y = deviation.y + 360;
+                                       while (deviation.y > 180) deviation.y = deviation.y - 360;
+
+                                       if(fabs(deviation.y) < 20)
+                                       if(vlen2(this.origin - gco) < vlen2(this.origin - gno))
+                                       if(fabs(gno.z - gco.z) < this.maxs.z - this.mins.z)
                                        {
-                                               vector gno = (this.goalstack01.absmin + this.goalstack01.absmax) * 0.5;
-                                               deviation = vectoangles(gno - this.origin) - vectoangles(gco - this.origin);
-                                               while (deviation.y < -180) deviation.y = deviation.y + 360;
-                                               while (deviation.y > 180) deviation.y = deviation.y - 360;
-
-                                               if(fabs(deviation.y) < 20)
-                                               if(bunnyhopdistance < vlen(this.origin - gno))
-                                               if(fabs(gno.z - gco.z) < this.maxs.z - this.mins.z)
+                                               if(vdist(gco - gno, >, autocvar_bot_ai_bunnyhop_startdistance))
+                                               if(checkpvs(this.origin + this.view_ofs, this.goalstack01))
                                                {
-                                                       if(vdist(gco - gno, >, autocvar_bot_ai_bunnyhop_startdistance))
-                                                       if(checkpvs(this.origin + this.view_ofs, this.goalstack01))
-                                                       {
-                                                               checkdistance = false;
-                                                       }
+                                                       checkdistance = false;
                                                }
                                        }
+                               }
 
-                                       if(checkdistance)
-                                       {
-                                               this.aistatus &= ~AI_STATUS_RUNNING;
-                                               // increase stop distance in case the goal is on a slope or a lower platform
-                                               if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_stopdistance + (this.origin.z - gco.z))
-                                                       PHYS_INPUT_BUTTON_JUMP(this) = true;
-                                       }
-                                       else
-                                       {
-                                               this.aistatus |= AI_STATUS_RUNNING;
+                               if(checkdistance)
+                               {
+                                       this.aistatus &= ~AI_STATUS_RUNNING;
+                                       // increase stop distance in case the goal is on a slope or a lower platform
+                                       if(vdist(this.origin - gco, >, autocvar_bot_ai_bunnyhop_stopdistance + (this.origin.z - gco.z)))
                                                PHYS_INPUT_BUTTON_JUMP(this) = true;
-                                       }
+                               }
+                               else
+                               {
+                                       this.aistatus |= AI_STATUS_RUNNING;
+                                       PHYS_INPUT_BUTTON_JUMP(this) = true;
                                }
                        }
-                       else
-                       {
-                               this.bot_timelastseengoal = time;
-                       }
+               }
+               else
+               {
+                       this.bot_timelastseengoal = time;
+               }
        }
        else
        {
                this.bot_timelastseengoal = 0;
        }
-
-#if 0
-       // Release jump button
-       if(!cvar("sv_pogostick"))
-       if((IS_ONGROUND(this)) == 0)
-       {
-               if(this.velocity.z < 0 || vlen(this.velocity)<maxspeed)
-                       PHYS_INPUT_BUTTON_JUMP(this) = false;
-
-               // Strafe
-               if(this.aistatus & AI_STATUS_RUNNING)
-               if(vlen(this.velocity)>maxspeed)
-               {
-                       deviation = vectoangles(dir) - vectoangles(this.velocity);
-                       while (deviation.y < -180) deviation.y = deviation.y + 360;
-                       while (deviation.y > 180) deviation.y = deviation.y - 360;
-
-                       if(fabs(deviation.y)>10)
-                               CS(this).movement_x = 0;
-
-                       if(deviation.y>10)
-                               CS(this).movement_y = maxspeed * -1;
-                       else if(deviation.y<10)
-                               CS(this).movement_y = maxspeed;
-
-               }
-       }
-#endif
 }
 
 // return true when bot isn't getting closer to the current goal
@@ -1259,9 +1221,15 @@ void havocbot_movetogoal(entity this)
        if(skill+this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
                havocbot_bunnyhop(this, dir);
 
-       if ((dir * v_up) >= autocvar_sv_jumpvelocity*0.5 && (IS_ONGROUND(this))) PHYS_INPUT_BUTTON_JUMP(this) = true;
-       if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-this.bot_dodgeskill)*0.1,1)) PHYS_INPUT_BUTTON_JUMP(this) = true;
-       if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-this.bot_dodgeskill)*0.1,1)) this.havocbot_ducktime=time+0.3/bound(0.1,skill+this.bot_dodgeskill,10);
+       if (dir * v_up >= autocvar_sv_jumpvelocity * 0.5 && IS_ONGROUND(this))
+               PHYS_INPUT_BUTTON_JUMP(this) = true;
+       if (dodge)
+       {
+               if (dodge * v_up > 0 && random() * frametime >= 0.2 * bound(0, (10 - skill - this.bot_dodgeskill) * 0.1, 1))
+                       PHYS_INPUT_BUTTON_JUMP(this) = true;
+               if (dodge * v_up < 0 && random() * frametime >= 0.5 * bound(0, (10 - skill - this.bot_dodgeskill) * 0.1, 1))
+                       this.havocbot_ducktime = time + 0.3 / bound(0.1, skill + this.bot_dodgeskill, 10);
+       }
 }
 
 entity havocbot_gettarget(entity this, bool secondary)
index 2ec6316917f73f32c74ccedaf8ce28d4b4774044..d1a36a117260027569b229cb291cc78e2cd0a70a 100644 (file)
@@ -51,9 +51,6 @@ float havocbot_moveto_refresh_route(entity this);
 
 vector havocbot_dodge(entity this);
 
-.void(entity this) havocbot_role;
-.void(entity this) havocbot_previous_role;
-
 void(entity this, float ratingscale, vector org, float sradius) havocbot_goalrating_items;
 void(entity this, float ratingscale, vector org, float sradius) havocbot_goalrating_enemyplayers;
 
index b72153c95cb0bc371c5e9808b544b785861be7de..84c597329ea5fda0eb0930dfec079be15e7edb22 100644 (file)
 #include "../bot.qh"
 #include "../navigation.qh"
 
-.float bot_ratingscale;
-.float bot_ratingscale_time;
-.float max_armorvalue;
-.float havocbot_role_timeout;
-
-.void(entity this) havocbot_previous_role;
-.void(entity this) havocbot_role;
-
 void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, float sradius)
 {
        // rate waypoints only if there's no alternative goal
@@ -68,10 +60,10 @@ bool havocbot_goalrating_item_pickable_check_players(entity this, vector org, en
        if(!teamplay)
                return true;
 
-       // actually these variables hold the squared distances in order to optimize code
-       float friend_distance = FLOAT_MAX;
-       float enemy_distance = FLOAT_MAX;
-       float dist;
+       // these variables hold squared distances in order to optimize code
+       float friend_dist2 = FLOAT_MAX;
+       float enemy_dist2 = FLOAT_MAX;
+       float dist2;
 
        FOREACH_CLIENT(IS_PLAYER(it) && it != this && !(IS_DEAD(it) || STAT(FROZEN, it)),
        {
@@ -80,13 +72,13 @@ bool havocbot_goalrating_item_pickable_check_players(entity this, vector org, en
                        if (!IS_REAL_CLIENT(it))
                                continue;
 
-                       dist = vlen2(it.origin - item_org);
-                       if(dist > friend_distance)
+                       dist2 = vlen2(it.origin - item_org);
+                       if (dist2 > friend_dist2)
                                continue;
 
                        if(havocbot_goalrating_item_can_be_left_to_teammate(this, it, item))
                        {
-                               friend_distance = dist;
+                               friend_dist2 = dist2;
                                continue;
                        }
                }
@@ -94,25 +86,23 @@ bool havocbot_goalrating_item_pickable_check_players(entity this, vector org, en
                {
                        // If enemy only track distances
                        // TODO: track only if visible ?
-                       dist = vlen2(it.origin - item_org);
-                       if(dist < enemy_distance)
-                               enemy_distance = dist;
+                       dist2 = vlen2(it.origin - item_org);
+                       if (dist2 < enemy_dist2)
+                               enemy_dist2 = dist2;
                }
        });
 
        // Rate the item only if no one needs it, or if an enemy is closer to it
-       dist = vlen2(item_org - org);
-       if ((enemy_distance < friend_distance && dist < enemy_distance) ||
-               (friend_distance > autocvar_bot_ai_friends_aware_pickup_radius ** 2) ||
-               (dist < friend_distance && dist < 200 ** 2))
+       dist2 = vlen2(item_org - org);
+       if ((enemy_dist2 < friend_dist2 && dist2 < enemy_dist2)
+               || (friend_dist2 > autocvar_bot_ai_friends_aware_pickup_radius ** 2)
+               || (dist2 < friend_dist2 && dist2 < 200 ** 2))
                return true;
        return false;
 };
 
 void havocbot_goalrating_items(entity this, float ratingscale, vector org, float sradius)
 {
-       float rating;
-       vector o;
        ratingscale = ratingscale * 0.0001;
 
        IL_EACH(g_items, it.bot_pickup,
@@ -144,7 +134,7 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
 
                        it.bot_pickup_respawning = true;
                }
-               o = (it.absmin + it.absmax) * 0.5;
+               vector o = (it.absmin + it.absmax) * 0.5;
                if(vdist(o - org, >, sradius) || (it == this.ignoregoal && time < this.ignoregoaltime) )
                        continue;
 
@@ -175,25 +165,23 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
 
                it.bot_ratingscale_time = time;
                it.bot_ratingscale = ratingscale;
-               rating = it.bot_pickupevalfunc(this, it);
+               float rating = it.bot_pickupevalfunc(this, it);
                if(rating > 0)
                        navigation_routerating(this, it, rating * ratingscale, 2000);
        });
 }
 
-#define BOT_RATING_ENEMY 2500
 void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org, float sradius)
 {
        if (autocvar_bot_nofire)
                return;
 
        // don't chase players if we're under water
-       if(this.waterlevel>WATERLEVEL_WETFEET)
+       if(this.waterlevel > WATERLEVEL_WETFEET)
                return;
 
        ratingscale = ratingscale * 0.0001;
 
-       float t;
        FOREACH_CLIENT(IS_PLAYER(it) && bot_shouldattack(this, it), {
                // TODO: Merge this logic with the bot_shouldattack function
                if(vdist(it.origin - org, <, 100) || vdist(it.origin - org, >, sradius))
@@ -208,7 +196,7 @@ void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org
                        continue;
                */
 
-               t = ((GetResource(this, RES_HEALTH) + GetResource(this, RES_ARMOR)) - (GetResource(it, RES_HEALTH) + GetResource(it, RES_ARMOR))) / 150;
+               float t = ((GetResource(this, RES_HEALTH) + GetResource(this, RES_ARMOR)) - (GetResource(it, RES_HEALTH) + GetResource(it, RES_ARMOR))) / 150;
                t = bound(0, 1 + t, 3);
                if (skill > 3)
                {
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..23a23759a98a9588fb7e693cbef4f8b45588b7fd 100644 (file)
@@ -1 +1,10 @@
 #pragma once
+
+const float BOT_RATING_ENEMY = 2500;
+
+.float bot_ratingscale;
+.float bot_ratingscale_time;
+.float havocbot_role_timeout;
+
+.void(entity this) havocbot_previous_role;
+.void(entity this) havocbot_role;
index 9de3779870e7c732a9193357cdaba18ecd6af1b8..d69a89400f53be33f8f2079627df8f8ff51f850e 100644 (file)
@@ -1743,7 +1743,6 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en
 }
 
 // automatically create missing waypoints
-.entity botframe_autowaypoints_lastwp0, botframe_autowaypoints_lastwp1;
 void botframe_autowaypoints_fix(entity p, float walkfromwp, .entity fld)
 {
        float r = botframe_autowaypoints_fix_from(p, walkfromwp, p.(fld), fld);
@@ -1839,6 +1838,8 @@ LABEL(next)
        });
 }
 
+//.entity botframe_autowaypoints_lastwp0;
+.entity botframe_autowaypoints_lastwp1;
 void botframe_autowaypoints()
 {
        FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && !IS_DEAD(it), {
index 8261f36b39c391e77feb62374397d671f3bf549a..209958389b1fa0f5057f75c54dbec7e395991fc1 100644 (file)
@@ -40,6 +40,7 @@
 #include "../common/mapobjects/teleporters.qh"
 #include "../common/mapobjects/target/spawnpoint.qh"
 #include <common/mapobjects/trigger/counter.qh>
+#include <common/mapobjects/trigger/swamp.qh>
 
 #include "../common/vehicles/all.qh"
 
@@ -604,7 +605,7 @@ void PutPlayerInServer(entity this)
                this.pauseregen_finished += f;
        }
 
-       this.damageforcescale = 2;
+       this.damageforcescale = autocvar_g_player_damageforcescale;
        this.death_time = 0;
        this.respawn_flags = 0;
        this.respawn_time = 0;
@@ -678,6 +679,9 @@ void PutPlayerInServer(entity this)
        if(this.conveyor)
                IL_REMOVE(g_conveyed, this);
        this.conveyor = NULL; // prevent conveyors at the previous location from moving a freshly spawned player
+       if(this.swampslug)
+               delete(this.swampslug);
+       this.in_swamp = false;
        STAT(HUD, this) = HUD_NORMAL;
 
        this.event_damage = PlayerDamage;
@@ -1034,7 +1038,6 @@ string getwelcomemessage(entity this)
 
        string versionmessage = GetClientVersionMessage(this);
        string s = strcat(versionmessage, "^8\n^8\nmatch type is ^1", gamemode_name, "^8\n");
-       s = strcat(s, "^8\nCurrent map: ^2", GetMapname(), "^8\n");
 
        if(modifications != "")
                s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
@@ -2045,12 +2048,21 @@ void PrintWelcomeMessage(entity this)
        {
                if(PHYS_INPUT_BUTTON_INFO(this)) // BUTTON_INFO hides initial MOTD
                        CS(this).motd_actived_time = -2; // wait until BUTTON_INFO gets released
-               else if(CS(this).motd_actived_time == -2 || IS_PLAYER(this) || IS_SPEC(this))
+               else if (CS(this).motd_actived_time == -2)
                {
-                       // instanctly hide MOTD
+                       // instantly hide MOTD
                        CS(this).motd_actived_time = 0;
                        Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD);
                }
+               else if (IS_PLAYER(this) || IS_SPEC(this))
+               {
+                       // FIXME occasionally for some reason MOTD never goes away
+                       // delay MOTD removal a little bit in the hope it fixes this bug
+                       if (CS(this).motd_actived_time == -1) // MOTD marked to fade away as soon as client becomes player or spectator
+                               CS(this).motd_actived_time = -(5 + floor(random() * 10)); // add small delay
+                       else //if (CS(this).motd_actived_time < -2)
+                               CS(this).motd_actived_time++;
+               }
        }
 }
 
@@ -2393,11 +2405,11 @@ void PlayerPreThink (entity this)
        if (this.netname == "" || this.netname != CS(this).netname_previous)
        {
                bool assume_unchanged = (CS(this).netname_previous == "");
-               if (autocvar_name_maxlength > 0 && strlennocol(this.netname) > autocvar_name_maxlength)
+               if (autocvar_sv_name_maxlength > 0 && strlennocol(this.netname) > autocvar_sv_name_maxlength)
                {
-                       int new_length = textLengthUpToLength(this.netname, autocvar_name_maxlength, strlennocol);
+                       int new_length = textLengthUpToLength(this.netname, autocvar_sv_name_maxlength, strlennocol);
                        this.netname = strzone(strcat(substring(this.netname, 0, new_length), "^7"));
-                       sprint(this, sprintf("Warning: your name is longer than %d characters, it has been truncated.\n", autocvar_name_maxlength));
+                       sprint(this, sprintf("Warning: your name is longer than %d characters, it has been truncated.\n", autocvar_sv_name_maxlength));
                        assume_unchanged = false;
                        // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe?
                }
index 28a61cf1cd4120e270bd8fa491049d9f9e2e8f21..b52649a34ead3389310bb9ef544b4c3e4e1bc3d2 100644 (file)
@@ -298,11 +298,6 @@ string matchid;
 
 bool radar_showennemies;
 
-#ifdef PROFILING
-float client_cefc_accumulator;
-float client_cefc_accumulatortime;
-#endif
-
 .float weapon_load[Weapons_MAX];
 .int ammo_none; // used by the reloading system, must always be 0
 .int clip_load;
index 0901ab44780555d28da3646ef409a62741981321..1688f506c7206baed30e40234ae234048e7b653c 100644 (file)
@@ -74,8 +74,6 @@ void GiveFrags(entity attacker, entity targ, float f, int deathtype, .entity wea
                UpdateFrags(attacker, f);
 }
 
-.entity kh_next;
-
 string AppendItemcodes(string s, entity player)
 {
        for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
@@ -91,12 +89,11 @@ string AppendItemcodes(string s, entity player)
                s = strcat(s, "S");
        if(time < player.invincible_finished)
                s = strcat(s, "I");
-       if(player.flagcarried != NULL)
-               s = strcat(s, "F");
        if(PHYS_INPUT_BUTTON_CHAT(player))
                s = strcat(s, "T");
-       if(player.kh_next)
-               s = strcat(s, "K");
+       // TODO: include these codes as a flag on the item itself
+       MUTATOR_CALLHOOK(LogDeath_AppendItemCodes, player, s);
+       s = M_ARGV(1, string);
        return s;
 }
 
@@ -953,7 +950,7 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in
                                        hitloc = nearest;
 
                                        if(deathtype & WEP_BLASTER.m_id)
-                                               force *= WEP_CVAR_BOTH(blaster, !(deathtype & HITTYPE_SECONDARY), force_zscale);
+                                               force.z *= WEP_CVAR_BOTH(blaster, !(deathtype & HITTYPE_SECONDARY), force_zscale);
 
                                        if(targ != directhitentity)
                                        {
index 453cfc1e70d3664d1725e795c685c36c1e00cb69..b2b91bc02baf71cea1adf089e8236eea2a397667 100644 (file)
@@ -21,8 +21,6 @@
 #include "../lib/warpzone/common.qh"
 #include "../lib/warpzone/server.qh"
 
-.int state;
-
 /*============================================
 
       Wazat's Xonotic Grappling Hook
@@ -72,8 +70,6 @@ And you should be done!
 
 ============================================*/
 
-.float hook_length;
-
 void RemoveGrapplingHooks(entity pl)
 {
        if(pl.move_movetype == MOVETYPE_FLY)
index c0df31662a7d5cea6c95584dd7a13bfd7d969dad..1ed78e2745d9d4a4cdfff18792f9399af50fb7e6 100644 (file)
@@ -8,12 +8,16 @@ void RemoveHook(entity this);
 // (note: you can change the hook impulse #'s to whatever you please)
 .float hook_time;
 
+.float hook_length;
+
 const float HOOK_FIRING = BIT(0);
 const float HOOK_REMOVING = BIT(1);
 const float HOOK_PULLING = BIT(2);
 const float HOOK_RELEASING = BIT(3);
 const float HOOK_WAITING_FOR_RELEASE = BIT(4);
 .float hook_state;
+.int state;
 
 void GrappleHookInit();
 vector hook_shotorigin[4];
+
index 9ef72ae832352149d3dce0b2dc11253774218bbf..8680b83a58b596665d6052d2003f3317310a8aab 100644 (file)
@@ -860,8 +860,14 @@ spawnfunc(worldspawn)
                                        continue;
                                if(argv(0) == "cd")
                                {
+                                       string trackname = argv(2);
                                        LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:");
-                                       LOG_INFO("  cdtrack ", argv(2));
+                                       LOG_INFO("  cdtrack ", trackname);
+                                       if (cvar_value_issafe(trackname))
+                                       {
+                                               string newstuff = strcat(clientstuff, "cd loop \"", trackname, "\"\n");
+                                               strcpy(clientstuff, newstuff);
+                                       }
                                }
                                else if(argv(0) == "fog")
                                {
@@ -984,22 +990,27 @@ float Map_Count, Map_Current;
 string Map_Current_Name;
 
 // NOTE: this now expects the map list to be already tokenized and the count in Map_Count
-float GetMaplistPosition()
+int GetMaplistPosition()
 {
-       float pos, idx;
-       string map;
-
-       map = GetMapname();
-       idx = autocvar_g_maplist_index;
+       string map = GetMapname();
+       int idx = autocvar_g_maplist_index;
 
        if(idx >= 0)
+       {
                if(idx < Map_Count)
+               {
                        if(map == argv(idx))
+                       {
                                return idx;
+                       }
+               }
+       }
 
-       for(pos = 0; pos < Map_Count; ++pos)
+       for(int pos = 0; pos < Map_Count; ++pos)
+       {
                if(map == argv(pos))
                        return pos;
+       }
 
        // resume normal maplist rotation if current map is not in g_maplist
        return idx;
@@ -1022,6 +1033,9 @@ bool MapHasRightSize(string map)
                LOG_TRACE(checkwp_msg, ": has waypoints");
        }
 
+       if(autocvar_g_maplist_ignore_sizes)
+               return true;
+
        // open map size restriction file
        string opensize_msg = strcat("opensize ", map);
        float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
@@ -1199,18 +1213,25 @@ float MaplistMethod_Shuffle(float exponent) // more clever shuffling
 
 void Maplist_Init()
 {
-       Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
-       float i;
-       for (i = 0; i < Map_Count; ++i)
-               if (Map_Check(i, 2))
-                       break;
+       float i = Map_Count = 0;
+       if(autocvar_g_maplist != "")
+       {
+               Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
+               for (i = 0; i < Map_Count; ++i)
+               {
+                       if (Map_Check(i, 2))
+                               break;
+               }
+       }
+       
        if (i == Map_Count)
        {
                bprint( "Maplist contains no usable maps!  Resetting it to default map list.\n" );
                cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags() | MAPINFO_FLAG_NOAUTOMAPLIST));
                if(autocvar_g_maplist_shuffle)
                        ShuffleMaplist();
-               localcmd("\nmenu_cmd sync\n");
+               if(!server_is_dedicated)
+                       localcmd("\nmenu_cmd sync\n");
                Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
        }
        if(Map_Count == 0)
@@ -1224,10 +1245,8 @@ void Maplist_Init()
 
 string GetNextMap()
 {
-       float nextMap;
-
        Maplist_Init();
-       nextMap = -1;
+       float nextMap = -1;
 
        if(nextMap == -1)
                if(autocvar_g_maplist_shuffle > 0)
@@ -1322,9 +1341,7 @@ void GotoNextMap(float reinit)
                return;
        alreadychangedlevel = true;
 
-       string nextMap;
-
-       nextMap = GetNextMap();
+       string nextMap = GetNextMap();
        if(nextMap == "")
                error("Everything is broken - cannot find a next map. Please report this to the developers.");
        Map_Goto(reinit);
index d0dfc4dac98889f48fcda790d63f1d4796de189c..ccb585f013db803975bb0bc12052c375db1c0d3c 100644 (file)
@@ -22,7 +22,7 @@ float Handicap_GetVoluntaryHandicap(entity player)
 
 float Handicap_GetForcedHandicap(entity player)
 {
-       return CS(player).m_handicap;
+       return (CS(player)) ? CS(player).m_handicap : 1;
 }
 
 void Handicap_SetForcedHandicap(entity player, float value)
index 2320eb830ef50db38913df89c96a724ce801080d..49685d49d7ec088c9a3a5a83c993dadbb7f89bbf 100644 (file)
@@ -507,7 +507,7 @@ IMPULSE(waypoint_here_here)
 
 IMPULSE(waypoint_here_crosshair)
 {
-       WarpZone_crosshair_trace(this);
+       WarpZone_crosshair_trace_plusvisibletriggers(this);
        entity wp = WaypointSprite_DeployFixed(WP_Here, false, this, trace_endpos, RADARICON_HERE);
        if (wp) WaypointSprite_Ping(wp);
        sprint(this, "HERE spawned at crosshair\n");
index 9c1596f5d033551167bb5f130a7989e43fb51a16..167a75ae2c371ad5e833099cc962ada6889affac 100644 (file)
@@ -499,7 +499,7 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne
        allow_mutatorblocked = M_ARGV(3, bool);
 
        if(allguns)
-               d = boolean(weaponinfo.spawnflags & WEP_FLAG_NORMAL);
+               d = boolean((weaponinfo.spawnflags & WEP_FLAG_NORMAL) && !(weaponinfo.spawnflags & WEP_FLAG_HIDDEN));
        else if(!mutator_returnvalue)
                d = !(!weaponinfo.weaponstart);
 
@@ -583,9 +583,8 @@ void readplayerstartcvars()
                g_weaponarena = 1;
                g_weaponarena_list = "Most Weapons";
                FOREACH(Weapons, it != WEP_Null, {
-                       if(!(it.spawnflags & WEP_FLAG_MUTATORBLOCKED))
-                               if(it.spawnflags & WEP_FLAG_NORMAL)
-                                       g_weaponarena_weapons |= (it.m_wepset);
+                       if(!(it.spawnflags & WEP_FLAG_MUTATORBLOCKED) && (it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & WEP_FLAG_HIDDEN))
+                               g_weaponarena_weapons |= (it.m_wepset);
                });
        }
        else if (s == "none")
@@ -719,14 +718,6 @@ void readplayerstartcvars()
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        }
 
-       WepSet precache_weapons = start_weapons;
-       if (g_warmup_allguns != 1)
-               precache_weapons |= warmup_start_weapons;
-       FOREACH(Weapons, it != WEP_Null, {
-               if(precache_weapons & (it.m_wepset))
-                       it.wr_init(it);
-       });
-
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
        start_ammo_rockets = max(0, start_ammo_rockets);
index f0237b27ee8b8d55d588fe6386d49deb803d7090..cd09b1defd7ff9051dd5d96e041fd9c303561d0d 100644 (file)
@@ -1222,3 +1222,11 @@ MUTATOR_HOOKABLE(Unfreeze, EV_Unfreeze);
     /**/                            o(int, MUTATOR_ARGV_0_int) \
     /**/
 MUTATOR_HOOKABLE(GetPlayerLimit, EV_GetPlayerLimit);
+
+/** include special item codes for a death to the game log */
+#define EV_LogDeath_AppendItemCodes(i, o) \
+    /** player */         i(entity, MUTATOR_ARGV_0_entity) \
+    /** item codes */     i(string, MUTATOR_ARGV_1_string) \
+    /**/                  o(string, MUTATOR_ARGV_1_string) \
+    /**/
+MUTATOR_HOOKABLE(LogDeath_AppendItemCodes, EV_LogDeath_AppendItemCodes);
index b8d3c903c541cab860c1f596bf118037d534d017..c39f59e7213d3edad4bcbab165b01e7e091ccff5 100644 (file)
@@ -329,9 +329,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1)
                        damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage);
 
-               if(DEATH_ISWEAPON(deathtype, WEP_TUBA))
+               if(deathtype & HITTYPE_SOUND) // sound based attacks cause bleeding from the ears
                {
-                       // tuba causes blood to come out of the ears
                        vector ear1, ear2;
                        vector d;
                        float f;
index b3241838b039ef1523703f759856d86053e8c0b8..9a12a04866c2c251fdd333725f0a22c4af757fff 100644 (file)
 #include "../common/mutators/mutator/waypoints/waypointsprites.qh"
 
 IntrusiveList g_race_targets;
-STATIC_INIT(g_race_targets) { g_race_targets = IL_NEW(); }
+IntrusiveList g_racecheckpoints;
+STATIC_INIT(g_race)
+{
+       g_race_targets = IL_NEW();
+       g_racecheckpoints = IL_NEW();
+}
 
 void race_InitSpectator()
 {
index 4402e22568ce1f027c26f93e6cba1a0e339f278c..4dafbcf63710615df0b75b9ee07df04f4e9718d6 100644 (file)
@@ -31,9 +31,6 @@ float race_completing;
 .float race_respawn_checkpoint;
 .entity race_respawn_spotref; // try THIS spawn in case you respawn
 
-IntrusiveList g_racecheckpoints;
-STATIC_INIT(g_racecheckpoints) { g_racecheckpoints = IL_NEW(); }
-
 // definitions for functions used outside race.qc
 float race_PreviousCheckpoint(float f);
 float race_NextCheckpoint(float f);
index 92c918f00ca2281d360282312cfc3b3b9e1fc5df..310835c5cedb08b07a1f9e2fdff212c36308f1b8 100644 (file)
@@ -17,7 +17,7 @@
 /**
     Uniform push from a point
 **/
-#define steerlib_push(ent,point) normalize(ent.origin - point)
+#define steerlib_push(ent,point) normalize((ent).origin - point)
 /*
 vector steerlib_push(entity this, vector point)
 {
@@ -29,7 +29,7 @@ vector steerlib_push(entity this, vector point)
 **/
 vector steerlib_arrive(entity this, vector point, float maximal_distance)
 {
-    float distance = bound(0.001,vlen(this.origin - point),maximal_distance);
+    float distance = bound(0.001, vlen(this.origin - point), maximal_distance);
     vector direction = normalize(point - this.origin);
     return  direction * (distance / maximal_distance);
 }
@@ -39,21 +39,21 @@ vector steerlib_arrive(entity this, vector point, float maximal_distance)
 **/
 vector steerlib_attract(entity this, vector point, float maximal_distance)
 {
-    float distance = bound(0.001,vlen(this.origin - point),maximal_distance);
+    float distance = bound(0.001, vlen(this.origin - point), maximal_distance);
     vector direction = normalize(point - this.origin);
 
-    return  direction * (1-(distance / maximal_distance));
+    return  direction * (1 - (distance / maximal_distance));
 }
 
-vector steerlib_attract2(entity this, vector point, float min_influense,float max_distance,float max_influense)
+vector steerlib_attract2(entity this, vector point, float min_influense, float max_distance, float max_influense)
 {
-    float distance  = bound(0.00001,vlen(this.origin - point),max_distance);
+    float distance = bound(0.00001, vlen(this.origin - point), max_distance);
     vector direction = normalize(point - this.origin);
 
     float influense = 1 - (distance / max_distance);
     influense = min_influense + (influense * (max_influense - min_influense));
 
-    return  direction * influense;
+    return direction * influense;
 }
 
 /*
@@ -89,27 +89,21 @@ vector steerlib_attract2(vector point, float maximal_distance,float min_influens
 /**
     Move away from a point.
 **/
-vector steerlib_repell(entity this, vector point,float maximal_distance)
+vector steerlib_repel(entity this, vector point, float maximal_distance)
 {
-    float distance;
-    vector direction;
-
-    distance = bound(0.001,vlen(this.origin - point),maximal_distance);
-    direction = normalize(this.origin - point);
+    float distance = bound(0.001, vlen(this.origin - point), maximal_distance);
+    vector direction = normalize(this.origin - point);
 
-    return  direction * (1-(distance / maximal_distance));
+    return  direction * (1 - (distance / maximal_distance));
 }
 
 /**
     Try to keep at ideal_distance away from point
 **/
-vector steerlib_standoff(entity this, vector point,float ideal_distance)
+vector steerlib_standoff(entity this, vector point, float ideal_distance)
 {
-    float distance;
     vector direction;
-
-    distance = vlen(this.origin - point);
-
+    float distance = vlen(this.origin - point);
 
     if(distance < ideal_distance)
     {
@@ -123,22 +117,22 @@ vector steerlib_standoff(entity this, vector point,float ideal_distance)
 }
 
 /**
-    A random heading in a forward halfcicrle
+    A random heading in a forward semicircle
 
-    use like:
-    this.target = steerlib_wander(256,32,this.target)
+    usage:
+    this.target = steerlib_wander(256, 32, this.target)
 
-    where range is the cicrle radius and tresh is how close we need to be to pick a new heading.
+    where range is the circle radius and threshold is how close we need to be to pick a new heading.
+    Assumes v_forward is set by makevectors
 **/
-vector steerlib_wander(entity this, float range, float tresh, vector oldpoint)
+vector steerlib_wander(entity this, float range, float threshold, vector oldpoint)
 {
-    vector wander_point;
-    wander_point = v_forward - oldpoint;
+    vector wander_point = v_forward - oldpoint;
 
-    if (vdist(wander_point, >, tresh))
+    if (vdist(wander_point, >, threshold))
         return oldpoint;
 
-    range = bound(0,range,1);
+    range = bound(0, range, 1);
 
     wander_point = this.origin + v_forward * 128;
     wander_point = wander_point + randomvec() * (range * 128) - randomvec() * (range * 128);
@@ -147,17 +141,15 @@ vector steerlib_wander(entity this, float range, float tresh, vector oldpoint)
 }
 
 /**
-    Dodge a point. dont work to well.
+    Dodge a point NOTE: doesn't work well
 **/
 vector steerlib_dodge(entity this, vector point, vector dodge_dir, float min_distance)
 {
-    float distance;
-
-    distance = max(vlen(this.origin - point),min_distance);
+    float distance = max(vlen(this.origin - point), min_distance);
     if (min_distance < distance)
         return '0 0 0';
 
-    return dodge_dir * (min_distance/distance);
+    return dodge_dir * (min_distance / distance);
 }
 
 /**
@@ -165,20 +157,19 @@ vector steerlib_dodge(entity this, vector point, vector dodge_dir, float min_dis
     Group will move towards the unified direction while keeping close to eachother.
 **/
 .float flock_id;
-vector steerlib_flock(entity this, float _radius, float standoff,float separation_force,float flock_force)
+vector steerlib_flock(entity this, float _radius, float standoff, float separation_force, float flock_force)
 {
-    entity flock_member;
     vector push = '0 0 0', pull = '0 0 0';
-    float ccount = 0;
+    int ccount = 0;
 
-    flock_member = findradius(this.origin, _radius);
+    entity flock_member = findradius(this.origin, _radius);
     while(flock_member)
     {
         if(flock_member != this)
         if(flock_member.flock_id == this.flock_id)
         {
             ++ccount;
-            push = push + (steerlib_repell(this, flock_member.origin,standoff) * separation_force);
+            push = push + (steerlib_repel(this, flock_member.origin,standoff) * separation_force);
             pull = pull + (steerlib_arrive(this, flock_member.origin + flock_member.velocity, _radius) * flock_force);
         }
         flock_member = flock_member.chain;
@@ -191,20 +182,19 @@ vector steerlib_flock(entity this, float _radius, float standoff,float separatio
     Group will move towards the unified direction while keeping close to eachother.
     xy only version (for ground movers).
 **/
-vector steerlib_flock2d(entity this, float _radius, float standoff,float separation_force,float flock_force)
+vector steerlib_flock2d(entity this, float _radius, float standoff, float separation_force, float flock_force)
 {
-    entity flock_member;
     vector push = '0 0 0', pull = '0 0 0';
-    float ccount = 0;
+    int ccount = 0;
 
-    flock_member = findradius(this.origin,_radius);
+    entity flock_member = findradius(this.origin,_radius);
     while(flock_member)
     {
         if(flock_member != this)
         if(flock_member.flock_id == this.flock_id)
         {
             ++ccount;
-            push = push + (steerlib_repell(this, flock_member.origin, standoff) * separation_force);
+            push = push + (steerlib_repel(this, flock_member.origin, standoff) * separation_force);
             pull = pull + (steerlib_arrive(this, flock_member.origin + flock_member.velocity, _radius) * flock_force);
         }
         flock_member = flock_member.chain;
@@ -218,25 +208,23 @@ vector steerlib_flock2d(entity this, float _radius, float standoff,float separat
 
 /**
     All members want to be in the center, and keep away from eachother.
-    The furtehr form the center the more they want to be there.
+    The further from the center the more they want to be there.
 
     This results in a aligned movement (?!) much like flocking.
 **/
-vector steerlib_swarm(entity this, float _radius, float standoff,float separation_force,float swarm_force)
+vector steerlib_swarm(entity this, float _radius, float standoff, float separation_force, float swarm_force)
 {
-    entity swarm_member;
     vector force = '0 0 0', center = '0 0 0';
-    float ccount = 0;
-
-    swarm_member = findradius(this.origin,_radius);
+    int ccount = 0;
 
+    entity swarm_member = findradius(this.origin,_radius);
     while(swarm_member)
     {
         if(swarm_member.flock_id == this.flock_id)
         {
             ++ccount;
             center = center + swarm_member.origin;
-            force = force + (steerlib_repell(this, swarm_member.origin,standoff) * separation_force);
+            force = force + (steerlib_repel(this, swarm_member.origin,standoff) * separation_force);
         }
         swarm_member = swarm_member.chain;
     }
@@ -252,93 +240,80 @@ vector steerlib_swarm(entity this, float _radius, float standoff,float separatio
     Run four tracelines in a forward funnel, bias each diretion negative if something is found there.
     You need to call makevectors() (or equivalent) before this function to set v_forward and v_right
 **/
-vector steerlib_traceavoid(entity this, float pitch,float length)
+vector steerlib_traceavoid(entity this, float pitch, float length)
 {
-    vector vup_left,vup_right,vdown_left,vdown_right;
-    float fup_left,fup_right,fdown_left,fdown_right;
-    vector upwish,downwish,leftwish,rightwish;
-    vector v_left,v_down;
-
+    vector v_left = v_right * -1;
+    vector v_down = v_up * -1;
 
-    v_left = v_right * -1;
-    v_down = v_up * -1;
-
-    vup_left = (v_forward + (v_left * pitch + v_up * pitch)) * length;
-    traceline(this.origin, this.origin +  vup_left,MOVE_NOMONSTERS,this);
-    fup_left = trace_fraction;
+    vector vup_left = (v_forward + (v_left * pitch + v_up * pitch)) * length;
+    traceline(this.origin, this.origin +  vup_left, MOVE_NOMONSTERS, this);
+    float fup_left = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
 
-    vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length;
-    traceline(this.origin,this.origin + vup_right ,MOVE_NOMONSTERS,this);
-    fup_right = trace_fraction;
+    vector vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length;
+    traceline(this.origin, this.origin + vup_right, MOVE_NOMONSTERS, this);
+    float fup_right = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
 
-    vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length;
-    traceline(this.origin,this.origin + vdown_left,MOVE_NOMONSTERS,this);
-    fdown_left = trace_fraction;
+    vector vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length;
+    traceline(this.origin, this.origin + vdown_left, MOVE_NOMONSTERS, this);
+    float fdown_left = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
 
-    vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length;
-    traceline(this.origin,this.origin + vdown_right,MOVE_NOMONSTERS,this);
-    fdown_right = trace_fraction;
+    vector vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length;
+    traceline(this.origin, this.origin + vdown_right, MOVE_NOMONSTERS, this);
+    float fdown_right = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
-    upwish    = v_up    * (fup_left   + fup_right);
-    downwish  = v_down  * (fdown_left + fdown_right);
-    leftwish  = v_left  * (fup_left   + fdown_left);
-    rightwish = v_right * (fup_right  + fdown_right);
+    vector upwish    = v_up    * (fup_left   + fup_right);
+    vector downwish  = v_down  * (fdown_left + fdown_right);
+    vector leftwish  = v_left  * (fup_left   + fdown_left);
+    vector rightwish = v_right * (fup_right  + fdown_right);
 
-    return (upwish+leftwish+downwish+rightwish) * 0.25;
+    return (upwish + leftwish + downwish + rightwish) * 0.25;
 
 }
 
 /**
     Steer towards the direction least obstructed.
     Run tracelines in a forward trident, bias each direction negative if something is found there.
+    You need to call makevectors() (or equivalent) before this function to set v_forward and v_right
 **/
 vector steerlib_traceavoid_flat(entity this, float pitch, float length, vector vofs)
 {
-    vector vt_left, vt_right,vt_front;
-    float f_left, f_right,f_front;
-    vector leftwish, rightwish,frontwish, v_left;
+    vector v_left = v_right * -1;
 
-    v_left = v_right * -1;
-
-
-    vt_front = v_forward * length;
+    vector vt_front = v_forward * length;
     traceline(this.origin + vofs, this.origin + vofs + vt_front,MOVE_NOMONSTERS,this);
-    f_front = trace_fraction;
+    float f_front = trace_fraction;
 
-    vt_left = (v_forward + (v_left * pitch)) * length;
+    vector vt_left = (v_forward + (v_left * pitch)) * length;
     traceline(this.origin + vofs, this.origin + vofs + vt_left,MOVE_NOMONSTERS,this);
-    f_left = trace_fraction;
+    float f_left = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
 
-    vt_right = (v_forward + (v_right * pitch)) * length;
+    vector vt_right = (v_forward + (v_right * pitch)) * length;
     traceline(this.origin + vofs, this.origin + vofs + vt_right ,MOVE_NOMONSTERS,this);
-    f_right = trace_fraction;
+    float f_right = trace_fraction;
 
     //te_lightning1(NULL,this.origin, trace_endpos);
 
-    leftwish  = v_left    * f_left;
-    rightwish = v_right   * f_right;
-    frontwish = v_forward * f_front;
+    vector leftwish  = v_left    * f_left;
+    vector rightwish = v_right   * f_right;
+    vector frontwish = v_forward * f_front;
 
     return normalize(leftwish + rightwish + frontwish);
 }
 
 //#define BEAMSTEER_VISUAL
-float beamsweep(entity this, vector from, vector dir,float length, float step,float step_up, float step_down)
+float beamsweep(entity this, vector from, vector dir, float length, float step, float step_up, float step_down)
 {
-    float i;
-    vector a, b, u, d;
-
-    u = '0 0 1' * step_up;
-    d = '0 0 1' * step_down;
+    vector u = '0 0 1' * step_up;
+    vector d = '0 0 1' * step_down;
 
     traceline(from + u, from - d,MOVE_NORMAL,this);
     if(trace_fraction == 1.0)
@@ -347,11 +322,11 @@ float beamsweep(entity this, vector from, vector dir,float length, float step,fl
     if(!location_isok(trace_endpos, false, false))
         return 0;
 
-    a = trace_endpos;
-    for(i = 0; i < length; i += step)
+    vector a = trace_endpos;
+    for(int i = 0; i < length; i += step)
     {
 
-        b = a + dir * step;
+        vector b = a + dir * step;
         tracebox(a + u,'-4 -4 -4','4 4 4', b + u,MOVE_NORMAL,this);
         if(trace_fraction != 1.0)
             return i / length;
@@ -374,31 +349,27 @@ float beamsweep(entity this, vector from, vector dir,float length, float step,fl
 
 vector steerlib_beamsteer(entity this, vector dir, float length, float step, float step_up, float step_down)
 {
-    float bm_forward, bm_right, bm_left,p;
-    vector vr,vl;
-
     dir.z *= 0.15;
-    vr = vectoangles(dir);
-    //vr_x *= -1;
+    vector vr = vectoangles(dir);
+    //vr.x *= -1;
 
     tracebox(this.origin + '0 0 1' * step_up, this.mins, this.maxs, ('0 0 1' * step_up) + this.origin +  (dir * length), MOVE_NOMONSTERS, this);
     if(trace_fraction == 1.0)
     {
-        //te_lightning1(this,this.origin,this.origin +  (dir * length));
+        //te_lightning1(this,this.origin,this.origin + (dir * length));
         return dir;
     }
 
     makevectors(vr);
-    bm_forward = beamsweep(this, this.origin, v_forward, length, step, step_up, step_down);
+    float bm_forward = beamsweep(this, this.origin, v_forward, length, step, step_up, step_down);
 
     vr = normalize(v_forward + v_right * 0.125);
-    vl = normalize(v_forward - v_right * 0.125);
+    vector vl = normalize(v_forward - v_right * 0.125);
 
-    bm_right = beamsweep(this, this.origin, vr, length, step, step_up, step_down);
-    bm_left  = beamsweep(this, this.origin, vl, length, step, step_up, step_down);
+    float bm_right = beamsweep(this, this.origin, vr, length, step, step_up, step_down);
+    float bm_left  = beamsweep(this, this.origin, vl, length, step, step_up, step_down);
 
-
-    p = bm_left + bm_right;
+    float p = bm_left + bm_right;
     if(p == 2)
     {
         //te_lightning1(this,this.origin + '0 0 32',this.origin + '0 0 32' + vr * length);
@@ -435,5 +406,4 @@ vector steerlib_beamsteer(entity this, vector dir, float length, float step, flo
     vl = vl * bm_left;
 
     return normalize(vr + vl);
-
 }
index 9be3c18f6017183f8d81319e0cdb75e4a2d16e51..a281e9054be8a17ebebcb44efa0454a1a2e7a947 100644 (file)
 #include "../lib/warpzone/common.qh"
 #include "../lib/warpzone/server.qh"
 
-.float lastground;
-.int state;
-
 void CreatureFrame_hotliquids(entity this)
 {
-       if (this.dmgtime < time)
+       if (this.dmgtime > time)
        {
-               this.dmgtime = time + autocvar_g_balance_contents_damagerate;
+               return;
+       }
 
-               if (this.flags & FL_PROJECTILE)
-               {
-                       if (this.watertype == CONTENT_LAVA)
-                               Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
-                       else if (this.watertype == CONTENT_SLIME)
-                               Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
-               }
-               else
+       this.dmgtime = time + autocvar_g_balance_contents_damagerate;
+
+       if (this.flags & FL_PROJECTILE)
+       {
+               if (this.watertype == CONTENT_LAVA)
+                       Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
+               else if (this.watertype == CONTENT_SLIME)
+                       Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
+       }
+       else
+       {
+               if (this.watertype == CONTENT_LAVA)
                {
-                       if (this.watertype == CONTENT_LAVA)
+                       if (this.watersound_finished < time)
                        {
-                               if (this.watersound_finished < time)
-                               {
-                                       this.watersound_finished = time + 0.5;
-                                       sound (this, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
-                               }
-                               Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
-                               if(autocvar_g_balance_contents_playerdamage_lava_burn)
-                                       Fire_AddDamage(this, NULL, autocvar_g_balance_contents_playerdamage_lava_burn * this.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * this.waterlevel, DEATH_LAVA.m_id);
+                               this.watersound_finished = time + 0.5;
+                               sound (this, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
                        }
-                       else if (this.watertype == CONTENT_SLIME)
+                       Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
+                       if(autocvar_g_balance_contents_playerdamage_lava_burn)
+                               Fire_AddDamage(this, NULL, autocvar_g_balance_contents_playerdamage_lava_burn * this.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * this.waterlevel, DEATH_LAVA.m_id);
+               }
+               else if (this.watertype == CONTENT_SLIME)
+               {
+                       if (this.watersound_finished < time)
                        {
-                               if (this.watersound_finished < time)
-                               {
-                                       this.watersound_finished = time + 0.5;
-                                       sound (this, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
-                               }
-                               Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
+                               this.watersound_finished = time + 0.5;
+                               sound (this, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
                        }
+                       Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
                }
        }
 }
@@ -96,35 +95,36 @@ void CreatureFrame_Liquids(entity this)
 
 void CreatureFrame_FallDamage(entity this)
 {
-       if(!IS_VEHICLE(this) && !(this.flags & FL_PROJECTILE)) // vehicles don't get falling damage
-       if(this.velocity || this.oldvelocity) // moving or has moved
+       if(IS_VEHICLE(this) || (this.flags & FL_PROJECTILE))
+               return; // vehicles and projectiles don't receive fall damage
+       if(!(this.velocity || this.oldvelocity))
+               return; // if the entity hasn't moved and isn't moving, then don't do anything
+
+       // check for falling damage
+       float velocity_len = vlen(this.velocity);
+       bool have_hook = false;
+       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
        {
-               // check for falling damage
-               float velocity_len = vlen(this.velocity);
-               bool have_hook = false;
-               for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+           .entity weaponentity = weaponentities[slot];
+           if(this.(weaponentity).hook && this.(weaponentity).hook.state)
            {
-               .entity weaponentity = weaponentities[slot];
-               if(this.(weaponentity).hook && this.(weaponentity).hook.state)
-               {
-                       have_hook = true;
-                       break;
-               }
+               have_hook = true;
+               break;
            }
-               if(!have_hook)
-               {
-                       float dm = vlen(this.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
-                       if (IS_DEAD(this))
-                               dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
-                       else
-                               dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
-                       if (dm > 0)
-                               Damage (this, NULL, NULL, dm, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
-               }
-
-               if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
-                       Damage (this, NULL, NULL, 100000, DEATH_SHOOTING_STAR.m_id, DMG_NOWEP, this.origin, '0 0 0');
        }
+       if(!have_hook)
+       {
+               float dm = vlen(this.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
+               if (IS_DEAD(this))
+                       dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
+               else
+                       dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
+               if (dm > 0)
+                       Damage (this, NULL, NULL, dm, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
+       }
+
+       if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
+               Damage (this, NULL, NULL, 100000, DEATH_SHOOTING_STAR.m_id, DMG_NOWEP, this.origin, '0 0 0');
 }
 
 void CreatureFrame_All()
index 93480cf282ec6c5377ac13197eea0dbe009ddfd2..46284fde2e51f134609dc067532d25428d8de487 100644 (file)
@@ -2,6 +2,11 @@
 
 bool expr_evaluate(string s);
 
+#ifdef PROFILING
+float client_cefc_accumulator;
+float client_cefc_accumulatortime;
+#endif
+
 /*
 ==================
 main
index f2e24a7a57a0722d69af094465d76cb7f8118505..ff9438e76d84b205679a05982d5b8bc1eb0b57f3 100644 (file)
@@ -865,12 +865,10 @@ int TeamBalance_CompareTeams(entity balance, int team_index_a, int team_index_b,
 
 void TeamBalance_AutoBalanceBots()
 {
-       if (!autocvar_g_balance_teams ||
-               !autocvar_g_balance_teams_prevent_imbalance)
-       {
-               return;
-       }
-       //PrintToChatAll("TeamBalance_AutoBalanceBots");
+       // checks disabled because we always want auto-balanced bots
+       //if (!(autocvar_g_balance_teams && autocvar_g_balance_teams_prevent_imbalance))
+       //      return;
+
        entity balance = TeamBalance_CheckAllowedTeams(NULL);
        TeamBalance_GetTeamCounts(balance, NULL);
        int smallest_team_index = 0;
index dfa1389721aa456db09d41381b607e5688bbc584..99fa2df749eb9215c09789e86ec24bfd22d6fad5 100644 (file)
@@ -213,10 +213,7 @@ void W_SetupProjVelocity_Explicit(entity proj, vector dir, vector upDir, float p
 
 void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
 {
-       entity pseudoprojectile = NULL;
-
        vector dir = normalize(end - start);
-       float length = vlen(end - start);
        vector force = dir * bforce;
 
        // go a little bit into the wall because we need to hit this wall later
@@ -273,42 +270,31 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
                it.solid = it.railgunhitsolidbackup;
        });
 
-       // spawn a temporary explosion entity for RadiusDamage calls
-       //explosion = spawn();
+       // Find all players the beam passed close by (even those hit)
+       float length = vlen(endpoint - start);
+       entity pseudoprojectile = NULL;
+       FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
+               // not when spectating the shooter
+               if (IS_SPEC(it) && it.enemy == this) continue;
 
-       // Find all non-hit players the beam passed close by
-       if(deathtype == WEP_VAPORIZER.m_id || deathtype == WEP_VORTEX.m_id) // WEAPONTODO
-       {
-               FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
-                       if(!it.railgunhit)
-                       if(!(IS_SPEC(it) && it.enemy == this))
-                       {
-                               msg_entity = it;
-                               // nearest point on the beam
-                               vector beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
+               // nearest point on the beam
+               vector beampos = start + dir * bound(0, (it.origin - start) * dir, length);
 
-                               float f = bound(0, 1 - vlen(beampos - msg_entity.origin) / 512, 1);
-                               if(f <= 0)
-                                       continue;
+               if(!pseudoprojectile)
+                       pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
 
-                               if(!pseudoprojectile)
-                                       pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
-                               soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASE * f, ATTEN_NONE);
-                       }
-               });
-
-               if(pseudoprojectile)
-                       delete(pseudoprojectile);
-       }
+               msg_entity = it;
+               // we want this to be very loud when close but fall off quickly -> using max base volume and high attenuation
+               soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASEVOICE, ATTEN_IDLE);
+       });
+       if(pseudoprojectile)
+               delete(pseudoprojectile);
 
        // find all the entities the railgun hit and hurt them
        IL_EACH(g_railgunhit, it.railgunhit,
        {
                // removal from the list is handled below
 
-               // get the details we need to call the damage function
-               vector hitloc = it.railgunhitloc;
-
                float foff = ExponentialFalloff(mindist, maxdist, halflifedist, it.railgundistance);
                float ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, it.railgundistance);
 
@@ -317,11 +303,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
 
                // apply the damage
                if (it.takedamage)
-                       Damage (it, this, this, bdamage * foff, deathtype, weaponentity, hitloc, it.railgunforce * ffs);
-
-               // create a small explosion to throw gibs around (if applicable)
-               //setorigin(explosion, hitloc);
-               //RadiusDamage (explosion, this, 10, 0, 50, NULL, NULL, 300, deathtype);
+                       Damage(it, this, this, bdamage * foff, deathtype, weaponentity, it.railgunhitloc, it.railgunforce * ffs);
 
                it.railgunhitloc = '0 0 0';
                it.railgunhitsolidbackup = SOLID_NOT;
index 61651320af290c4d91acda0ec9afc7c3a7691b24..c9a49f924a330b15c327e566d9617ecad3247eeb 100644 (file)
@@ -396,6 +396,7 @@ set g_waypointsprite_timealphaexponent 1
 seta g_waypointsprite_turrets 1 "disable turret waypoints"
 seta g_waypointsprite_turrets_maxdist 5000 "max distance for turret waypoints"
 seta g_waypointsprite_turrets_text 0 "show the turret's name in the waypoint"
+seta g_waypointsprite_turrets_onlyhurt 0 "only show the turret waypoint for a short period after being hurt"
 seta g_waypointsprite_uppercase 1
 seta g_waypointsprite_text 0 "Always show text instead of icons, setting this to 0 will still use text if the icon is unavailable"
 seta g_waypointsprite_iconsize 32
index 3a01784c7c5d4bf6c5451fbda664ad0d44f83799..f44d9c96f969fa5853216a289a2d8c7e0bdeffb9 100644 (file)
@@ -1,3 +1,10 @@
+// most common prefixes (currently not used consistently - especially g_ and sv_):
+// cl_ client
+// g_ gameplay
+// r_ renderer
+// sv_ server administration, should not affect gameplay
+// _ temporary, private or internal cvar - should not be changed manually, sometimes used in scripts
+
 // Xonotic version (formatted for machines)
 // used to determine if a client version is compatible
 // this doesn't have to be bumped with every release
index d66662749674d8a96dd734d80fdd587b17eb5a7b..d261e262eab2a9351d4542b7969afa1fbd72f680 100644 (file)
@@ -2,7 +2,7 @@
 // note that it doesn't reset all server cvars,
 // some are shared with the client and so are left in xonotic-common.cfg
 
-set name_maxlength 64 "max player name length (not counting color codes) allowed by the server"
+set sv_name_maxlength 64 "max player name length (not counting color codes) allowed by the server"
 
 // taunts and voices
 set sv_taunt 1 "allow taunts on the server"
@@ -59,10 +59,10 @@ set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last,
 set sv_gibhealth 100 "Minus health a dead body must have in order to get gibbed"
 
 // use default physics
-set sv_friction_on_land 0
-set sv_friction_slick 0.5
+set sv_friction_on_land 0 "movement friction applied for half a second upon landing on the ground"
+set sv_friction_slick 0.5 "movement friction while on slick surfaces"
 
-set sv_slick_applygravity 0
+set sv_slick_applygravity 0 "apply a downward force while on slick surfaces to simulate slippery slopes"
 
 set sv_aircontrol_backwards 0 "apply forward aircontrol options to backward movement"
 set sv_aircontrol_sidewards 0 "apply forward aircontrol options to sideward movement"
@@ -81,23 +81,23 @@ set sv_jumpspeedcap_max_disable_on_ramps 0 "disable upper baseline velocity boun
 set sv_track_canjump 0 "track if the player released the jump key between 2 jumps to decide if they are able to jump or not"
 set sv_jumpvelocity_crouch 0 "jump height while crouching, set to 0 to use regular jump height"
 
-set sv_precacheplayermodels 1
-set sv_spectator_speed_multiplier 1.5
-set sv_spectator_speed_multiplier_min 1
-set sv_spectator_speed_multiplier_max 5
+set sv_precacheplayermodels 1 "preload all the player models at game start, to avoid delays during gameplay"
+set sv_spectator_speed_multiplier 1.5 "base movement speed factor of spectators, all movement settings scale off this"
+set sv_spectator_speed_multiplier_min 1 "minimum movement speed factor for spectators as determined by scrolling"
+set sv_spectator_speed_multiplier_max 5 "maximum movement speed factor for spectators as determined by scrolling"
 set sv_spectate 1 "if set to 1, new clients are allowed to spectate or observe the game, if set to 0 joining clients spawn as players immediately (no spectating)"
 set sv_defaultcharacter 0 "master switch, if set to 1 the further configuration for replacing all player models, skins and colors is taken from the sv_defaultplayermodel, sv_defaultplayerskin and sv_defaultplayercolors variables"
 set sv_defaultcharacterskin 0 "if set to 1 the further configuration for replacing all skins is taken from the sv_defaultplayerskin variables"
 set sv_defaultplayermodel "models/player/erebus.iqm" "default model selection, only works if sv_defaultcharacter is set to 1; you may append a :<skinnumber> suffix to model names; you can specify multiple, separated by space, and a random one will be chosen"
 set sv_defaultplayerskin 0 "each model has 1 or more skins (combination of model and skin = character), set which skin of the model you wish the default character to have, only works if sv_defaultcharacter is set to 1; can be overridden by :<skinnumber> suffix in sv_defaultplayermodel"
 set sv_defaultplayermodel_red ""       "\"\" means see sv_defaultplayermodel"
-set sv_defaultplayerskin_red 0
+set sv_defaultplayerskin_red 0 "skin to use on the red team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayermodel_blue "" "\"\" means see sv_defaultplayermodel"
-set sv_defaultplayerskin_blue 0
+set sv_defaultplayerskin_blue 0 "skin to use on the blue team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayermodel_yellow "" "\"\" means see sv_defaultplayermodel"
-set sv_defaultplayerskin_yellow 0
+set sv_defaultplayerskin_yellow 0 "skin to use on the yellow team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayermodel_pink "" "\"\" means see sv_defaultplayermodel"
-set sv_defaultplayerskin_pink 0
+set sv_defaultplayerskin_pink 0 "skin to use on the pink team, set to 0 to instead use sv_defaultplayerskin"
 set sv_defaultplayercolors ""  "set to 16*shirt+pants to force a color, note: it does NOT depend on defaultcharacter! Set to \"\" to disable"
 set sv_autoscreenshot 0 "if set to 1, the server forces all clients to create a local screenshot once the map ended"
 net_messagetimeout 30
@@ -118,7 +118,7 @@ set bot_debug_goalstack 0 "Visualize the current path that each bot is following
 set bot_wander_enable 1 "Have bots wander around if they are unable to reach any useful goal. Disable only for debugging purposes."
 set bot_typefrag 0 "Allow bots to shoot players while they're typing"
 // general bot AI cvars
-set bot_ai_thinkinterval 0.05
+set bot_ai_thinkinterval 0.05 "Frame rate at which bots update their navigation and aiming, scales by skill"
 set bot_ai_strategyinterval 7 "How often a new objective is chosen"
 set bot_ai_strategyinterval_movingtarget 5.5 "How often a new objective is chosen when current objective can move"
 set bot_ai_enemydetectioninterval 2 "How often bots pick a new target"
@@ -128,9 +128,9 @@ set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the
 set bot_ai_dangerdetectioninterval 0.25 "How often scan for waypoints with dangers near"
 set bot_ai_dangerdetectionupdates 64 "How many waypoints will be considered for danger detection"
 set bot_ai_aimskill_blendrate 2        "How much correction will be applied to the aiming angle"
-set bot_ai_aimskill_fixedrate 15
+set bot_ai_aimskill_fixedrate 15 "Distance based scale from which correction will be applied to the aiming angle"
 set bot_ai_aimskill_firetolerance 0 "enable fire tolerance"
-set bot_ai_aimskill_firetolerance_distdegrees 100
+set bot_ai_aimskill_firetolerance_distdegrees 100 "Rate at which the aiming angle is updated, scales by skill"
 set bot_ai_aimskill_firetolerance_mindegrees 2 "Minimum angle tolerance. Used on large distances"
 set bot_ai_aimskill_firetolerance_maxdegrees 60 "Maximum firing angle. Used on close range"
 set bot_ai_aimskill_mouse 1 "How much of the aiming filters are applied"
@@ -168,7 +168,7 @@ set bot_ai_timeitems 1 "allow skilled bots to run to important items a little ti
 set bot_ai_timeitems_minrespawndelay 25 "bots run to items with this minimum respawn delay before respawning"
 
 // waypoint editor enable
-set g_waypointeditor 0
+set g_waypointeditor 0 "Enables display and placement of bot navigation waypoints, use g_waypointeditor_saveall when done"
 set g_waypointeditor_auto 0 "Automatically create waypoints for bots while playing; BEWARE, this currently creates too many of them"
 set g_waypointeditor_symmetrical 0 "Enable symmetrical editing of waypoints on symmetrical CTF maps (NOTE: it assumes that the map is perfectly symmetrical). 1: automatically determine origin of symmetry; -1: use custom origin (g_waypointeditor_symmetrical_origin); 2: automatically determine axis of symmetry; -2: use custom axis (g_waypointeditor_symmetrical_axis)"
 set g_waypointeditor_symmetrical_allowload 1 "Allow loading symmetry settings from waypoint files into g_waypointeditor_symmetrical* cvars on map start"
@@ -212,6 +212,7 @@ set g_maplist_index 0       "this is used internally for saving position in maplist cy
 set g_maplist_selectrandom 0   "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
 set g_maplist_shuffle 1        "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
 set g_maplist_check_waypoints 0        "when 1, maps are skipped if there currently are bots, but the map has no waypoints"
+set g_maplist_ignore_sizes 0 "when 1, all maps are shown in the map list regardless of player count"
 
 set g_items_mindist 4000 "starting distance for the fading of items"
 set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after which it will be invisible"
@@ -219,9 +220,10 @@ set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after
 set g_grab_range 200 "distance at which dragable objects can be grabbed"
 
 set g_cloaked 0 "display all players mostly invisible"
-set g_player_alpha 1
+set g_player_alpha 1 "default opacity of players"
 set g_player_brightness 0      "set to 2 for brighter players"
-set g_balance_cloaked_alpha 0.25
+set g_player_damageforcescale 2 "push multiplier of attacks against players"
+set g_balance_cloaked_alpha 0.25 "opacity of cloaked players"
 
 set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
 set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps"
@@ -300,15 +302,15 @@ set sv_logscores_bots 0   "exclude bots by default"
 
 // spam (frag/capture) log
 set sv_eventlog 0      "the master switch for efficiency reasons"
-set sv_eventlog_console 1
-set sv_eventlog_files 0
-set sv_eventlog_files_timestamps 1
-set sv_eventlog_files_counter 0
-set sv_eventlog_files_nameprefix xonotic
-set sv_eventlog_files_namesuffix .log
+set sv_eventlog_console 1 "print event log entries to the console as well"
+set sv_eventlog_files 0 "save the event log to individual files instead of the main server log"
+set sv_eventlog_files_timestamps 1 "include timestamps in the log file names"
+set sv_eventlog_files_counter 0 "internal counter cvar, do not modify"
+set sv_eventlog_files_nameprefix xonotic "prefix of individual log file names"
+set sv_eventlog_files_namesuffix .log "suffix of individual log file names"
 
 set nextmap "" "override the maplist when switching to the next map"
-set lastlevel ""
+set lastlevel "" "for singleplayer use, shows the menu once the match has ended"
 set quit_when_empty 0  "set to 1, then the server exits when the next level would start but is empty"
 set quit_and_redirect ""       "set to an IP to redirect all players at the end of the match to another server. Set to \"self\" to let all players reconnect at the end of the match (use it to make seamless engine updates)"
 set quit_and_redirect_timer 1.5 "set to number of seconds after quit before performing the connect operation of quit_and_redirect"
@@ -322,20 +324,20 @@ alias sv_fbskin_rainbow "sv_defaultcharacter 1; sv_defaultplayermodel models/pla
 
 alias sv_fbskin_off "sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultplayercolors \"\""
 
-set sv_servermodelsonly 1
+set sv_servermodelsonly 1 "enable to prevent players from using playermodels that don't exist on the server"
 
 sv_curl_defaulturl "http://www.xonotic.org/contentdownload/getmap.php?file="
 set sv_curl_serverpackages_auto 1 "automatically add packs with *.serverpackage files to sv_curl_serverpackages"
 
-set sv_motd ""
+set sv_motd "" "additional information to show on the welcome screen that greets joining players"
 
 set g_waypoints_for_items 0    "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
 
 set g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match"
 set g_maplist_votable_keeptwotime 15 "show only 2 options after this amount of time during map vote screen"
 set g_maplist_votable_timeout 30       "timeout for the map voting; must be below 50 seconds!"
-set g_maplist_votable_suggestions 2
-set g_maplist_votable_suggestions_override_mostrecent 0
+set g_maplist_votable_suggestions 2 "number of maps a player is allowed to suggest for the map voting screen"
+set g_maplist_votable_suggestions_override_mostrecent 0 "allow players to suggest maps that have been played recently"
 set g_maplist_votable_nodetail 0       "nodetail only shows total count instead of all vote counts per map, so votes don't influence others that much"
 set g_maplist_votable_abstain 0        "when 1, you can abstain from your vote"
 set g_maplist_votable_screenshot_dir "maps levelshots" "where to look for map screenshots"
@@ -343,7 +345,7 @@ set g_maplist_votable_screenshot_dir "maps levelshots"      "where to look for map sc
 set sv_vote_gametype 0 "show a vote screen for gametypes before map vote screen"
 set sv_vote_gametype_keeptwotime 10 "show only 2 options after this amount of time during gametype vote screen"
 set sv_vote_gametype_options "dm tdm ctf" "Keep the identifiers short, otherwise you'll run into issues with too long alias names (max is 31 characters) when using sv_vote_gametype_hook_*"
-set sv_vote_gametype_timeout 20
+set sv_vote_gametype_timeout 20 "how long the gametype vote screen lasts"
 set sv_vote_gametype_default_current 1 "Keep the current gametype if no one votes"
 
 set g_chat_flood_spl 3 "normal chat: seconds between lines to not count as flooding"
@@ -363,9 +365,9 @@ set g_nick_flood_penalty 0.5 "duration of the nick flood penalty"
 set g_nick_flood_penalty_yellow 3 "number of changes to allow before warning and movement blocking"
 set g_nick_flood_penalty_red 30 "number of changes to allow before totally disorienting the player"
 
-set sv_waypointsprite_deployed_lifetime 10
-set sv_waypointsprite_deadlifetime 1
-set sv_waypointsprite_limitedrange 5120
+set sv_waypointsprite_deployed_lifetime 10 "default lifetime of temporary waypoints"
+set sv_waypointsprite_deadlifetime 1 "fade out lifetime of waypoints being removed"
+set sv_waypointsprite_limitedrange 5120 "default maximum viewing distance of waypoints (if set by the waypoint)"
 
 set sv_itemstime 1 "enable networking of time left until respawn for items such as mega health/armor and powerups"
 
@@ -376,10 +378,10 @@ set g_banned_list ""      "format: IP remainingtime IP remainingtime ..."
 set g_banned_list_idmode "1"   "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)"
 
 // useful vote aliases
-set timelimit_increment 5
-set timelimit_decrement 5
-set timelimit_min 5
-set timelimit_max 60
+set timelimit_increment 5 "number of minutes added to the timer when voting for extendmatchtime"
+set timelimit_decrement 5 "number of minutes removed from the timer when voting for reducematchtime"
+set timelimit_min 5 "shortest match time achieveable with reducematchtime votes"
+set timelimit_max 60 "maximum match time achieveable with extendmatchtime votes"
 
 sv_gameplayfix_delayprojectiles 0
 sv_gameplayfix_q2airaccelerate 1
@@ -387,8 +389,8 @@ sv_gameplayfix_stepmultipletimes 1
 sv_gameplayfix_stepdown 2
 
 // delay for "kill" to prevent abuse
-set g_balance_kill_delay 2
-set g_balance_kill_antispam 5
+set g_balance_kill_delay 2 "timer before death when using the kill command"
+set g_balance_kill_antispam 5 "additional time added to the kill delay if used repeatedly"
 
 // this feature is currently buggy in the engine (it appears to PREVENT any dropping in lots of maps, leading to weirdly aligned entities, and in some cases even CAUSES them to drop through solid, like in facing worlds nex)
 sv_gameplayfix_droptofloorstartsolid 0
@@ -423,9 +425,9 @@ set g_showweaponspawns 1 "1: display waypoints for weapon spawns found on the ma
 //   Quake-Joule:  1 qJ  = 1 qN * 1 qu
 //   Quake-Pascal: 1 qPa = 1 qN / 1 qu^2
 
-set g_ballistics_mindistance 2 // enable ballistics starting from 2 qu
-set g_ballistics_density_player 0.50 // players are 2x as easy to pass as walls
-set g_ballistics_density_corpse 0.10 // corpses are 10x as easy to pass as walls
+set g_ballistics_mindistance 2 "enable ballistics starting from 2 qu"
+set g_ballistics_density_player 0.50 "players are 2x as easy to pass through as walls"
+set g_ballistics_density_corpse 0.10 "corpses are 10x as easy to pass through as walls"
 set g_ballistics_penetrate_clips 0 "allow ballistics to pass through weapon clips"
 
 sv_status_show_qcstatus 1      "Xonotic uses this field instead of frags"
@@ -552,8 +554,8 @@ exec minigames.cfg
 exec physics.cfg
 if_dedicated exec help-xonotic.cfg
 
-set sv_join_notices ""
-set sv_join_notices_time 15
+set sv_join_notices "" "special alerts to show joining players"
+set sv_join_notices_time 15 "how long the alert is shown on the player's screen"
 
 set sv_simple_items 1 "allow or forbid client use of simple items"