]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/q3compat_sanity. Also store supported map features...
authorMario <mario.mario@y7mail.com>
Mon, 27 Jul 2020 06:56:06 +0000 (16:56 +1000)
committerMario <mario.mario@y7mail.com>
Mon, 27 Jul 2020 06:56:06 +0000 (16:56 +1000)
211 files changed:
.gitlab-ci.yml
.tx/merge-base
bal-wep-mario.cfg
bal-wep-nexuiz25.cfg
bal-wep-samual.cfg
bal-wep-xdf.cfg
bal-wep-xonotic.cfg
common.ca.po
common.es.po
common.ja_JP.po
common.zh_CN.po
gamemodes-server.cfg
languages.txt
notifications.cfg
qcsrc/client/hud/panel/infomessages.qc
qcsrc/client/hud/panel/modicons.qc
qcsrc/client/hud/panel/physics.qc
qcsrc/client/hud/panel/racetimer.qc
qcsrc/client/hud/panel/radar.qc
qcsrc/client/hud/panel/score.qc
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/hud/panel/vote.qc
qcsrc/client/mapvoting.qc
qcsrc/client/mutators/events.qh
qcsrc/client/shownames.qc
qcsrc/client/view.qc
qcsrc/common/effects/all.qc
qcsrc/common/effects/all.qh
qcsrc/common/effects/effectinfo.inc
qcsrc/common/effects/qc/globalsound.qc
qcsrc/common/effects/qc/globalsound.qh
qcsrc/common/gamemodes/gamemode/assault/_mod.inc
qcsrc/common/gamemodes/gamemode/assault/_mod.qh
qcsrc/common/gamemodes/gamemode/assault/assault.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/assault/assault.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/clanarena/_mod.inc
qcsrc/common/gamemodes/gamemode/clanarena/_mod.qh
qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/ctf/cl_ctf.qc
qcsrc/common/gamemodes/gamemode/ctf/ctf.qh
qcsrc/common/gamemodes/gamemode/cts/_mod.inc
qcsrc/common/gamemodes/gamemode/cts/_mod.qh
qcsrc/common/gamemodes/gamemode/cts/cl_cts.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/cts/cl_cts.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/cts/cts.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/cts/cts.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/deathmatch/_mod.inc
qcsrc/common/gamemodes/gamemode/deathmatch/_mod.qh
qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/domination/cl_domination.qc
qcsrc/common/gamemodes/gamemode/domination/cl_domination.qh
qcsrc/common/gamemodes/gamemode/domination/domination.qh
qcsrc/common/gamemodes/gamemode/duel/_mod.inc
qcsrc/common/gamemodes/gamemode/duel/_mod.qh
qcsrc/common/gamemodes/gamemode/duel/duel.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/duel/duel.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/freezetag/_mod.inc
qcsrc/common/gamemodes/gamemode/freezetag/_mod.qh
qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/invasion/_mod.inc
qcsrc/common/gamemodes/gamemode/invasion/_mod.qh
qcsrc/common/gamemodes/gamemode/invasion/invasion.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/invasion/invasion.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/invasion/sv_invasion.qc
qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh
qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh
qcsrc/common/gamemodes/gamemode/lms/_mod.inc
qcsrc/common/gamemodes/gamemode/lms/_mod.qh
qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/lms/cl_lms.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/lms/lms.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/lms/lms.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/nexball/cl_nexball.qc
qcsrc/common/gamemodes/gamemode/nexball/nexball.qh
qcsrc/common/gamemodes/gamemode/nexball/weapon.qh
qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qh
qcsrc/common/gamemodes/gamemode/onslaught/sv_onslaught.qc
qcsrc/common/gamemodes/gamemode/race/_mod.inc
qcsrc/common/gamemodes/gamemode/race/_mod.qh
qcsrc/common/gamemodes/gamemode/race/cl_race.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/race/cl_race.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/race/race.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/race/race.qh [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/tdm/_mod.inc
qcsrc/common/gamemodes/gamemode/tdm/_mod.qh
qcsrc/common/gamemodes/gamemode/tdm/tdm.qc [new file with mode: 0644]
qcsrc/common/gamemodes/gamemode/tdm/tdm.qh [new file with mode: 0644]
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/mapobjects/func/bobbing.qc
qcsrc/common/mapobjects/func/breakable.qc
qcsrc/common/mapobjects/func/fourier.qc
qcsrc/common/mapobjects/func/ladder.qc
qcsrc/common/mapobjects/func/ladder.qh
qcsrc/common/mapobjects/func/pendulum.qc
qcsrc/common/mapobjects/func/rotating.qc
qcsrc/common/mapobjects/func/vectormamamam.qc
qcsrc/common/mapobjects/target/changelevel.qc
qcsrc/common/mapobjects/target/speaker.qc
qcsrc/common/mapobjects/teleporters.qc
qcsrc/common/mapobjects/trigger/jumppads.qc
qcsrc/common/monsters/all.qh
qcsrc/common/monsters/monster.qh
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/monster/zombie.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_monsters.qh
qcsrc/common/monsters/sv_spawn.qc
qcsrc/common/monsters/sv_spawn.qh
qcsrc/common/monsters/sv_spawner.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qh
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/overkill/okhmg.qc
qcsrc/common/mutators/mutator/overkill/okhmg.qh
qcsrc/common/mutators/mutator/overkill/okmachinegun.qc
qcsrc/common/mutators/mutator/overkill/okmachinegun.qh
qcsrc/common/mutators/mutator/overkill/oknex.qc
qcsrc/common/mutators/mutator/overkill/okrpc.qc
qcsrc/common/mutators/mutator/overkill/okrpc.qh
qcsrc/common/notifications/all.inc
qcsrc/common/physics/player.qc
qcsrc/common/sounds/all.qc
qcsrc/common/t_items.qc
qcsrc/common/turrets/turret/machinegun_weapon.qc
qcsrc/common/turrets/turret/plasma.qc
qcsrc/common/turrets/turret/plasma_dual.qc
qcsrc/common/turrets/turret/walker_weapon.qc
qcsrc/common/util.qc
qcsrc/common/vehicles/vehicle/raptor.qc
qcsrc/common/vehicles/vehicle/spiderbot.qc
qcsrc/common/viewloc.qc
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/all.qh
qcsrc/common/weapons/weapon.qh
qcsrc/common/weapons/weapon/arc.qc
qcsrc/common/weapons/weapon/arc.qh
qcsrc/common/weapons/weapon/blaster.qc
qcsrc/common/weapons/weapon/blaster.qh
qcsrc/common/weapons/weapon/crylink.qc
qcsrc/common/weapons/weapon/crylink.qh
qcsrc/common/weapons/weapon/devastator.qc
qcsrc/common/weapons/weapon/devastator.qh
qcsrc/common/weapons/weapon/electro.qc
qcsrc/common/weapons/weapon/electro.qh
qcsrc/common/weapons/weapon/fireball.qc
qcsrc/common/weapons/weapon/fireball.qh
qcsrc/common/weapons/weapon/hagar.qc
qcsrc/common/weapons/weapon/hagar.qh
qcsrc/common/weapons/weapon/hlac.qc
qcsrc/common/weapons/weapon/hlac.qh
qcsrc/common/weapons/weapon/hook.qh
qcsrc/common/weapons/weapon/machinegun.qc
qcsrc/common/weapons/weapon/machinegun.qh
qcsrc/common/weapons/weapon/minelayer.qc
qcsrc/common/weapons/weapon/minelayer.qh
qcsrc/common/weapons/weapon/mortar.qc
qcsrc/common/weapons/weapon/mortar.qh
qcsrc/common/weapons/weapon/rifle.qc
qcsrc/common/weapons/weapon/rifle.qh
qcsrc/common/weapons/weapon/seeker.qc
qcsrc/common/weapons/weapon/seeker.qh
qcsrc/common/weapons/weapon/shotgun.qc
qcsrc/common/weapons/weapon/shotgun.qh
qcsrc/common/weapons/weapon/vaporizer.qc
qcsrc/common/weapons/weapon/vaporizer.qh
qcsrc/common/weapons/weapon/vortex.qc
qcsrc/common/weapons/weapon/vortex.qh
qcsrc/ecs/systems/cl_physics.qc
qcsrc/ecs/systems/physics.qc
qcsrc/ecs/systems/sv_physics.qc
qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc
qcsrc/menu/xonotic/dialog_singleplayer.qc
qcsrc/menu/xonotic/gametypelist.qc
qcsrc/menu/xonotic/languagelist.qc
qcsrc/menu/xonotic/slider_resolution.qc
qcsrc/menu/xonotic/util.qc
qcsrc/server/bot/default/havocbot/havocbot.qc
qcsrc/server/bot/default/navigation.qc
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/campaign.qc
qcsrc/server/client.qc
qcsrc/server/clientkill.qc
qcsrc/server/command/common.qc
qcsrc/server/command/getreplies.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/compat/quake3.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_world.qc
qcsrc/server/impulse.qc
qcsrc/server/mapvoting.qc
qcsrc/server/miscfunctions.qh
qcsrc/server/player.qc
qcsrc/server/race.qc
qcsrc/server/spawnpoints.qc
qcsrc/server/teamplay.qc
qcsrc/server/weapons/tracing.qc
qcsrc/server/weapons/tracing.qh
xonotic-server.cfg

index 7294f17225c25b28830698d8be59d502fd755d6c..2f2fd4f2f5d9c43bf212ed09f420eb3178fec310 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=ea6a54e129f245d2472f33475962c8e7
+    - EXPECT=040aeef53953a85c5891c0c39cf9860f
     - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
       | tee /dev/stderr
       | grep '^:'
index 35c8b68c6c7dbc1b6e4819a8915f4fea25bb6b98..615dd52c39dba7579f266d74008786fbef6b543b 100644 (file)
@@ -1 +1 @@
-Thu Jul 16 07:23:56 CEST 2020
+Sun Jul 26 07:24:53 CEST 2020
index 5cfa34882b2710471c8e0a44157dda9feff17eb5..52dfc5f12ca507fcf15c621d2c24514468572dff 100644 (file)
@@ -557,6 +557,7 @@ set g_balance_rifle_primary_bullethail 0
 set g_balance_rifle_primary_burstcost 0
 set g_balance_rifle_primary_damage 80
 set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_headshot_multiplier 0
 set g_balance_rifle_primary_refire 1.2
 set g_balance_rifle_primary_shots 1
 set g_balance_rifle_primary_solidpenetration 62.2
@@ -571,6 +572,7 @@ set g_balance_rifle_secondary_bullethail 0
 set g_balance_rifle_secondary_burstcost 0
 set g_balance_rifle_secondary_damage 20
 set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_headshot_multiplier 0
 set g_balance_rifle_secondary_refire 0.9
 set g_balance_rifle_secondary_reload 0
 set g_balance_rifle_secondary_shots 4
index f9659814b3ea91d425b172095dbc9c264a2e5418..7bc8de485d6c5943c0b4c965cd4406909a246f79 100644 (file)
@@ -557,6 +557,7 @@ set g_balance_rifle_primary_bullethail 0
 set g_balance_rifle_primary_burstcost 0
 set g_balance_rifle_primary_damage 80
 set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_headshot_multiplier 1.25
 set g_balance_rifle_primary_refire 1.2
 set g_balance_rifle_primary_shots 1
 set g_balance_rifle_primary_solidpenetration 62.2
@@ -571,6 +572,7 @@ set g_balance_rifle_secondary_bullethail 0
 set g_balance_rifle_secondary_burstcost 0
 set g_balance_rifle_secondary_damage 20
 set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_headshot_multiplier 0.1875
 set g_balance_rifle_secondary_refire 0.9
 set g_balance_rifle_secondary_reload 0
 set g_balance_rifle_secondary_shots 4
index 6896f5f5e0be99131c379ea538b28a0ff7e3b252..a89f480215ae56c7d4abf98be80d6a7302dd6b08 100644 (file)
@@ -557,6 +557,7 @@ set g_balance_rifle_primary_bullethail 0
 set g_balance_rifle_primary_burstcost 0
 set g_balance_rifle_primary_damage 80
 set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_headshot_multiplier 0
 set g_balance_rifle_primary_refire 1.2
 set g_balance_rifle_primary_shots 1
 set g_balance_rifle_primary_solidpenetration 62.2
@@ -570,6 +571,7 @@ set g_balance_rifle_secondary_animtime 0.3
 set g_balance_rifle_secondary_bullethail 0
 set g_balance_rifle_secondary_burstcost 0
 set g_balance_rifle_secondary_damage 20
+set g_balance_rifle_secondary_headshot_multiplier 0
 set g_balance_rifle_secondary_force 50
 set g_balance_rifle_secondary_refire 0.9
 set g_balance_rifle_secondary_reload 0
index ec8029c74bf28647cae83bf57d806178f6120640..007a36cf56e217c29d8fa749dbcf166f8bcbe29c 100644 (file)
@@ -557,6 +557,7 @@ set g_balance_rifle_primary_bullethail 0
 set g_balance_rifle_primary_burstcost 0
 set g_balance_rifle_primary_damage 80
 set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_headshot_multiplier 0
 set g_balance_rifle_primary_refire 1.2
 set g_balance_rifle_primary_shots 1
 set g_balance_rifle_primary_solidpenetration 62.2
@@ -571,6 +572,7 @@ set g_balance_rifle_secondary_bullethail 0
 set g_balance_rifle_secondary_burstcost 0
 set g_balance_rifle_secondary_damage 20
 set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_headshot_multiplier 0
 set g_balance_rifle_secondary_refire 0.9
 set g_balance_rifle_secondary_reload 0
 set g_balance_rifle_secondary_shots 4
index c38ea832f3e2c53576a9cd2d9c15538d81ca1633..2f7b598b739e6d4664c284c7468fc23d36f11e8a 100644 (file)
@@ -557,6 +557,7 @@ set g_balance_rifle_primary_bullethail 0
 set g_balance_rifle_primary_burstcost 0
 set g_balance_rifle_primary_damage 80
 set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_headshot_multiplier 0
 set g_balance_rifle_primary_refire 1.2
 set g_balance_rifle_primary_shots 1
 set g_balance_rifle_primary_solidpenetration 62.2
@@ -570,6 +571,7 @@ set g_balance_rifle_secondary_animtime 0.3
 set g_balance_rifle_secondary_bullethail 0
 set g_balance_rifle_secondary_burstcost 0
 set g_balance_rifle_secondary_damage 20
+set g_balance_rifle_secondary_headshot_multiplier 0
 set g_balance_rifle_secondary_force 50
 set g_balance_rifle_secondary_refire 0.9
 set g_balance_rifle_secondary_reload 0
index b8332dce87b8b908704dde55f027cc9a7b52231d..7ae9769891b877aeec3dbbb4026f15854d97143a 100644 (file)
@@ -3,14 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
+# LegendGuard, 2020
+# LegendGuard, 2020
 # Roi Asher Gerszkoviez <gerszkoviez@gmail.com>, 2017
 msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2020-06-07 07:23+0200\n"
-"PO-Revision-Date: 2020-06-07 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2020-07-24 22:50+0000\n"
+"Last-Translator: LegendGuard\n"
 "Language-Team: Catalan (http://www.transifex.com/team-xonotic/xonotic/"
 "language/ca/)\n"
 "Language: ca\n"
@@ -22,17 +24,17 @@ msgstr ""
 #: qcsrc/client/hud/hud_config.qc:81
 #, c-format
 msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr ""
+msgstr "^2Exportat amb èxit a %s! (Nota: Està guardat en data/data/)"
 
 #: qcsrc/client/hud/hud_config.qc:85
 #, c-format
 msgid "^1Couldn't write to %s"
-msgstr ""
+msgstr "^1No s'ha pogut escriure a %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:174
 #, c-format
 msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3Missatge de compte enrere a l'hora %s, segons restants: ^COUNT"
 
 #: qcsrc/client/hud/panel/centerprint.qc:176
 #, c-format
@@ -40,19 +42,21 @@ msgid ""
 "^1Multiline message at time %s that\n"
 "^1lasts longer than normal"
 msgstr ""
+"^1Missatge de múltiples línies a l'hora %s\n"
+"^1dura més del normal"
 
 #: qcsrc/client/hud/panel/centerprint.qc:178
 #, c-format
 msgid "Message at time %s"
-msgstr ""
+msgstr "Missatge a l’hora %s"
 
 #: qcsrc/client/hud/panel/centerprint.qc:183
 msgid "Generic message"
-msgstr ""
+msgstr "Missatge genèric"
 
 #: qcsrc/client/hud/panel/chat.qc:89
 msgid "^3Player^7: This is the chat area."
-msgstr ""
+msgstr "^3Jugador^7: Això és l'àrea del xat."
 
 #: qcsrc/client/hud/panel/engineinfo.qc:76
 #, c-format
@@ -61,87 +65,87 @@ msgstr "FPS: %.*f"
 
 #: qcsrc/client/hud/panel/infomessages.qc:95
 msgid "^1Observing"
-msgstr ""
+msgstr "^1Observant"
 
 #: qcsrc/client/hud/panel/infomessages.qc:97
 #, c-format
 msgid "^1Spectating: ^7%s"
-msgstr ""
+msgstr "^1Espectant: ^7%s"
 
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
-msgstr ""
+msgstr "^1Premeu ^3%s^1 per a observar"
 
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #: qcsrc/menu/xonotic/keybinder.qc:47
 msgid "primary fire"
-msgstr ""
+msgstr "tret primari"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #, c-format
 msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
-msgstr ""
+msgstr "^1Premeu ^3%s^1 o ^3%s^1 per al jugador següent o anterior"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/client/hud/panel/infomessages.qc:114
 msgid "next weapon"
-msgstr ""
+msgstr "següent arma"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #: qcsrc/client/hud/panel/infomessages.qc:114
 msgid "previous weapon"
-msgstr ""
+msgstr "anterior arma"
 
 #: qcsrc/client/hud/panel/infomessages.qc:114
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
-msgstr ""
+msgstr "^1Utilitzeu ^3%s^1 o ^3%s^1 per canviar la velocitat"
 
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #, c-format
 msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
-msgstr ""
+msgstr "^1Premeu ^3%s^1 per a observar, ^3%s^1 per canviar el mode de càmera"
 
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
 msgid "drop weapon"
-msgstr ""
+msgstr "amollar arma"
 
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #: qcsrc/menu/xonotic/keybinder.qc:48
 msgid "secondary fire"
-msgstr ""
+msgstr "tret secundari"
 
 #: qcsrc/client/hud/panel/infomessages.qc:119
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
-msgstr ""
+msgstr "^1Prem ^3%s^1 per a informació del mode de joc"
 
 #: qcsrc/client/hud/panel/infomessages.qc:119
 #: qcsrc/menu/xonotic/keybinder.qc:103
 msgid "server info"
-msgstr ""
+msgstr "informació del servidor"
 
 #: qcsrc/client/hud/panel/infomessages.qc:132
 msgid "^1Match has already begun"
-msgstr ""
+msgstr "^1La partida ja ha començat"
 
 #: qcsrc/client/hud/panel/infomessages.qc:134
 msgid "^1You have no more lives left"
-msgstr ""
+msgstr "^1No tens cap vida restant"
 
 #: qcsrc/client/hud/panel/infomessages.qc:136
 #: qcsrc/client/hud/panel/infomessages.qc:139
 #, c-format
 msgid "^1Press ^3%s^1 to join"
-msgstr ""
+msgstr "^1Prem ^3%s^1 per a unir-te"
 
 #: qcsrc/client/hud/panel/infomessages.qc:136
 #: qcsrc/client/hud/panel/infomessages.qc:139
 #: qcsrc/common/notifications/all.qh:430
 msgid "jump"
-msgstr ""
+msgstr "saltar"
 
 #: qcsrc/client/hud/panel/infomessages.qc:147
 #, c-format
@@ -150,767 +154,779 @@ msgstr "^1El joc comença en ^3%d^1 segons"
 
 #: qcsrc/client/hud/panel/infomessages.qc:153
 msgid "^2Currently in ^1warmup^2 stage!"
-msgstr ""
+msgstr "^2Actualment en etapa d'^1escalfament^2!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:168
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
-msgstr ""
+msgstr "%sPrem ^3%s%s per acabar l'escalfament"
 
 #: qcsrc/client/hud/panel/infomessages.qc:168
 #: qcsrc/client/hud/panel/infomessages.qc:170
 #: qcsrc/client/hud/panel/infomessages.qc:183
 #: qcsrc/menu/xonotic/keybinder.qc:99
 msgid "ready"
-msgstr ""
+msgstr "preparat"
 
 #: qcsrc/client/hud/panel/infomessages.qc:170
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
-msgstr ""
+msgstr "%sPrem ^3%s%s quan estiguis llest"
 
 #: qcsrc/client/hud/panel/infomessages.qc:175
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr ""
+"^2Esperant a que els altres estiguin llestos per acabar l'escalfament..."
 
 #: qcsrc/client/hud/panel/infomessages.qc:177
 msgid "^2Waiting for others to ready up..."
-msgstr ""
+msgstr "^2Esperant a que els altres estiguin llestos..."
 
 #: qcsrc/client/hud/panel/infomessages.qc:183
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
-msgstr ""
+msgstr "^2Prem ^3%s^2 per acabar l'escalfament"
 
 #: qcsrc/client/hud/panel/infomessages.qc:204
 msgid "Teamnumbers are unbalanced!"
-msgstr ""
+msgstr "Els números d'equip estan desequilibrats!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:207
 #, c-format
 msgid " Press ^3%s%s to adjust"
-msgstr ""
+msgstr " Prem ^3%s%s per ajustar"
 
 #: qcsrc/client/hud/panel/infomessages.qc:207
 #: qcsrc/menu/xonotic/keybinder.qc:115
 msgid "team menu"
-msgstr ""
+msgstr "menú d'equip"
 
 #: qcsrc/client/hud/panel/infomessages.qc:217
 msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1Espectant a aquest jugador:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:217
 msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1Espectant-te a tu:"
 
 #: qcsrc/client/hud/panel/infomessages.qc:233
 msgid "^7Press ^3ESC ^7to show HUD options."
-msgstr ""
+msgstr "^7Prem ^3ESC ^7per veure les opcions de HUD."
 
 #: qcsrc/client/hud/panel/infomessages.qc:234
 msgid "^3Doubleclick ^7a panel for panel-specific options."
-msgstr ""
+msgstr "^3Doble clic ^7en un panell per a opcions específiques del panell."
 
 #: qcsrc/client/hud/panel/infomessages.qc:235
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
-msgstr ""
+msgstr "^3CTRL ^7per desactivar la prova de col·lisions, ^3SHIFT ^7i"
 
 #: qcsrc/client/hud/panel/infomessages.qc:236
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
-msgstr ""
+msgstr "^3ALT ^7+ ^3TECLES DE DIRECCIÓ ^7per ajustaments fins."
 
 #: qcsrc/client/hud/panel/modicons.qc:183
 msgid "Personal best"
-msgstr ""
+msgstr "Rècord personal"
 
 #: qcsrc/client/hud/panel/modicons.qc:193
 msgid "Server best"
-msgstr ""
+msgstr "Rècord del servidor"
 
 #: qcsrc/client/hud/panel/notify.qc:127 qcsrc/client/hud/panel/notify.qc:128
 #: qcsrc/client/hud/panel/score.qc:69
 #, c-format
 msgid "Player %d"
-msgstr ""
+msgstr "Jugador %d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:597
 #: qcsrc/client/hud/panel/quickmenu.qc:599
 #, c-format
 msgid "Submenu%d"
-msgstr ""
+msgstr "Submenú%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:604
 #, c-format
 msgid "Command%d"
-msgstr ""
+msgstr "Ordre%d"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:630
 msgid "Continue..."
-msgstr ""
+msgstr "Continuar..."
 
 #: qcsrc/client/hud/panel/quickmenu.qc:787
 #: qcsrc/client/hud/panel/quickmenu.qc:794
 msgid "Chat"
-msgstr ""
+msgstr "Xat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:788
 msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^Enviar missatge públic a"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:789
 msgid "QMCMD^:-) / nice one"
-msgstr ""
+msgstr "QMCMD^:-) / bona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:789
 msgid "QMCMD^nice one"
-msgstr ""
+msgstr "QMCMD^bona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:790
 msgid "QMCMD^good game"
-msgstr ""
+msgstr "QMCMD^ben jugat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:791
 msgid "QMCMD^hi / good luck"
-msgstr ""
+msgstr "QMCMD^hola / bona sort"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:791
 msgid "QMCMD^hi / good luck and have fun"
-msgstr ""
+msgstr "QMCMD^hola / bona sort i diverteix"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:793
 msgid "QMCMD^Send in English"
-msgstr ""
+msgstr "QMCMD^Enviar en anglès"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:798
 #: qcsrc/client/hud/panel/quickmenu.qc:814
 msgid "QMCMD^Team chat"
-msgstr ""
+msgstr "QMCMD^Xat de l'equip"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:799
 msgid "QMCMD^strength soon"
-msgstr ""
+msgstr "QMCMD^la força apareixerà aviat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^objecte gratuït %x^7 (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:800
 msgid "QMCMD^free item, icon"
-msgstr ""
+msgstr "QMCMD^objecte gratuït, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^took item (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^va prendre l'objecte (l:% l ^ 7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:801
 msgid "QMCMD^took item, icon"
-msgstr ""
+msgstr "QMCMD^va prendre l'objecte, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:802
 msgid "QMCMD^negative"
-msgstr ""
+msgstr "QMCMD^negatiu"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:803
 msgid "QMCMD^positive"
-msgstr ""
+msgstr "QMCMD^positiu"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^necessito ajuda (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:804
 msgid "QMCMD^need help, icon"
-msgstr ""
+msgstr "QMCMD^necessito ajuda, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 msgid "QMCMD^enemy seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^enemic vist (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:805
 msgid "QMCMD^enemy seen, icon"
-msgstr ""
+msgstr "QMCMD^enemic vist, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^flag seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^bandera vista (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:806
 msgid "QMCMD^flag seen, icon"
-msgstr ""
+msgstr "QMCMD^bandera vista, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^defensant (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:807
 msgid "QMCMD^defending, icon"
-msgstr ""
+msgstr "QMCMD^defensant, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^movent-me (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:808
 msgid "QMCMD^roaming, icon"
-msgstr ""
+msgstr "QMCMD^movent-me, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:809
 msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr ""
+msgstr "QMCMD^atacant (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:809
 msgid "QMCMD^attacking, icon"
-msgstr ""
+msgstr "QMCMD^atacant, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:810
 msgid "QMCMD^killed flagcarrier (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^el portador de la bandera ha estat assassinat (l:%y^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:810
 msgid "QMCMD^killed flagcarrier, icon"
-msgstr ""
+msgstr "QMCMD^el portador de la bandera ha estat assassinat, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:811
 #, c-format
 msgid "QMCMD^dropped flag (l:%d^7)"
-msgstr ""
+msgstr "QMCMD^bandera tirada (l:%d^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:811
 msgid "QMCMD^dropped flag, icon"
-msgstr ""
+msgstr "QMCMD^bandera tirada, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:812
 msgid "QMCMD^drop weapon, icon"
-msgstr ""
+msgstr "QMCMD^tirar arma, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:812
 msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^arma tirada %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:813
 msgid "QMCMD^drop flag/key, icon"
-msgstr ""
+msgstr "QMCMD^tirar bandera/clau, icona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:813
 msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^bandera/clau tirada %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:817
 msgid "QMCMD^Send private message to"
-msgstr ""
+msgstr "QMCMD^Enviar missatge privat a"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:819
 #: qcsrc/client/hud/panel/quickmenu.qc:849
 msgid "QMCMD^Settings"
-msgstr ""
+msgstr "QMCMD^Ajustaments"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:820
 #: qcsrc/client/hud/panel/quickmenu.qc:827
 msgid "QMCMD^View/HUD settings"
-msgstr ""
+msgstr "QMCMD^Ajustaments de Vista/HUD"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:821
 msgid "QMCMD^3rd person view"
-msgstr ""
+msgstr "QMCMD^Vista en 3ª persona"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:822
 msgid "QMCMD^Player models like mine"
-msgstr ""
+msgstr "QMCMD^Models de el jugador com el meu"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:823
 msgid "QMCMD^Names above players"
-msgstr ""
+msgstr "QMCMD^Noms per sobre dels jugadors"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:824
 msgid "QMCMD^Crosshair per weapon"
-msgstr ""
+msgstr "QMCMD^Punt de mira per arma"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:825
 msgid "QMCMD^FPS"
-msgstr ""
+msgstr "QMCMD^FPS"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:826
 msgid "QMCMD^Net graph"
-msgstr ""
+msgstr "QMCMD^Gràfic de xarxa"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:829
 #: qcsrc/client/hud/panel/quickmenu.qc:832
 msgid "QMCMD^Sound settings"
-msgstr ""
+msgstr "QMCMD^Ajustaments de so"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:830
 msgid "QMCMD^Hit sound"
-msgstr ""
+msgstr "QMCMD^So dels cops"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:831
 msgid "QMCMD^Chat sound"
-msgstr ""
+msgstr "QMCMD^So del xat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:836
 msgid "QMCMD^Change spectator camera"
-msgstr ""
+msgstr "QMCMD^Canviar càmera d'espectador"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:841
 #: qcsrc/client/hud/panel/quickmenu.qc:845
 msgid "QMCMD^Observer camera"
-msgstr ""
+msgstr "QMCMD^Càmera d'observador"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:842
 msgid "QMCMD^Increase speed"
-msgstr ""
+msgstr "QMCMD^Incrementar velocitat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:843
 msgid "QMCMD^Decrease speed"
-msgstr ""
+msgstr "QMCMD^Reduir velocitat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:844
 msgid "QMCMD^Wall collision"
-msgstr ""
+msgstr "QMCMD^Col·lisió del mur"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:848
 msgid "QMCMD^Fullscreen"
-msgstr ""
+msgstr "QMCMD^Pantalla completa"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:851
 #: qcsrc/client/hud/panel/quickmenu.qc:861
 msgid "QMCMD^Call a vote"
-msgstr ""
+msgstr "QMCMD^Demanar vot"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:852
 msgid "QMCMD^Restart the map"
-msgstr ""
+msgstr "QMCMD^Reiniciar el mapa"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:853
 msgid "QMCMD^End match"
-msgstr ""
+msgstr "QMCMD^Acabar partida"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:856
 msgid "QMCMD^Reduce match time"
-msgstr ""
+msgstr "QMCMD^Reduir temps de partida"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:857
 msgid "QMCMD^Extend match time"
-msgstr ""
+msgstr "QMCMD^Estendre temps de partida"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:860
 msgid "QMCMD^Shuffle teams"
-msgstr ""
+msgstr "QMCMD^Barrejar equips"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:865
 msgid "QMCMD^Spectate a player"
-msgstr ""
+msgstr "QMCMD^Espectar a un jugador"
 
 #: qcsrc/client/hud/panel/racetimer.qc:59
 #, c-format
 msgid " (-%dL)"
-msgstr ""
+msgstr " (-%dL)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:64
 #, c-format
 msgid " (+%dL)"
-msgstr ""
+msgstr " (+%dL)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:83
 msgid "Start line"
-msgstr ""
+msgstr "Línia de sortida"
 
 #: qcsrc/client/hud/panel/racetimer.qc:85
 #: qcsrc/client/hud/panel/racetimer.qc:89
 msgid "Finish line"
-msgstr ""
+msgstr "Línia de meta"
 
 #: qcsrc/client/hud/panel/racetimer.qc:87
 #: qcsrc/client/hud/panel/racetimer.qc:156
 #, c-format
 msgid "Intermediate %d"
-msgstr ""
+msgstr "Intermedi %d"
 
 #: qcsrc/client/hud/panel/racetimer.qc:159
 #: qcsrc/client/hud/panel/racetimer.qc:206
 #: qcsrc/client/hud/panel/racetimer.qc:267
 #, c-format
 msgid "PENALTY: %.1f (%s)"
-msgstr ""
+msgstr "SANCIÓ: %.1f (%s)"
 
 #: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
 msgid "missing a checkpoint"
-msgstr ""
+msgstr "falta un punt de control"
 
 #: qcsrc/client/hud/panel/radar.qc:386
 msgid "Click to select teleport destination"
-msgstr ""
+msgstr "Fes clic per seleccionar la destinació de teletransport"
 
 #: qcsrc/client/hud/panel/radar.qc:390
 msgid "Click to select spawn location"
-msgstr ""
+msgstr "Fes clic per seleccionar el lloc de reaparició"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "Number of ball carrier kills"
-msgstr ""
+msgstr "Nombre d'assassinats de portador de pilota"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^bckills"
-msgstr ""
+msgstr "assassi.p.pi"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "SCO^bctime"
-msgstr ""
+msgstr "temps p.pi"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "Total amount of time holding the ball in Keepaway"
-msgstr ""
+msgstr "Temps total retenint la pilota al Keepaway"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
 msgstr ""
+"Freqüència amb la qual una bandera (CTF) o clau (KeyHunt) ha estat capturada"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "SCO^caps"
-msgstr ""
+msgstr "captures"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "SCO^captime"
-msgstr ""
+msgstr "temps de captura"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:108
 msgid "Time of fastest capture (CTF)"
-msgstr ""
+msgstr "Temps de la captura més ràpida (CTF)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "Number of deaths"
-msgstr ""
+msgstr "Nombre de morts"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "SCO^deaths"
-msgstr ""
+msgstr "morts"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of keys destroyed by pushing them into void"
-msgstr ""
+msgstr "Nombre de claus destruïdes sent llançades al buit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "SCO^destroyed"
-msgstr ""
+msgstr "destruït"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "SCO^damage"
-msgstr ""
+msgstr "dany"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:111
 msgid "The total damage done"
-msgstr ""
+msgstr "Dany total realitzat"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "SCO^dmgtaken"
-msgstr ""
+msgstr "dany rebut"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:112
 msgid "The total damage taken"
-msgstr ""
+msgstr "Dany total rebut"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of flag drops"
-msgstr ""
+msgstr "Nombre de banderes caigudes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^drops"
-msgstr ""
+msgstr "caigudes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid "Player ELO"
-msgstr ""
+msgstr "ELO del jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:114
 msgid "SCO^elo"
-msgstr ""
+msgstr "elo"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "SCO^fastest"
-msgstr ""
+msgstr "el més ràpid"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:115
 msgid "Time of fastest lap (Race/CTS)"
-msgstr ""
+msgstr "Temps de la volta més ràpida (Carrera/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "Number of faults committed"
-msgstr ""
+msgstr "Nombre de faltes comeses"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:116
 msgid "SCO^faults"
-msgstr ""
+msgstr "faltes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of flag carrier kills"
-msgstr ""
+msgstr "Nombre d'assassinats de portadors de bandera"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^fckills"
-msgstr ""
+msgstr "assassi.p.ba"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "FPS"
-msgstr ""
+msgstr "FPS"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "SCO^fps"
-msgstr ""
+msgstr "fps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of kills minus suicides"
-msgstr ""
+msgstr "Nombre d'assassinats menys suïcidis"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "SCO^frags"
-msgstr ""
+msgstr "eliminacions"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "Number of goals scored"
-msgstr ""
+msgstr "Nombre de gols encertats"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:120
 msgid "SCO^goals"
-msgstr ""
+msgstr "gols"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of keys carrier kills"
-msgstr ""
+msgstr "Nombre d'assassinats de portador de claus"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^kckills"
-msgstr ""
+msgstr "assassi.p.cl"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "SCO^k/d"
-msgstr ""
+msgstr "a/m"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "The kill-death ratio"
-msgstr ""
+msgstr "La raó assassinat-mort"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^kdr"
-msgstr ""
+msgstr "amr"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^kdratio"
-msgstr ""
+msgstr "amratio"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of kills"
-msgstr ""
+msgstr "Nombre d'assassinats"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^kills"
-msgstr ""
+msgstr "assassinats"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of laps finished (Race/CTS)"
-msgstr ""
+msgstr "Nombre de voltes acabades (Carrera/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "SCO^laps"
-msgstr ""
+msgstr "voltes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "Number of lives (LMS)"
-msgstr ""
+msgstr "Nombre de vides (LMS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:127
 msgid "SCO^lives"
-msgstr ""
+msgstr "vides"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "Number of times a key was lost"
-msgstr ""
+msgstr "Nombre de vegades que es va perdre la clau"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^losses"
-msgstr ""
+msgstr "perdudes"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:129
 #: qcsrc/client/hud/panel/scoreboard.qc:130
 msgid "Player name"
-msgstr ""
+msgstr "Nom del jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:129
 msgid "SCO^name"
-msgstr ""
+msgstr "nom"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:130
 msgid "SCO^nick"
-msgstr ""
+msgstr "sobrenom"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:131
 msgid "Number of objectives destroyed"
-msgstr ""
+msgstr "Nombre d'objectius destruïts"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:131
 msgid "SCO^objectives"
-msgstr ""
+msgstr "objectius"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:132
 msgid ""
 "How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up"
 msgstr ""
+"Freqüència amb què una bandera (CTF) o clau (KeyHunt) o pilota (Keepaway) va "
+"ser presa"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:132
 msgid "SCO^pickups"
-msgstr ""
+msgstr "recollides"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:133
 msgid "Ping time"
-msgstr ""
+msgstr "Temps del ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:133
 msgid "SCO^ping"
-msgstr ""
+msgstr "ping"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:134
 msgid "Packet loss"
-msgstr ""
+msgstr "Pèrdua de paquets"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:134
 msgid "SCO^pl"
-msgstr ""
+msgstr "pl"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:135
 msgid "Number of players pushed into void"
-msgstr ""
+msgstr "Nombre de jugadors empesos a el buit"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:135
 msgid "SCO^pushes"
-msgstr ""
+msgstr "ofensives"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:136
 msgid "Player rank"
-msgstr ""
+msgstr "Rang de el jugador"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:136
 msgid "SCO^rank"
-msgstr ""
+msgstr "rang"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:137
 msgid "Number of flag returns"
-msgstr ""
+msgstr "Nombre de retorns de bandera"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:137
 msgid "SCO^returns"
-msgstr ""
+msgstr "retorns"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:138
 msgid "Number of revivals"
-msgstr ""
+msgstr "Nombre de reanimacions"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:138
 msgid "SCO^revivals"
-msgstr ""
+msgstr "reanimacions"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:139
 msgid "Number of rounds won"
-msgstr ""
+msgstr "Nombre de rondes guanyades"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:139
 msgid "SCO^rounds won"
-msgstr ""
+msgstr "rondes guanyades"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:140
 msgid "SCO^score"
-msgstr ""
+msgstr "puntuació"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:140
 msgid "Total score"
-msgstr ""
+msgstr "Puntuació total"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:141
 msgid "Number of suicides"
-msgstr ""
+msgstr "Nombre de suïcidis"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:141
 msgid "SCO^suicides"
-msgstr ""
+msgstr "suïcidis"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:142
 msgid "Number of kills minus deaths"
-msgstr ""
+msgstr "Nombre d'assassinats menys morts"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:142
 msgid "SCO^sum"
-msgstr ""
+msgstr "suma"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:143
 msgid "Number of domination points taken (Domination)"
-msgstr ""
+msgstr "Nombre de punts de dominació presos (Dominació)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:143
 msgid "SCO^takes"
-msgstr ""
+msgstr "presos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:144
 msgid "Number of teamkills"
-msgstr ""
+msgstr "Nombre d'assassinats de companys"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:144
 msgid "SCO^teamkills"
-msgstr ""
+msgstr "assassinats de companys"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:145
 msgid "Number of ticks (Domination)"
-msgstr ""
+msgstr "Nombre de ticks (Dominació)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:145
 msgid "SCO^ticks"
-msgstr ""
+msgstr "ticks"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:146
 msgid "SCO^time"
-msgstr ""
+msgstr "temps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:146
 msgid "Total time raced (Race/CTS)"
-msgstr ""
+msgstr "Temps total de carrera (Carrera/CTS)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:330
 msgid ""
 "You can modify the scoreboard using the ^2scoreboard_columns_set command."
 msgstr ""
+"Pots modificar la taula de puntuacions amb la comanda "
+"^2scoreboard_columns_set"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:331
 msgid "Usage:"
-msgstr ""
+msgstr "Ús:"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:333
 msgid "^2scoreboard_columns_set ^3field1 field2 ..."
-msgstr ""
+msgstr "^2scoreboard_columns_set ^3field1 field2 ..."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:334
 msgid ""
 "^2scoreboard_columns_set ^7without arguments reads the arguments from the "
 "cvar scoreboard_columns"
 msgstr ""
+"^2scoreboard_columns_set ^7sense arguments es llegeixen els arguments del "
+"cvar scoreboard_columns"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:335
 msgid ""
 "  ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
 "map start"
 msgstr ""
+"^5Nota: ^7scoreboard_columns_set sense arguments és executat en el "
+"començament de cada partida"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:336
 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 ^7carrega el disseny actual i el "
+"s'expandeix en la cvar scoreboard_columns per a què el puguis editar"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:337
 msgid "You can use a ^3|^7 to start the right-aligned fields."
-msgstr ""
+msgstr "Pots utilitzar un ^3|^7 per començar els camps alineats a la dreta."
 
 #: qcsrc/client/hud/panel/scoreboard.qc:338
 msgid "The following field names are recognized (case insensitive):"
-msgstr ""
+msgstr "Els següents noms de camp són reconeguts (sensible a majúscules):"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:344
 msgid ""
index 8bee8d5182e96014d3999e5f3f734c81cb1712aa..7392963d197257fffeeef56e3c3082e9b9cb1ec8 100644 (file)
@@ -30,7 +30,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2020-06-07 07:23+0200\n"
-"PO-Revision-Date: 2020-07-14 22:31+0000\n"
+"PO-Revision-Date: 2020-07-24 22:49+0000\n"
 "Last-Translator: LegendGuard\n"
 "Language-Team: Spanish (http://www.transifex.com/team-xonotic/xonotic/"
 "language/es/)\n"
@@ -124,7 +124,7 @@ msgstr "^1Usa ^3%s^1 o ^3%s^1 para cambiar la velocidad"
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #, c-format
 msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
-msgstr "^1Pulsa ^3%s^1 para observar o ^3%s^1 para cambiar el modo de cámara."
+msgstr "^1Pulsa ^3%s^1 para observar o ^3%s^1 para cambiar el modo de cámara"
 
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #: qcsrc/common/vehicles/cl_vehicles.qc:190
@@ -173,7 +173,7 @@ msgstr "^1El juego comienza en ^3%d^1 segundos"
 
 #: qcsrc/client/hud/panel/infomessages.qc:153
 msgid "^2Currently in ^1warmup^2 stage!"
-msgstr "^2¡Actualmente en etapa de ^1calentamiento^2 !"
+msgstr "^2¡Actualmente en etapa de ^1calentamiento^2!"
 
 #: qcsrc/client/hud/panel/infomessages.qc:168
 #, c-format
@@ -418,7 +418,7 @@ msgstr "QMCMD^tirar bandera/llave, icono"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:813
 msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
-msgstr "QMCMD^tirada bandera/llave %w^7 (l:%l^7)"
+msgstr "QMCMD^bandera/llave tirada %w^7 (l:%l^7)"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:817
 msgid "QMCMD^Send private message to"
@@ -465,11 +465,11 @@ msgstr "QMCMD^Ajustes de sonido"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:830
 msgid "QMCMD^Hit sound"
-msgstr "QMCMD^Sonido de golpes"
+msgstr "QMCMD^Sonido de los golpes"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:831
 msgid "QMCMD^Chat sound"
-msgstr "QMCMD^Sonido de chat"
+msgstr "QMCMD^Sonido del chat"
 
 #: qcsrc/client/hud/panel/quickmenu.qc:836
 msgid "QMCMD^Change spectator camera"
@@ -563,27 +563,27 @@ msgstr "falta un punto de control"
 
 #: qcsrc/client/hud/panel/radar.qc:386
 msgid "Click to select teleport destination"
-msgstr "Haz click para seleccionar el destino de teletransporte"
+msgstr "Haz clic para seleccionar el destino de teletransporte"
 
 #: qcsrc/client/hud/panel/radar.qc:390
 msgid "Click to select spawn location"
-msgstr "Haz click para seleccionar el lugar de reaparición"
+msgstr "Haz clic para seleccionar el lugar de reaparición"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "Number of ball carrier kills"
-msgstr "Número de asesinatos de portadores de bolas"
+msgstr "Número de asesinatos de portador de pelota"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^bckills"
-msgstr "asesin.p.bo"
+msgstr "asesin.p.pe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "SCO^bctime"
-msgstr "tiempo p.bo"
+msgstr "tiempo p.pe"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "Total amount of time holding the ball in Keepaway"
-msgstr "Tiempo total reteniendo la bola en Keepaway"
+msgstr "Tiempo total reteniendo la pelota en Keepaway"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:107
 msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
@@ -636,7 +636,7 @@ msgstr "Daño total recibido"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "Number of flag drops"
-msgstr "Número de banderas soltadas"
+msgstr "Número de banderas caídas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:113
 msgid "SCO^drops"
@@ -668,7 +668,7 @@ msgstr "faltas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of flag carrier kills"
-msgstr "Número de asesinatos de portadores de bandera"
+msgstr "Número de asesinatos de portador de bandera"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^fckills"
@@ -700,7 +700,7 @@ msgstr "goles"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of keys carrier kills"
-msgstr "Número de asesinatos de portadores de llaves"
+msgstr "Número de asesinatos de portador de llaves"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^kckills"
@@ -730,7 +730,7 @@ msgstr "Número de asesinatos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^kills"
-msgstr "muertes"
+msgstr "asesinatos"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of laps finished (Race/CTS)"
@@ -754,7 +754,7 @@ msgstr "Número de veces que se perdió la llave"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^losses"
-msgstr "derrotas"
+msgstr "perdidas"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:129
 #: qcsrc/client/hud/panel/scoreboard.qc:130
@@ -781,8 +781,8 @@ msgstr "objetivos"
 msgid ""
 "How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up"
 msgstr ""
-"Frecuencia con qué una bandera (CTF) o llave(KeyHunt) o bola (Keepaway) fue "
-"tomada"
+"Frecuencia con qué una bandera (CTF) o llave (KeyHunt) o pelota (Keepaway) "
+"fue tomada"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:132
 msgid "SCO^pickups"
@@ -874,7 +874,7 @@ msgstr "Número de puntos de dominación tomados (Dominación)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:143
 msgid "SCO^takes"
-msgstr "tomas"
+msgstr "tomados"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:144
 msgid "Number of teamkills"
@@ -928,7 +928,7 @@ msgid ""
 "  ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
 "map start"
 msgstr ""
-"  ^5Note: ^7scoreboard_columns_set sin argumentos es ejecutado en el "
+"  ^5Nota: ^7scoreboard_columns_set sin argumentos es ejecutado en el "
 "comienzo de cada partida"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:336
@@ -946,7 +946,7 @@ msgstr "Puedes usar un ^3|^7 para empezar los campos alineados a la derecha."
 #: qcsrc/client/hud/panel/scoreboard.qc:338
 msgid "The following field names are recognized (case insensitive):"
 msgstr ""
-"Los siguientes nombres de campo son reconocidos (sensible a mayúsculas): "
+"Los siguientes nombres de campo son reconocidos (sensible a mayúsculas):"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:344
 msgid ""
@@ -1239,7 +1239,7 @@ msgstr ""
 
 #: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
 msgid "Ball Stealer"
-msgstr "Ladrón de Bola"
+msgstr "Ladrón de Pelota"
 
 #: qcsrc/common/items/item/ammo.qh:66
 msgid "bullets"
@@ -1469,7 +1469,7 @@ msgstr "Nexball"
 #: qcsrc/common/mapinfo.qh:474
 msgid "Shoot and kick the ball into the enemies goal, keep your goal clean"
 msgstr ""
-"Dispara y golpea la bola dentro de la portería enemiga, mantén tu portería "
+"Dispara y golpea la pelota dentro de la portería enemiga, mantén tu portería "
 "limpia"
 
 #: qcsrc/common/mapinfo.qh:488
@@ -1494,7 +1494,7 @@ msgstr ""
 
 #: qcsrc/common/mapinfo.qh:545
 msgid "Hold the ball to get points for kills"
-msgstr "Mantén la bola para ganar puntos por asesinatos"
+msgstr "Retén la pelota para ganar puntos por asesinatos"
 
 #: qcsrc/common/mapinfo.qh:545
 msgid "Keepaway"
@@ -1566,7 +1566,7 @@ msgstr "¡Fin del juego!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1095
 msgid "Well done! Click 'Next Level' to continue"
-msgstr "¡Bien hecho! Haz click en 'Próximo Nivel' para continuar"
+msgstr "¡Bien hecho! Haz clic en 'Siguiente nivel' para continuar"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1162
 msgid "Better luck next time!"
@@ -1574,11 +1574,11 @@ msgstr "¡Mejor suerte la próxima vez!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1167
 msgid "Tubular! Press \"Next Level\" to continue!"
-msgstr "Tubular! ¡Pulsa \"Próximo Nivel\" para continuar!"
+msgstr "Tubular! ¡Pulsa \"Siguiente nivel\" para continuar!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1169
 msgid "Wicked! Press \"Next Level\" to continue!"
-msgstr "¡Mal! ¡Pulsa \"Próximo Nivel\" para continuar!"
+msgstr "¡Mal! ¡Pulsa \"Siguiente nivel\" para continuar!"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1173
 msgid "Press the space bar to change your currently selected tile"
@@ -2086,11 +2086,11 @@ msgstr "Corre aquí"
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:45
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:48
 msgid "Ball"
-msgstr "Bola"
+msgstr "Pelota"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:46
 msgid "Ball carrier"
-msgstr "Portador de la bola"
+msgstr "Portador de la pelota"
 
 #: qcsrc/common/mutators/mutator/waypoints/all.inc:49
 msgid "Goal"
@@ -2903,13 +2903,13 @@ msgstr "^BG%s^F3 está jugando en el equipo ^TC^TT"
 #: qcsrc/common/notifications/all.inc:697
 #, c-format
 msgid "^BG%s^BG has dropped the ball!"
-msgstr "^BG¡%s^BG ha tirado la bola!"
+msgstr "^BG¡%s^BG ha tirado la pelota!"
 
 #: qcsrc/common/notifications/all.inc:386
 #: qcsrc/common/notifications/all.inc:698
 #, c-format
 msgid "^BG%s^BG has picked up the ball!"
-msgstr "^BG¡%s^BG ha recogido la bola!"
+msgstr "^BG¡%s^BG ha recogido la pelota!"
 
 #: qcsrc/common/notifications/all.inc:388
 #, c-format
@@ -2957,7 +2957,7 @@ msgstr "^BGLos monstruos están actualmente deshabilitados"
 
 #: qcsrc/common/notifications/all.inc:400
 msgid "^BGThe ^TC^TT^BG team held the ball for too long"
-msgstr "^BGEl equipo ^TC^TT^BG mantuvo la bola demasiado tiempo"
+msgstr "^BGEl equipo ^TC^TT^BG mantuvo la pelota demasiado tiempo"
 
 #: qcsrc/common/notifications/all.inc:402
 #, c-format
@@ -3884,7 +3884,7 @@ msgstr "^K1Te volviste muy viejo sin tomar tu medicamento"
 
 #: qcsrc/common/notifications/all.inc:636
 msgid "^K1You need to preserve your health"
-msgstr "^K1Necesitas conservar tu vida"
+msgstr "^K1Necesitas conservar tu salud"
 
 #: qcsrc/common/notifications/all.inc:637
 msgid "^K1You became a shooting star!"
@@ -4088,11 +4088,11 @@ msgstr ""
 
 #: qcsrc/common/notifications/all.inc:699
 msgid "^BGYou picked up the ball"
-msgstr "^BGHas recogido la bola"
+msgstr "^BGHas recogido la pelota"
 
 #: qcsrc/common/notifications/all.inc:700
 msgid "^BGKilling people while you don't have the ball gives no points!"
-msgstr "^BG¡Eliminar a otros mientras no tienes la bola no da puntos!"
+msgstr "^BG¡Eliminar a otros mientras no tienes la pelota no da puntos!"
 
 #: qcsrc/common/notifications/all.inc:702
 msgid ""
@@ -4454,7 +4454,7 @@ msgstr "¡%s^K1 ha hecho una ELIMINACIÓN TRIPLE! %s^BG"
 #: qcsrc/common/notifications/all.qh:455
 #, c-format
 msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
-msgstr "¡%s^K1 ha hecho una ELIMINACIÓN TRIPLE! %s^BG"
+msgstr "¡%s^K1 ha hecho TRIPLE ACIERTO! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:455
 msgid "TRIPLE FRAG! "
@@ -4477,7 +4477,7 @@ msgstr "¡FURIA!"
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
 msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
-msgstr "¡%s^K1 eliminó a DIEZ JUGADORES SEGUIDOS! %s^BG"
+msgstr "¡%s^K1 eliminó a DIEZ ACIERTOS SEGUIDOS! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
@@ -4496,7 +4496,7 @@ msgstr "¡%s^K1 ha ejecutado un CAOS! %s^BG"
 #: qcsrc/common/notifications/all.qh:458
 #, c-format
 msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
-msgstr "¡%s^K1 ha hecho QUINCE ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho QUINCE ACIERTOS SEGUIDOS! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:458
 msgid "MAYHEM! "
@@ -4510,7 +4510,7 @@ msgstr "¡%s^K1 es un BERSERKER! %s^BG"
 #: qcsrc/common/notifications/all.qh:459
 #, c-format
 msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
-msgstr "¡%s^K1 ha hecho VEINTE ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho VEINTE ACIERTOS SEGUIDOS! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:459
 msgid "BERSERKER! "
@@ -4524,7 +4524,7 @@ msgstr "¡%s^K1 ha hecho una CARNICERÍA! %s^BG"
 #: qcsrc/common/notifications/all.qh:460
 #, c-format
 msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
-msgstr "¡%s^K1 ha hecho VENTICINCO ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho VENTICINCO ACIERTOS SEGUIDOS! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:460
 msgid "CARNAGE! "
@@ -4533,12 +4533,12 @@ msgstr "¡CARNICERÍA!"
 #: qcsrc/common/notifications/all.qh:461
 #, c-format
 msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
-msgstr "¡%s^K1 ha hecho TREINTA ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho TREINTA ACIERTOS SEGUIDOS! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:461
 #, c-format
 msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
-msgstr "¡%s^K1 destata el ARMAGEDÓN! %s^BG"
+msgstr "¡%s^K1 desata el ARMAGEDÓN! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:461
 msgid "ARMAGEDDON! "
@@ -4561,7 +4561,7 @@ msgid ""
 "(Health ^1%d^BG / Armor ^2%d^BG)%s"
 msgstr ""
 "\n"
-"(Vida ^1%d^BG / Armadura ^2%d^BG)%s"
+"(Salud ^1%d^BG / Armadura ^2%d^BG)%s"
 
 #: qcsrc/common/notifications/all.qh:479
 #, c-format
@@ -4575,7 +4575,7 @@ msgstr ""
 #: qcsrc/common/notifications/all.qh:500 qcsrc/common/notifications/all.qh:513
 #, c-format
 msgid "%d score spree! "
-msgstr "¡%d puntuaciones seguidas! "
+msgstr "¡%d aciertos seguidos! "
 
 #: qcsrc/common/notifications/all.qh:512
 #, c-format
@@ -4584,15 +4584,15 @@ msgstr "¡%d eliminaciones seguidas! "
 
 #: qcsrc/common/notifications/all.qh:525
 msgid "First blood! "
-msgstr "¡Primera eliminación! "
+msgstr "¡Primer asesinato! "
 
 #: qcsrc/common/notifications/all.qh:525
 msgid "First score! "
-msgstr "¡Primera puntuación! "
+msgstr "¡Primer acierto! "
 
 #: qcsrc/common/notifications/all.qh:529
 msgid "First casualty! "
-msgstr "¡Primera baja! "
+msgstr "¡Primera derrota! "
 
 #: qcsrc/common/notifications/all.qh:529
 msgid "First victim! "
@@ -4606,7 +4606,7 @@ msgstr "¡%s^K1 tiene %d eliminaciones seguidas! %s^BG"
 #: qcsrc/common/notifications/all.qh:571
 #, c-format
 msgid "%s^K1 made %d scores in a row! %s^BG"
-msgstr "¡%s^K1 tiene %d eliminaciones seguidas! %s^BG"
+msgstr "¡%s^K1 tiene %d aciertos seguidos! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:589
 #, c-format
@@ -4616,27 +4616,27 @@ msgstr "¡%s^K1 ha sido el primero en eliminar a alguien! %s^BG"
 #: qcsrc/common/notifications/all.qh:590
 #, c-format
 msgid "%s^K1 got the first score! %s^BG"
-msgstr "¡%s^K1 fue el primero en eliminar a alguien! %s^BG"
+msgstr "¡%s^K1 fue el primero en acertar! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:606
 #, c-format
 msgid ", ending their %d frag spree"
-msgstr ", finalizando su cadena de %d eliminaciones"
+msgstr ", finalizando sus %d eliminaciones seguidas"
 
 #: qcsrc/common/notifications/all.qh:607
 #, c-format
 msgid ", ending their %d score spree"
-msgstr ", finalizando su cadena de %d eliminaciones"
+msgstr ", finalizando sus %d aciertos seguidos"
 
 #: qcsrc/common/notifications/all.qh:621
 #, c-format
 msgid ", losing their %d frag spree"
-msgstr ", perdiendo su cadena de %d eliminaciones"
+msgstr ", perdiendo sus %d eliminaciones seguidas"
 
 #: qcsrc/common/notifications/all.qh:622
 #, c-format
 msgid ", losing their %d score spree"
-msgstr ", perdiendo su cadena de %d eliminaciones"
+msgstr ", perdiendo sus %d aciertos seguidos"
 
 #: qcsrc/common/notifications/all.qh:647
 #, c-format
@@ -4717,7 +4717,7 @@ msgstr "Rosa"
 
 #: qcsrc/common/turrets/all.qh:95
 msgid "Turrets dump command only works with sv_cmd."
-msgstr "El comando de volcado de tirar torretas sólo funciona con sv_cmd."
+msgstr "El comando de volcado de torretas sólo funciona con sv_cmd."
 
 #: qcsrc/common/turrets/cl_turrets.qc:125
 #, c-format
@@ -5858,7 +5858,7 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:84
 msgid "Undecided"
-msgstr "Sin determinar"
+msgstr "Indeciso"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:88
 msgid "Save settings"
@@ -5960,7 +5960,7 @@ msgstr "Tamaño del texto:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
 msgid "Chat lifetime:"
-msgstr "Mostrar durante:"
+msgstr "Mostrar chat durante:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
 msgid "Chat beep sound"
@@ -5984,7 +5984,7 @@ msgstr "Panel de Información del Motor"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
 msgid "Combine health and armor"
-msgstr "Combinar vida y armadura"
+msgstr "Combinar salud y armadura"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:19
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:28
@@ -6018,11 +6018,11 @@ msgstr "Alineación de los iconos:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
 msgid "Flip health and armor positions"
-msgstr "Invertir la posición de vida y armadura"
+msgstr "Invertir la posición de salud y armadura"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
 msgid "Health/Armor Panel"
-msgstr "Panel de Vida/Armadura"
+msgstr "Panel de Salud/Armadura"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:16
 msgid "Info messages:"
@@ -6072,7 +6072,7 @@ msgstr "No mostrar objetos reaparecidos"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
 msgid "Hide big armor and health"
-msgstr "No mostrar gran armadura y vida"
+msgstr "No mostrar gran armadura y salud"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
 msgid "Dynamic size"
@@ -6760,7 +6760,7 @@ msgid ""
 "Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
 "Delete to clear; Enter when done."
 msgstr ""
-"Haz click aquí o pulsa Ctrl-F para proveer una palabra clave para reducir la "
+"Haz clic aquí o pulsa Ctrl-F para proveer una palabra clave para reducir la "
 "lista de mapas. Ctrl-Suprimir para despejar; Pulse Entrar cuando haya "
 "acabado."
 
@@ -6975,7 +6975,7 @@ msgstr "Sólo es posible infligir daño a tus enemigos mientras estén en el air
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:185
 msgid "Damage done to your enemy gets added to your own health"
-msgstr "Daño realizado a tu enemigo será añadido a tu propia vida"
+msgstr "Daño realizado a tu enemigo será añadido a tu propia salud"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:190
 msgid ""
@@ -7142,7 +7142,7 @@ msgstr "Pausar"
 msgid ""
 "Pause updating the server list to prevent servers from \"jumping around\""
 msgstr ""
-"Pausar la actualización de la lista de servidores para evitar que salteen"
+"Pausar la actualización de la lista de servidores para evitar que se salten"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
 msgid "Reload the server list"
@@ -7259,7 +7259,7 @@ msgstr "Bots:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
 msgid "Free slots:"
-msgstr "Plazas libres:"
+msgstr "Espacios libres:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
 msgid "Encryption:"
@@ -7434,7 +7434,7 @@ msgstr "Permitir que las estadísticas del jugador usen tu apodo"
 msgid "Allow player statistics to rank you in leaderboards"
 msgstr ""
 "Permitir que las estadísticas de jugadores te clasifiquen en las tablas de "
-"puntuación"
+"puntuaciones"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
 msgid "Country"
@@ -7498,7 +7498,7 @@ msgstr "Adjuntar a *"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:34
 msgid "Detach from *"
-msgstr "Desadjuntar de *"
+msgstr "Despegar de *"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
 msgid "Visual object properties for *:"
@@ -7784,11 +7784,11 @@ msgstr "Sonido indicador de los golpes"
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
 msgid "Play a hit indicator sound when your shot hits an enemy"
 msgstr ""
-"Reproduce un sonido indicador de anotación cuando disparas a un enemigo"
+"Reproduce un sonido indicador de los golpes cuando disparas a un enemigo"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:147
 msgid "Chat message sound"
-msgstr "Sonido de mensaje chat"
+msgstr "Sonido del mensaje de chat"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:149
 msgid "Menu sounds"
@@ -7796,7 +7796,7 @@ msgstr "Sonidos del menú"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:150
 msgid "Play sounds when clicking menu items"
-msgstr "Reproducir sonidos al hacer click en items del menú"
+msgstr "Reproducir sonidos al hacer clic en items del menú"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:151
 msgid "Focus sounds"
@@ -7858,7 +7858,7 @@ msgstr "Restablecer la asignación de teclas"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
 msgid "Quality preset:"
-msgstr "Predefinición de calidad:"
+msgstr "Ajustes preestablecidos de calidad:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
 msgid "PRE^OMG!"
@@ -7918,7 +7918,7 @@ msgstr "Mejor"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
 msgid "DET^Insane"
-msgstr "Insano"
+msgstr "Demente"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
 msgid "Player detail:"
@@ -8459,7 +8459,7 @@ msgstr "Sólo cuando cerca de apuntador"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
 msgid "Display health and armor"
-msgstr "Desplegar vida y armadura"
+msgstr "Desplegar salud y armadura"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
 msgid "Damage overlay:"
@@ -8699,7 +8699,7 @@ msgstr "Personaliza cómo los jugadores y objetos aparecen en el juego"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
 msgid "1st person perspective"
-msgstr "Perspectiva en primera persona"
+msgstr "Perspectiva en  persona"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
 msgid "Slide to third person upon death"
@@ -8843,7 +8843,7 @@ msgid ""
 "Automatically switch to newly picked up weapons if they are better than what "
 "you are carrying"
 msgstr ""
-"Cambia automáticamente al arma recogida si es mejor que la que está llevando"
+"Cambiar automáticamente al arma recogida si es mejor que la que está llevando"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:60
 msgid "Release attack buttons when you switch weapons"
@@ -8851,7 +8851,7 @@ msgstr "Soltar botones de ataque cuando cambia de arma"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
 msgid "Draw 1st person weapon model"
-msgstr "Dibujar modelo de arma en primera persona"
+msgstr "Dibujar modelo de arma en  persona"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
 msgid "Draw the weapon model"
@@ -8997,7 +8997,7 @@ msgstr "Cancelar"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
 msgid "User defined key bind"
-msgstr "Usar teclas definidas"
+msgstr "Teclas definidas por el usuario"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
 #, c-format
@@ -9909,39 +9909,39 @@ msgstr "estadísticas habilitadas"
 
 #: qcsrc/menu/xonotic/serverlist.qh:152
 msgid "SLCAT^Favorites"
-msgstr "SLCAT^Favoritos"
+msgstr "Favoritos"
 
 #: qcsrc/menu/xonotic/serverlist.qh:153
 msgid "SLCAT^Recommended"
-msgstr "SLCAT^Recomendado"
+msgstr "Recomendado"
 
 #: qcsrc/menu/xonotic/serverlist.qh:154
 msgid "SLCAT^Normal Servers"
-msgstr "SLCAT^Servidores Normales"
+msgstr "Servidores Normales"
 
 #: qcsrc/menu/xonotic/serverlist.qh:155
 msgid "SLCAT^Servers"
-msgstr "SLCAT^Servidores"
+msgstr "Servidores"
 
 #: qcsrc/menu/xonotic/serverlist.qh:156
 msgid "SLCAT^Competitive Mode"
-msgstr "SLCAT^Modo Competitivo"
+msgstr "Modo Competitivo"
 
 #: qcsrc/menu/xonotic/serverlist.qh:157
 msgid "SLCAT^Modified Servers"
-msgstr "SLCAT^Servidores Modificados"
+msgstr "Servidores Modificados"
 
 #: qcsrc/menu/xonotic/serverlist.qh:158
 msgid "SLCAT^Overkill"
-msgstr "SLCAT^Overkill"
+msgstr "Overkill"
 
 #: qcsrc/menu/xonotic/serverlist.qh:159
 msgid "SLCAT^InstaGib"
-msgstr "SLCAT^InstaGib"
+msgstr "InstaGib"
 
 #: qcsrc/menu/xonotic/serverlist.qh:160
 msgid "SLCAT^Defrag Mode"
-msgstr "SLCAT^Modo Defrag"
+msgstr "Modo Defrag"
 
 #: qcsrc/menu/xonotic/skinlist.qc:70
 msgid "<TITLE>"
index 35b8c790abc739a5f17fce5e02e3f162262273ce..6fce5270c39cf4c10aa4a0a76d3e59473a11c85e 100644 (file)
@@ -12,7 +12,7 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2020-06-07 07:23+0200\n"
-"PO-Revision-Date: 2020-07-15 22:42+0000\n"
+"PO-Revision-Date: 2020-07-24 17:55+0000\n"
 "Last-Translator: LegendGuard\n"
 "Language-Team: Japanese (Japan) (http://www.transifex.com/team-xonotic/"
 "xonotic/language/ja_JP/)\n"
@@ -81,7 +81,7 @@ msgstr "観戦するために ^3%s ^1を押して"
 #: qcsrc/client/hud/panel/infomessages.qc:108
 #: qcsrc/menu/xonotic/keybinder.qc:47
 msgid "primary fire"
-msgstr "一次撃つ"
+msgstr "一次射撃"
 
 #: qcsrc/client/hud/panel/infomessages.qc:110
 #, c-format
@@ -118,7 +118,7 @@ msgstr "武器を落とす"
 #: qcsrc/client/hud/panel/infomessages.qc:116
 #: qcsrc/menu/xonotic/keybinder.qc:48
 msgid "secondary fire"
-msgstr "二次撃つ"
+msgstr "二次射撃"
 
 #: qcsrc/client/hud/panel/infomessages.qc:119
 #, c-format
@@ -148,7 +148,7 @@ msgstr "^1参加するために ^3%s ^1を押して"
 #: qcsrc/client/hud/panel/infomessages.qc:139
 #: qcsrc/common/notifications/all.qh:430
 msgid "jump"
-msgstr "飛び越える"
+msgstr "ジャンプ"
 
 #: qcsrc/client/hud/panel/infomessages.qc:147
 #, c-format
@@ -554,11 +554,11 @@ msgstr "クリックして現れる場所を選択する"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "Number of ball carrier kills"
-msgstr "殺されたボール持ちの数"
+msgstr "ボール持ちキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:105
 msgid "SCO^bckills"
-msgstr "殺したボール持ち"
+msgstr "ボール持ちキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:106
 msgid "SCO^bctime"
@@ -586,11 +586,11 @@ msgstr "最速の取れ時刻 (CTF)"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "Number of deaths"
-msgstr "死者数"
+msgstr "デス数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:109
 msgid "SCO^deaths"
-msgstr "死者"
+msgstr "デス数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:110
 msgid "Number of keys destroyed by pushing them into void"
@@ -650,11 +650,11 @@ msgstr "フォールト"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "Number of flag carrier kills"
-msgstr "殺ã\81\95ã\82\8cã\81\9fæ\97\97æ\8c\81ã\81¡数"
+msgstr "æ\97\97æ\8c\81ã\81¡ã\82­ã\83«数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:117
 msgid "SCO^fckills"
-msgstr "殺ã\81\95ã\82\8cã\81\9fæ\97\97æ\8c\81ã\81¡"
+msgstr "æ\97\97æ\8c\81ã\81¡ã\82­ã\83«æ\95°"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:118
 msgid "FPS"
@@ -666,7 +666,7 @@ msgstr "fps"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "Number of kills minus suicides"
-msgstr "殺された者 - 自殺 = "
+msgstr "キル数 - 自殺数 = "
 
 #: qcsrc/client/hud/panel/scoreboard.qc:119
 msgid "SCO^frags"
@@ -682,11 +682,11 @@ msgstr "ゴール"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "Number of keys carrier kills"
-msgstr "殺された鍵持ち数"
+msgstr "鍵持ちキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:121
 msgid "SCO^kckills"
-msgstr "殺された鍵持ち"
+msgstr "鍵持ちキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:122
 msgid "SCO^k/d"
@@ -696,7 +696,7 @@ msgstr "殺/死"
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "The kill-death ratio"
-msgstr "殺死害率"
+msgstr "キル・デス率"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:123
 msgid "SCO^kdr"
@@ -704,15 +704,15 @@ msgstr "殺死害率"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:124
 msgid "SCO^kdratio"
-msgstr "殺死害率"
+msgstr "キル・デス率"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "Number of kills"
-msgstr "殺された者の数"
+msgstr "キル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:125
 msgid "SCO^kills"
-msgstr "殺された者"
+msgstr "キル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:126
 msgid "Number of laps finished (Race/CTS)"
@@ -736,7 +736,7 @@ msgstr "鍵が失われた回数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:128
 msgid "SCO^losses"
-msgstr "負け"
+msgstr "失われた数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:129
 #: qcsrc/client/hud/panel/scoreboard.qc:130
@@ -843,7 +843,7 @@ msgstr "自殺"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:142
 msgid "Number of kills minus deaths"
-msgstr "殺された者 - 死者 = "
+msgstr "キル数 - デス数 = "
 
 #: qcsrc/client/hud/panel/scoreboard.qc:142
 msgid "SCO^sum"
@@ -859,11 +859,11 @@ msgstr "獲得した"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:144
 msgid "Number of teamkills"
-msgstr "殺されたチームメイトの数"
+msgstr "チームメイトキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:144
 msgid "SCO^teamkills"
-msgstr "殺されたチームメイト"
+msgstr "チームメイトキル数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:145
 msgid "Number of ticks (Domination)"
@@ -945,7 +945,7 @@ msgid ""
 "include/exclude ALL teams/noteams game modes."
 msgstr ""
 "特殊なゲームタイプ名 'team' および 'noteams' を使用して、\n"
-"全てのチーム/チームなしゲームモードを含めたり、除外したりできます。"
+"全てのチーム / チームなしゲームモードを含めたり、除外したりできます。"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:354
 msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
@@ -988,7 +988,7 @@ msgstr "マップ状態:"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1384
 msgid "Monsters killed:"
-msgstr "殺されたモンスター:"
+msgstr "モンスターキル数:"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:1391
 msgid "Secrets found:"
@@ -1163,11 +1163,11 @@ msgstr "構わない"
 
 #: qcsrc/client/mapvoting.qc:382
 msgid "Decide the gametype"
-msgstr "ã\82²ã\83¼ã\83 ã\82¿ã\82¤ã\83\97を決める"
+msgstr "ã\82²ã\83¼ã\83 ã\83¢ã\83¼ã\83\89を決める"
 
 #: qcsrc/client/mapvoting.qc:382
 msgid "Vote for a map"
-msgstr "ã\83\9eã\83\83ã\83\97ã\81«æ\8a\95票ã\81\97ã\81¦ã\81\99ã\82\8b"
+msgstr "マップに投票する"
 
 #: qcsrc/client/mapvoting.qc:399
 #, c-format
@@ -1290,7 +1290,7 @@ msgstr "力"
 
 #: qcsrc/common/items/item/powerup.qh:79 qcsrc/common/items/item/powerup.qh:82
 msgid "Shield"
-msgstr ""
+msgstr "寿"
 
 #: qcsrc/common/mapinfo.qc:626
 #, no-c-format
@@ -1370,7 +1370,7 @@ msgstr "試合が終了する前に必要なポイントの量"
 
 #: qcsrc/common/mapinfo.qh:271
 msgid "Capture the Flag"
-msgstr "旗を取れ (CTF)"
+msgstr "キャプチャー・ザ・フラッグ (CTF)"
 
 #: qcsrc/common/mapinfo.qh:271
 msgid ""
@@ -1800,7 +1800,7 @@ msgstr "復讐"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:87
 msgid "Jump"
-msgstr "飛び越え"
+msgstr "ジャンプ"
 
 #: qcsrc/common/mutators/mutator/buffs/all.inc:96
 msgid "Invisible"
@@ -2549,7 +2549,7 @@ msgstr "^BG%s^K1 の治癒手榴弾はそれら%s%sを完全には癒しなか
 #: qcsrc/common/notifications/all.inc:319
 #, c-format
 msgid "^BG%s^K1 died%s%s. What's the point of living without ammo?"
-msgstr "^BG%s^K1 が死んだ。弾薬なしで生きる意味は何だの?"
+msgstr "^BG%s^K1 が死んだ%s%s。弾薬なしで生きる意味は何だの?"
 
 #: qcsrc/common/notifications/all.inc:319
 #, c-format
@@ -2937,7 +2937,7 @@ msgstr "^BG%s^K1 は「不可視」を拾いた"
 #: qcsrc/common/notifications/all.inc:410
 #, c-format
 msgid "^BG%s^K1 picked up Shield"
-msgstr "^BG%s^K1 は「」を拾いた"
+msgstr "^BG%s^K1 は「寿」を拾いた"
 
 #: qcsrc/common/notifications/all.inc:411
 #, c-format
@@ -2957,7 +2957,7 @@ msgstr "^BG%s^F3 切断された"
 #: qcsrc/common/notifications/all.inc:415
 #, c-format
 msgid "^BG%s^F3 was kicked for idling"
-msgstr "^BG%s^F3 は非活動な状態で追い出された"
+msgstr "^BG%s^F3 は不活発者で追い出された"
 
 #: qcsrc/common/notifications/all.inc:416
 msgid ""
@@ -2980,7 +2980,7 @@ msgstr "^BG%s^F3 は観戦中です"
 #: qcsrc/common/notifications/all.inc:420
 #, c-format
 msgid "^BG%s^BG has abandoned the race"
-msgstr "^BG%^BG はレースを放棄した"
+msgstr "^BG%s^BG はレースを放棄した"
 
 #: qcsrc/common/notifications/all.inc:421
 #, c-format
@@ -2995,7 +2995,7 @@ msgstr "^BG%s^BG は %s%s %s の %s%s^BG 場所の記録を破ることができ
 #: qcsrc/common/notifications/all.inc:423
 #, c-format
 msgid "^BG%s^BG has finished the race"
-msgstr "^BG%^BG はレースを終了した"
+msgstr "^BG%s^BG はレースを終了した"
 
 #: qcsrc/common/notifications/all.inc:424
 #, c-format
@@ -3147,7 +3147,7 @@ msgstr "^BG%s%s^K1 が ^BG%s^K1 のロケット%s%sに近すぎた"
 #: qcsrc/common/notifications/all.inc:457
 #, c-format
 msgid "^BG%s^K1 blew themself up with their Devastator%s%s"
-msgstr "^BG%s^K1 はデーバーステーターs%sで自分自身を爆破した"
+msgstr "^BG%s^K1 はデーバーステーター%s%sで自分自身を爆破した"
 
 #: qcsrc/common/notifications/all.inc:458
 #, c-format
@@ -3327,8 +3327,8 @@ msgstr ""
 msgid ""
 "^BG%s^K1 was sawn in half by their own Overkill Rocket Propelled Chainsaw%s%s"
 msgstr ""
-"^BG%s%s^K1 が自分自身のオーバーキルロケット推進チェーンソー%s%sによって半分に"
-"断された"
+"^BG%s^K1 が自分自身のオーバーキルロケット推進チェーンソー%s%sによって半分に切"
+"断された"
 
 #: qcsrc/common/notifications/all.inc:491
 #, c-format
@@ -3356,12 +3356,12 @@ msgstr "^BG%s%s^K1 が ^BG%s^K1 からのライフル弾雨%s%sで死亡した"
 #: qcsrc/common/notifications/all.inc:496
 #, c-format
 msgid "^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr "^BG%s%s^K1 ã\81¯ ^BG%s^K1 ã\81®ã\83©ã\82¤ã\83\95ã\83«å¼¾é\9b¨%s%sã\81\8bã\82\89é\9d\9e表示ã\81«できなかった"
+msgstr "^BG%s%s^K1 ã\81¯ ^BG%s^K1 ã\81®ã\83©ã\82¤ã\83\95ã\83«å¼¾é\9b¨%s%sã\81\8bã\82\89é\9a ã\81\99ã\81\93ã\81¨ã\81\8cできなかった"
 
 #: qcsrc/common/notifications/all.inc:497
 #, c-format
 msgid "^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s%s"
-msgstr "^BG%s%s^K1 ã\81¯ ^BG%s^K1 ã\81®ã\83©ã\82¤ã\83\95ã\83«%s%sã\81\8bã\82\89é\9d\9e表示ã\81«できなかった"
+msgstr "^BG%s%s^K1 ã\81¯ ^BG%s^K1 ã\81®ã\83©ã\82¤ã\83\95ã\83«%s%sã\81\8bã\82\89é\9a ã\81\99ã\81\93ã\81¨ã\81\8cできなかった"
 
 #: qcsrc/common/notifications/all.inc:498
 #, c-format
@@ -4225,11 +4225,11 @@ msgstr "^F2「力」がすり減った"
 
 #: qcsrc/common/notifications/all.inc:747
 msgid "^F2Shield surrounds you"
-msgstr "^F2「」があなたを囲んでいる"
+msgstr "^F2「寿」があなたを囲んでいる"
 
 #: qcsrc/common/notifications/all.inc:748
 msgid "^F2Shield has worn off"
-msgstr "^F2「」がすり減った"
+msgstr "^F2「寿」がすり減った"
 
 #: qcsrc/common/notifications/all.inc:750
 msgid "^F2You are on speed"
@@ -4381,7 +4381,7 @@ msgstr "トリプル削除! "
 #: qcsrc/common/notifications/all.qh:456
 #, c-format
 msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 は5得点を一列にした! %s^BG"
+msgstr "%s^K1 は5得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:456
 #, c-format
@@ -4395,7 +4395,7 @@ msgstr "激怒! "
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
 msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 は10得点を一列にした! %s^BG"
+msgstr "%s^K1 は10得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:457
 #, c-format
@@ -4409,12 +4409,12 @@ msgstr "虐殺! "
 #: qcsrc/common/notifications/all.qh:458
 #, c-format
 msgid "%s^K1 executed MAYHEM! %s^BG"
-msgstr ""
+msgstr "%s^K1 が暴力を実行した! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:458
 #, c-format
 msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は15得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:458
 msgid "MAYHEM! "
@@ -4423,12 +4423,12 @@ msgstr "暴力! "
 #: qcsrc/common/notifications/all.qh:459
 #, c-format
 msgid "%s^K1 is a BERSERKER! %s^BG"
-msgstr ""
+msgstr "%s^K1 はバーサーカーだ! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:459
 #, c-format
 msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は20得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:459
 msgid "BERSERKER! "
@@ -4437,12 +4437,12 @@ msgstr "バーサーカー! "
 #: qcsrc/common/notifications/all.qh:460
 #, c-format
 msgid "%s^K1 inflicts CARNAGE! %s^BG"
-msgstr ""
+msgstr "%s^K1 は大虐殺をやった! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:460
 #, c-format
 msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は25得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:460
 msgid "CARNAGE! "
@@ -4451,12 +4451,12 @@ msgstr "大虐殺! "
 #: qcsrc/common/notifications/all.qh:461
 #, c-format
 msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は30得点を一列にした! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:461
 #, c-format
 msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
-msgstr ""
+msgstr "%s^K1 はアルマゲドンを解放する! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:461
 msgid "ARMAGEDDON! "
@@ -4465,7 +4465,7 @@ msgstr "アルマゲドン! "
 #: qcsrc/common/notifications/all.qh:468
 #, c-format
 msgid "%s(^F1Bot^BG)"
-msgstr "%s(^F1BOT^BG)"
+msgstr "%s(^F1ボット^BG)"
 
 #: qcsrc/common/notifications/all.qh:470
 #, c-format
@@ -4493,73 +4493,73 @@ msgstr ""
 #: qcsrc/common/notifications/all.qh:500 qcsrc/common/notifications/all.qh:513
 #, c-format
 msgid "%d score spree! "
-msgstr ""
+msgstr "連続 %d 得点! "
 
 #: qcsrc/common/notifications/all.qh:512
 #, c-format
 msgid "%d frag spree! "
-msgstr ""
+msgstr "連続 %d 削除! "
 
 #: qcsrc/common/notifications/all.qh:525
 msgid "First blood! "
-msgstr ""
+msgstr "初殺! "
 
 #: qcsrc/common/notifications/all.qh:525
 msgid "First score! "
-msgstr ""
+msgstr "初得点! "
 
 #: qcsrc/common/notifications/all.qh:529
 msgid "First casualty! "
-msgstr ""
+msgstr "初敗北! "
 
 #: qcsrc/common/notifications/all.qh:529
 msgid "First victim! "
-msgstr ""
+msgstr "初犠牲者! "
 
 #: qcsrc/common/notifications/all.qh:570
 #, c-format
 msgid "%s^K1 has %d frags in a row! %s^BG"
-msgstr ""
+msgstr "%s^K1 には %d の削除が連続している! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:571
 #, c-format
 msgid "%s^K1 made %d scores in a row! %s^BG"
-msgstr ""
+msgstr "%s^K1 が %d 得点を連続して獲得した! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:589
 #, c-format
 msgid "%s^K1 drew first blood! %s^BG"
-msgstr ""
+msgstr "%s^K1 が初殺を引きた! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:590
 #, c-format
 msgid "%s^K1 got the first score! %s^BG"
-msgstr ""
+msgstr "%s^K1 が初得点を獲得した! %s^BG"
 
 #: qcsrc/common/notifications/all.qh:606
 #, c-format
 msgid ", ending their %d frag spree"
-msgstr ""
+msgstr "、連続 %d 削除を終了中"
 
 #: qcsrc/common/notifications/all.qh:607
 #, c-format
 msgid ", ending their %d score spree"
-msgstr ""
+msgstr "、連続 %d 得点を終了中"
 
 #: qcsrc/common/notifications/all.qh:621
 #, c-format
 msgid ", losing their %d frag spree"
-msgstr ""
+msgstr "、連続 %d 削除を失い中"
 
 #: qcsrc/common/notifications/all.qh:622
 #, c-format
 msgid ", losing their %d score spree"
-msgstr ""
+msgstr "、連続 %d 得点を失い中"
 
 #: qcsrc/common/notifications/all.qh:647
 #, c-format
 msgid " with %d %s"
-msgstr ""
+msgstr " の %d %s"
 
 #: qcsrc/common/teams.qh:31
 msgid "TEAM^Red"
@@ -4583,7 +4583,7 @@ msgstr "チーム"
 
 #: qcsrc/common/teams.qh:36
 msgid "Neutral"
-msgstr ""
+msgstr "中立"
 
 #: qcsrc/common/teams.qh:39
 msgid "KEY^Red"
@@ -4635,12 +4635,12 @@ msgstr "ピンク"
 
 #: qcsrc/common/turrets/all.qh:95
 msgid "Turrets dump command only works with sv_cmd."
-msgstr ""
+msgstr "砲塔ダンプコマンドは sv_cmd でのみ機能します。"
 
 #: qcsrc/common/turrets/cl_turrets.qc:125
 #, c-format
 msgid "%s under attack!"
-msgstr ""
+msgstr "%s 攻撃を受けている!"
 
 #: qcsrc/common/turrets/turret.qh:11
 msgid "Turret"
@@ -5454,11 +5454,13 @@ msgid ""
 "Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
 "please file an issue."
 msgstr ""
+"エンティティフィールド %s.%s (%s) がリストにありません。これがエラーだと思わ"
+"れる場合は、問題を報告してください。"
 
 #: qcsrc/lib/string.qh:81
 #, c-format
 msgid "%d days, %02d:%02d:%02d"
-msgstr "%d日, %02d:%02d:%02d"
+msgstr "%d 日、 %02d:%02d:%02d"
 
 #: qcsrc/lib/string.qh:82
 #, c-format
@@ -5467,19 +5469,19 @@ msgstr "%02d:%02d:%02d"
 
 #: qcsrc/menu/command/menu_cmd.qc:48
 msgid "Usage: menu_cmd command..., where possible commands are:"
-msgstr ""
+msgstr "使用法: menu_cmd コマンド...、可能なコマンドは次:"
 
 #: qcsrc/menu/command/menu_cmd.qc:49
 msgid "  sync - reloads all cvars on the current menu page"
-msgstr ""
+msgstr "  sync - 現在のメニューページの全ての cvar をリロードする"
 
 #: qcsrc/menu/command/menu_cmd.qc:50
 msgid "  directmenu ITEM - select a menu item as main item"
-msgstr ""
+msgstr "  directmenu ITEM - メニューアイテムをメインアイテムとして選択する"
 
 #: qcsrc/menu/command/menu_cmd.qc:51
 msgid "  dumptree - dump the state of the menu as a tree to the console"
-msgstr ""
+msgstr "  dumptree - メニューの状態をツリー状としてコンソールにダンプする"
 
 #: qcsrc/menu/command/menu_cmd.qc:81
 msgid "Available options:"
@@ -5681,15 +5683,15 @@ msgstr "以前の貢献者"
 
 #: qcsrc/menu/xonotic/cvarlist.qc:73
 msgid "forced to be saved to config.cfg"
-msgstr ""
+msgstr "強制的に config.cfg に保存される"
 
 #: qcsrc/menu/xonotic/cvarlist.qc:79 qcsrc/menu/xonotic/cvarlist.qc:89
 msgid "will not be saved"
-msgstr "ä¿\9då­\98ã\81\95ã\82\8cã\81¾ã\81\9bã\82\93"
+msgstr "ä¿\9då­\98ã\81\95ã\82\8cã\81ªã\81\84"
 
 #: qcsrc/menu/xonotic/cvarlist.qc:84
 msgid "will be saved to config.cfg"
-msgstr "config.cfgに保存されます"
+msgstr "config.cfg に保存される"
 
 #: qcsrc/menu/xonotic/cvarlist.qc:93
 msgid "private"
@@ -5726,7 +5728,7 @@ msgstr "サーバーから切断してもよろしいですか?"
 
 #: qcsrc/menu/xonotic/dialog_disconnect.qc:19
 msgid "I would disconnect from server..."
-msgstr "サーバーから切断します..."
+msgstr "サーバーから切断し..."
 
 #: qcsrc/menu/xonotic/dialog_disconnect.qc:22
 msgid "I would play more!"
@@ -5759,7 +5761,7 @@ msgstr "名前:"
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:53
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:62
 msgid "Name under which you will appear in the game"
-msgstr ""
+msgstr "ゲームに登場するあなたの名前:"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:69
 msgid "Text language:"
@@ -5768,10 +5770,12 @@ msgstr "テキスト言語:"
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:78
 msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
 msgstr ""
+"選手の統計が stats.xonotic.org であなたのニックネームを使用できるように許可し"
+"ますか?"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:84
 msgid "Undecided"
-msgstr ""
+msgstr "未定"
 
 #: qcsrc/menu/xonotic/dialog_firstrun.qc:88
 msgid "Save settings"
@@ -5783,26 +5787,26 @@ msgstr "ようこそ"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:18
 msgid "Ammunition display:"
-msgstr ""
+msgstr "弾薬表示:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:21
 msgid "Show only current ammo type"
-msgstr ""
+msgstr "現在の弾薬タイプのみを表示する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:24
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
 msgid "Noncurrent alpha:"
-msgstr ""
+msgstr "非現行アルファ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
 msgid "Noncurrent scale:"
-msgstr ""
+msgstr "非現在のスケール:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
 msgid "Align icon:"
-msgstr ""
+msgstr "整列アイコン:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:33
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
@@ -5842,7 +5846,7 @@ msgstr "フェージング時刻"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
 msgid "Flip messages order"
-msgstr ""
+msgstr "メッセージの順序を逆にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
@@ -5857,27 +5861,27 @@ msgstr "中央"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:37
 msgid "Font scale:"
-msgstr ""
+msgstr "フォントスケール:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
 msgid "Centerprint Panel"
-msgstr ""
+msgstr "センタープリントパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
 msgid "Chat entries:"
-msgstr ""
+msgstr "チャットエントリ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
 msgid "Chat size:"
-msgstr ""
+msgstr "チャットサイズ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
 msgid "Chat lifetime:"
-msgstr ""
+msgstr "チャットの存続期間:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
 msgid "Chat beep sound"
-msgstr ""
+msgstr "チャットのビープ音"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.qh:6
 msgid "Chat Panel"
@@ -5889,7 +5893,7 @@ msgstr "エンジン情報"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:19
 msgid "Use an averaging algorithm for fps"
-msgstr ""
+msgstr "FPSの平均化アルゴリズムを使用する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh:6
 msgid "Engine Info Panel"
@@ -5897,18 +5901,18 @@ msgstr "エンジン情報パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
 msgid "Combine health and armor"
-msgstr ""
+msgstr "健康と鎧を組み合わせる"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:19
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:17
 msgid "Enable status bar"
-msgstr ""
+msgstr "ステータスバーを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:21
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:19
 msgid "Status bar alignment:"
-msgstr ""
+msgstr "ステータスバーの配置:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:39
@@ -5927,11 +5931,11 @@ msgstr "外部"
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
 msgid "Icon alignment:"
-msgstr "アイコンの配置"
+msgstr "アイコンの配置:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
 msgid "Flip health and armor positions"
-msgstr ""
+msgstr "健康 / 鎧の位置を逆にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
 msgid "Health/Armor Panel"
@@ -5943,7 +5947,7 @@ msgstr "情報メッセージ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
 msgid "Flip align"
-msgstr ""
+msgstr "配置を逆にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
 msgid "Info Messages Panel"
@@ -5981,11 +5985,11 @@ msgstr "テキスト / アイコン率"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
 msgid "Hide spawned items"
-msgstr ""
+msgstr "現れたアイテムを隠す"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
 msgid "Hide big armor and health"
-msgstr ""
+msgstr "大きな鎧と健康を隠す"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
 msgid "Dynamic size"
@@ -5993,11 +5997,11 @@ msgstr "ダイナミックサイズ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
 msgid "Items Time Panel"
-msgstr ""
+msgstr "アイテムの時刻パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
 msgid "Mod Icons Panel"
-msgstr ""
+msgstr "MODアイコンパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:17
 msgid "Notifications:"
@@ -6005,19 +6009,19 @@ msgstr "通知:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:20
 msgid "Also print notifications to the console"
-msgstr ""
+msgstr "コンソールにも通知を印刷する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:23
 msgid "Flip notify order"
-msgstr ""
+msgstr "通知の順序を逆にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
 msgid "Entry lifetime:"
-msgstr ""
+msgstr "通知を表示する:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
 msgid "Entry fadetime:"
-msgstr ""
+msgstr "通知の退色を表示する:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
 msgid "Notification Panel"
@@ -6030,49 +6034,49 @@ msgstr "有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
 msgid "Enable even observing"
-msgstr ""
+msgstr "観察さえに有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
 msgid "Enable only in Race/CTS"
-msgstr ""
+msgstr "レース / CTSでのみ有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
 msgid "Status bar"
-msgstr ""
+msgstr "ステータスバー"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:26
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:67
 msgid "Left align"
-msgstr ""
+msgstr "左揃え"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:27
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:73
 msgid "Right align"
-msgstr ""
+msgstr "右揃え"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:28
 msgid "Inward align"
-msgstr ""
+msgstr "内揃え"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:29
 msgid "Outward align"
-msgstr ""
+msgstr "外揃え"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:33
 msgid "Flip speed/acceleration positions"
-msgstr ""
+msgstr "速度/加速位置を逆にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
 msgid "Speed:"
-msgstr ""
+msgstr "速度:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
 msgid "Include vertical speed"
-msgstr ""
+msgstr "垂直速度を含める"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
 msgid "Speed unit:"
-msgstr ""
+msgstr "速度単位:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
 msgid "qu/s"
@@ -6096,52 +6100,52 @@ msgstr "ノット"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:57
 msgid "Show"
-msgstr ""
+msgstr "表示する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:60
 msgid "Top speed"
-msgstr ""
+msgstr "トップ速度"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
 msgid "Acceleration:"
-msgstr ""
+msgstr "加速"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
 msgid "Include vertical acceleration"
-msgstr ""
+msgstr "垂直加速度を含める"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
 msgid "Physics Panel"
-msgstr ""
+msgstr "物理パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
 msgid "Powerups Panel"
-msgstr ""
+msgstr "パワーアップパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
 msgid "Always enable"
-msgstr ""
+msgstr "常に有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
 msgid "Forced aspect:"
-msgstr ""
+msgstr "強制アスペクト:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
 msgid "Pressed Keys Panel"
-msgstr ""
+msgstr "押されたキーパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
 msgid "Quick Menu Panel"
-msgstr ""
+msgstr "クイックメニューパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
 msgid "Race Timer Panel"
-msgstr ""
+msgstr "レースタイマーパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
 msgid "Enable in team games"
-msgstr ""
+msgstr "チームゲームで有効にする"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
 msgid "Radar:"
@@ -6186,31 +6190,31 @@ msgstr "北"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
 msgid "Scale:"
-msgstr ""
+msgstr "スケール:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
 msgid "Zoom mode:"
-msgstr ""
+msgstr "ズームモード:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
 msgid "Zoomed in"
-msgstr ""
+msgstr "ズームした内"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
 msgid "Zoomed out"
-msgstr ""
+msgstr "ズームした外"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
 msgid "Always zoomed"
-msgstr ""
+msgstr "常にズームした"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
 msgid "Never zoomed"
-msgstr ""
+msgstr "決してズームした"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
 msgid "Radar Panel"
-msgstr ""
+msgstr "レーダーパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:17
 msgid "Score:"
@@ -6223,43 +6227,43 @@ msgstr "ランキング:"
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:58
 msgid "Off"
-msgstr ""
+msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:22
 msgid "And me"
-msgstr ""
+msgstr "私も"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:23
 msgid "Pure"
-msgstr ""
+msgstr "純粋"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_score.qh:6
 msgid "Score Panel"
-msgstr ""
+msgstr "得点パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:16
 msgid "Timer:"
-msgstr ""
+msgstr "タイマー:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:19
 msgid "Show elapsed time"
-msgstr ""
+msgstr "経過時間を表示する:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
 msgid "Timer Panel"
-msgstr ""
+msgstr "タイマーパネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
 msgid "Alpha after voting:"
-msgstr ""
+msgstr "投票後のアルファ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
 msgid "Vote Panel"
-msgstr ""
+msgstr "投票パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
 msgid "Fade out after:"
-msgstr ""
+msgstr "退色後:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
@@ -6275,35 +6279,35 @@ msgstr "%ds"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:30
 msgid "Fade effect:"
-msgstr ""
+msgstr "退色エフェクト:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
 msgid "EF^None"
-msgstr ""
+msgstr "なし"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:34
 msgid "Alpha"
-msgstr ""
+msgstr "アルファ"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:35
 msgid "Slide"
-msgstr ""
+msgstr "スライド"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:36
 msgid "EF^Both"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:40
 msgid "Weapon icons:"
-msgstr ""
+msgstr "武器アイコン:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:43
 msgid "Show only owned weapons"
-msgstr ""
+msgstr "所有している武器のみを表示する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
 msgid "Show weapon ID as:"
-msgstr ""
+msgstr "武器IDを次として表示する:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
 msgid "SHOWAS^None"
@@ -6315,35 +6319,35 @@ msgstr "番号"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:57
 msgid "Bind"
-msgstr ""
+msgstr "割り当てられたキー"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:60
 msgid "Weapon ID scale:"
-msgstr ""
+msgstr "武器IDスケール:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
 msgid "Show Accuracy"
-msgstr ""
+msgstr "精度を表示する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:67
 msgid "Show Ammo"
-msgstr ""
+msgstr "弾薬を表示する"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
 msgid "Ammo bar alpha:"
-msgstr ""
+msgstr "弾薬バーアルファ:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:76
 msgid "Ammo bar color:"
-msgstr ""
+msgstr "弾薬バーの色:"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
 msgid "Weapons Panel"
-msgstr ""
+msgstr "武器パネル"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
 msgid "HUD skins"
-msgstr ""
+msgstr "HUDスキン"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:22
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:173
@@ -6364,11 +6368,11 @@ msgstr "更新する"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:28
 msgid "Set skin"
-msgstr ""
+msgstr "スキンを設定する"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
 msgid "Save current skin"
-msgstr ""
+msgstr "現在のスキンを保存する"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
 msgid "Panel background defaults:"
@@ -6382,7 +6386,7 @@ msgstr "背景:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
 #: qcsrc/menu/xonotic/util.qc:783
 msgid "Border size:"
-msgstr ""
+msgstr "ボーダーサイズ:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
@@ -6392,16 +6396,16 @@ msgstr "チームカラー:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
 #: qcsrc/menu/xonotic/util.qc:809
 msgid "Test team color in configure mode"
-msgstr ""
+msgstr "構成モードでのチームカラーのテストする"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
 #: qcsrc/menu/xonotic/util.qc:812
 msgid "Padding:"
-msgstr ""
+msgstr "パディング:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
 msgid "HUD Dock:"
-msgstr ""
+msgstr "HUDドック:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
 msgid "DOCK^Disabled"
@@ -6454,27 +6458,27 @@ msgstr "モンスター:"
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:22
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
 msgid "Spawn"
-msgstr ""
+msgstr "現れる"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:23
 msgid "Remove"
-msgstr ""
+msgstr "削除する"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:25
 msgid "Move target:"
-msgstr ""
+msgstr "ターゲットを移動する:"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:26
 msgid "Follow"
-msgstr ""
+msgstr "従う"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:27
 msgid "Wander"
-msgstr ""
+msgstr "彷徨う"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:28
 msgid "Spawnpoint"
-msgstr ""
+msgstr "現れるポイント"
 
 #: qcsrc/menu/xonotic/dialog_monstertools.qc:29
 msgid "No moving"
@@ -6499,19 +6503,19 @@ msgstr "サーバー"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:15
 msgid "Find servers to play on"
-msgstr ""
+msgstr "遊ぶためにサーバーを見つける"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:17
 msgid "Host your own game"
-msgstr ""
+msgstr "自分のゲームを作成する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:18
 msgid "Media"
-msgstr ""
+msgstr "メディア"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.qc:19
 msgid "Profile"
-msgstr ""
+msgstr "プロフィール"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer.qh:6
 msgid "Multiplayer"
@@ -6522,6 +6526,7 @@ msgid ""
 "Play online, against your friends in LAN, view demos or change player "
 "settings"
 msgstr ""
+"オンラインで遊ぶ、LANの友達に対して、デモを表示するか、選手設定を変更する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:111
@@ -6534,19 +6539,19 @@ msgstr "デフォルト"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:40
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:60
 msgid "Unlimited"
-msgstr ""
+msgstr "無制限"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:74
 msgid "Gametype"
-msgstr ""
+msgstr "ゲームモード"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:79
 msgid "Time limit:"
-msgstr ""
+msgstr "制限時刻:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:81
 msgid "Timelimit in minutes that when hit, will end the match"
-msgstr ""
+msgstr "ヒットすると試合が終了する分単位の制限時刻"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:82
 #, c-format
@@ -6584,13 +6589,13 @@ msgstr "4チーム"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:117
 msgid "Player slots:"
-msgstr "プレイヤースロット:"
+msgstr "選手スロット:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:119
 msgid ""
 "The maximum amount of players or bots that can be connected to your server "
 "at once"
-msgstr ""
+msgstr "一度にサーバーに接続できる選手またはボットの最大数"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:121
 msgid "Number of bots:"
@@ -6606,7 +6611,7 @@ msgstr "ボット技術:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
 msgid "Specify how experienced the bots will be"
-msgstr ""
+msgstr "ボットの経験値を指定する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:129
 msgid "Botlike"
@@ -6669,6 +6674,8 @@ msgid ""
 "Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
 "Delete to clear; Enter when done."
 msgstr ""
+"ここをクリックするか、Ctrl-Fを使用して、マップリストを絞り込むキーワードを指"
+"定します。 Ctrl-Deleteでクリアします; 完了したらEnterキーを押します。"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
 msgid "Add shown"
@@ -6676,7 +6683,7 @@ msgstr "表示された者を追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
 msgid "Add the maps shown in the list to your selection"
-msgstr ""
+msgstr "リストに表示されているマップを選択に追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
 msgid "Remove shown"
@@ -6684,7 +6691,7 @@ msgstr "表示された者を全て削除する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:189
 msgid "Remove the maps shown in the list from your selection"
-msgstr ""
+msgstr "リストに表示されているマップを選択から削除する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:194
 msgid "Add all"
@@ -6692,7 +6699,7 @@ msgstr "全て追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:195
 msgid "Add every available map to your selection"
-msgstr ""
+msgstr "利用可能な全てのマップを選択に追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:198
 msgid "Remove all"
@@ -6700,7 +6707,7 @@ msgstr "全て削除する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:199
 msgid "Remove all the maps from your selection"
-msgstr ""
+msgstr "利用可能な全てのマップを選択から削除する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
 msgid "Start Multiplayer!"
@@ -6716,7 +6723,7 @@ msgstr "作者:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:62
 msgid "Game types:"
-msgstr ""
+msgstr "ゲームタイプ:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:85
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:257
@@ -6725,7 +6732,7 @@ msgstr "閉じる"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:88
 msgid "MAP^Play"
-msgstr ""
+msgstr "遊ぶ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
 msgid "Map Information"
@@ -6810,7 +6817,7 @@ msgstr "ピニャータ"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:87
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:239
 msgid "Weapons stay"
-msgstr "æ­¦å\99¨ã\81¯æ­¢ã\81¾る"
+msgstr "æ­¦å\99¨ã\81¯æ®\8bる"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:89
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:191
@@ -6861,39 +6868,41 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
 msgid "An explosion occurs when two players collide"
-msgstr ""
+msgstr "2人の選手が衝突すると爆発が発生する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
 msgid "All players are almost invisible"
-msgstr ""
+msgstr "全ての選手はほとんど見えない"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:176
 msgid ""
 "Enable buff pickups (random bonuses like Medic, Invisible, etc.) on the maps "
 "that support it"
 msgstr ""
+"サポートするマップでバフピックアップ (再生、不可視、等どのランダムボーナス) "
+"を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:181
 msgid "Only possible to inflict damage on your enemy while they're airborne"
-msgstr ""
+msgstr "空中の敵にのみダメージを与えることができる"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:185
 msgid "Damage done to your enemy gets added to your own health"
-msgstr ""
+msgstr "敵に与えたダメージは自分の健康に追加される"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:190
 msgid ""
 "Amount of health below which players start bleeding out (health rots and "
 "they can't jump)"
-msgstr ""
+msgstr "選手が出血し始める健康の量 (健康が腐り、ジャンプできない)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
 msgid "Make things fall to the ground slower (percentage of normal gravity)"
-msgstr ""
+msgstr "物がゆっくりと地面に落ちるようにする(通常の重力率)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
 msgid "Weapon & item mutators:"
-msgstr ""
+msgstr "武器とアイテムのミューテーター:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:211
 msgid "Grappling hook"
@@ -6901,25 +6910,31 @@ msgstr "グラップリングフック"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
 msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
-msgstr ""
+msgstr "選手はグラップリングフックで現れる。使用するには「フック」キーを押して"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:216
 msgid ""
 "Players spawn with the jetpack. Double-tap 'jump' or press the 'jetpack' key "
 "to use it"
 msgstr ""
+"選手はジェットパックでスポーンする。 「ジャンプ」をダブルタップするか、使用す"
+"るために「ジェットパック」キーを押して"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:220
 msgid ""
 "Projectiles can't be destroyed. However, you can still explode Electro orbs "
 "with the Electro primary fire"
 msgstr ""
+"弾は破壊できない。ただし、エレクトの一次射撃でエレクトオーブを爆発させること"
+"はできる"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:225
 msgid ""
 "Some weapon spawns will be randomly replaced with new weapons: Heavy Laser "
 "Assault Cannon, Mine Layer, Rifle, T.A.G. Seeker"
 msgstr ""
+"一部の武器スポーンは新しい武器にランダムに置き換えられる: 重いレーザー突撃"
+"キャノン、鉱山レーヤー、ライフル、T.A.G.シーカー"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:230
 msgid ""
@@ -6927,44 +6942,48 @@ msgid ""
 "delay). This allows players to fire and detonate a Devastator rocket while "
 "in the air for a strong mid-air boost even while moving fast"
 msgstr ""
+"デーバーステーターロケットは即座に爆発させることができます (そうでない場合、"
+"短い遅延があります)。これにより、選手は空中にデーバーステーターロケットを発射"
+"して爆発させることができ、高速で移動しているときでも強力な空中ブーストが得ら"
+"れます"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:235
 msgid "Players will drop all weapons they possessed when they are killed"
-msgstr ""
+msgstr "選手は殺されたときに所有していた全ての武器を落とす"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:240
 msgid "Weapons stay after they are picked up"
-msgstr ""
+msgstr "武器は拾った後も残る"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:245
 msgid "Regular (no arena)"
-msgstr ""
+msgstr "通常 (アリーナなし)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:246
 msgid ""
 "Players will be given a set of weapons at spawn as well as unlimited ammo, "
 "without weapon pickups"
-msgstr ""
+msgstr "選手は現れる時に武器のセットと無制限の弾薬を受け取ります"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:248
 msgid "Weapon arenas:"
-msgstr ""
+msgstr "武器アリーナ:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:251
 msgid "Custom weapons"
-msgstr ""
+msgstr "カスタム武器"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
 msgid "Most weapons"
-msgstr ""
+msgstr "ほとんどの武器"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:277
 msgid "All weapons"
-msgstr ""
+msgstr "全ての武器"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:280
 msgid "Special arenas:"
-msgstr ""
+msgstr "特別なアリーナ:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:284
 msgid ""
@@ -6973,6 +6992,9 @@ 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 ""
+"選手は武器を受け取り、一発で敵を即座に殺すことができます。選手が弾薬を使い果"
+"たした場合、弾薬を見つけるまで10秒かかりますが、弾薬を見つけられない場合は死"
+"にます。二次射撃モードはダメージを与えませんが、ジャンプに適しています。"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:289
 msgid ""
@@ -6980,64 +7002,67 @@ msgid ""
 "weapon. After some time, a countdown will start, after which everyone will "
 "switch to another weapon."
 msgstr ""
+"XONOTICのアイテムなし · ピックアップアイテムの代わりに、全員が同じ武器で遊び"
+"ます。しばらくするとカウントダウンが始まり、その後全員が別の武器に切り替えま"
+"す。"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
 msgid "with blaster"
-msgstr ""
+msgstr "ブラスターで"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:294
 msgid "Always carry the blaster as an additional weapon in Nix"
-msgstr ""
+msgstr "NIXの追加の武器として常にブラスターを運ぶ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qh:9
 msgid "Mutators"
-msgstr ""
+msgstr "ミューテーター"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:39
 msgid "SRVS^Categories"
-msgstr ""
+msgstr "カテゴリー"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:42
 msgid "SRVS^Empty"
-msgstr ""
+msgstr "空っぽ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:43
 msgid "Show empty servers"
-msgstr ""
+msgstr "空っぽのサーバーを表示する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:47
 msgid "SRVS^Full"
-msgstr ""
+msgstr "いっぱい"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:48
 msgid "Show full servers that have no slots available"
-msgstr ""
+msgstr "使用可能なスロットがないサーバー全体を表示する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:52
 msgid "Pause"
-msgstr ""
+msgstr "一時停止"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:53
 msgid ""
 "Pause updating the server list to prevent servers from \"jumping around\""
-msgstr ""
+msgstr "スキップしないようにサーバーリストの更新を一時停止する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
 msgid "Reload the server list"
-msgstr ""
+msgstr "サーバーリストを更新する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:68
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:184
 msgid "Address:"
-msgstr ""
+msgstr "アドレス:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:79
 msgid "Info..."
-msgstr ""
+msgstr "情報..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:80
 msgid "Show more information about the currently highlighted server"
-msgstr ""
+msgstr "現在強調表示されているサーバーに関する詳細情報を表示する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:92
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:264
@@ -7052,96 +7077,96 @@ msgstr "MOD^デフォルト"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
 #, c-format
 msgid "%d modified"
-msgstr ""
+msgstr "%d 変更した"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
 msgid "Official"
-msgstr ""
+msgstr "公式"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:129
 msgid "N/A (auth library missing, can't connect)"
-msgstr ""
+msgstr "N/A (認証ライブラリがないため接続できません)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:131
 msgid "N/A (auth library missing)"
-msgstr ""
+msgstr "N/A (認証ライブラリがない)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:137
 msgid "Not supported (can't connect)"
-msgstr ""
+msgstr "サポートされていません (接続できません)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:139
 msgid "Not supported (won't encrypt)"
-msgstr ""
+msgstr "サポートされていません "
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:143
 msgid "Supported (will encrypt)"
-msgstr ""
+msgstr "サポートされている (暗号化します)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:145
 msgid "Supported (won't encrypt)"
-msgstr ""
+msgstr "サポートされている (暗号化しません)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:149
 msgid "Requested (will encrypt)"
-msgstr ""
+msgstr "要求した (暗号化します)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:151
 msgid "Requested (won't encrypt)"
-msgstr ""
+msgstr "要求した (暗号化しません)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:155
 msgid "Required (can't connect)"
-msgstr ""
+msgstr "必須 (接続できません)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:157
 msgid "Required (will encrypt)"
-msgstr ""
+msgstr "必須 (暗号化します)"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
 msgid "Use the `crypto_aeslevel` cvar to change your preferences"
-msgstr ""
+msgstr "設定を変更するには `crypto_aeslevel` cvarを使用する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
 msgid "Hostname:"
-msgstr ""
+msgstr "ホスト名:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:192
 msgid "Gametype:"
-msgstr ""
+msgstr "ゲームモード:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:197
 msgid "Map:"
-msgstr ""
+msgstr "マップ:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:202
 msgid "Mod:"
-msgstr ""
+msgstr "MOD:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:207
 msgid "Version:"
-msgstr ""
+msgstr "バージョン:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:212
 msgid "Settings:"
-msgstr ""
+msgstr "設定:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:219
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
 msgid "Players:"
-msgstr ""
+msgstr "選手:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:224
 msgid "Bots:"
-msgstr ""
+msgstr "ボット:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
 msgid "Free slots:"
-msgstr ""
+msgstr "自由スロット:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
 msgid "Encryption:"
-msgstr ""
+msgstr "暗号化:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:240
 msgid "ID:"
@@ -7149,88 +7174,89 @@ msgstr "ID:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:245
 msgid "Key:"
-msgstr ""
+msgstr "キー:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh:7
 msgid "Server Information"
-msgstr ""
+msgstr "サーバー情報"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:25
 msgid "Demos"
-msgstr ""
+msgstr "デモ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:26
 msgid "Screenshots"
-msgstr ""
+msgstr "スクリーンショット"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:27
 msgid "Music Player"
-msgstr ""
+msgstr "音楽プレーヤー"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:48
 msgid "Auto record demos"
-msgstr ""
+msgstr "自動録音デモ"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:57
 msgid "Timedemo"
-msgstr ""
+msgstr "最高速度でデモを再生する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:58
 msgid "Benchmark how fast your computer can run the highlighted demo"
 msgstr ""
+"お使いのコンピューターが強調表示されたデモを実行できる速度をベンチマークする"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:62
 msgid "DEMO^Play"
-msgstr ""
+msgstr "再生する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:13
 msgid "Playing a demo will disconnect you from the current match."
-msgstr ""
+msgstr "デモを再生すると、現在の試合から切断される。"
 
 #: 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 ""
+msgstr "本当に切断しますか?"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
 msgid "Timing a demo will disconnect you from the current match."
-msgstr ""
+msgstr "デモのタイミングをとると、現在の試合から切り離されます。"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:37
 msgid "MUSICPL^Add"
-msgstr ""
+msgstr "追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:40
 msgid "MUSICPL^Add all"
-msgstr ""
+msgstr "全て追加する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:44
 msgid "Set as menu track"
-msgstr ""
+msgstr "メニュートラックとして設定する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:48
 msgid "Reset default menu track"
-msgstr ""
+msgstr "デフォルトのメニュートラックをリセットする"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
 msgid "Playlist:"
-msgstr ""
+msgstr "プレイリスト:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:55
 msgid "Random order"
-msgstr ""
+msgstr "ランダム順序"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:60
 msgid "MUSICPL^Stop"
-msgstr ""
+msgstr "停止する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:63
 msgid "MUSICPL^Play"
-msgstr ""
+msgstr "再生する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:66
 msgid "MUSICPL^Pause"
-msgstr ""
+msgstr "一時停止する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:69
 msgid "MUSICPL^Prev"
@@ -7250,15 +7276,15 @@ msgstr "全て削除する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:41
 msgid "Auto screenshot scoreboard"
-msgstr ""
+msgstr "自動スクリーンショット得点表"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:62
 msgid "Open in the viewer"
-msgstr ""
+msgstr "ビューアで開く"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:137
 msgid "Reset"
-msgstr ""
+msgstr "リセットする"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
 msgid "Previous"
@@ -7270,7 +7296,7 @@ msgstr "次"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:150
 msgid "Slide show"
-msgstr ""
+msgstr "スライドショー"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:38
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:21
@@ -7278,7 +7304,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:26
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:21
 msgid "Apply immediately"
-msgstr ""
+msgstr "すぐに申し込む"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:50
 msgid "Name"
@@ -7290,27 +7316,27 @@ msgstr "モデル"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:98
 msgid "Glowing color"
-msgstr ""
+msgstr "輝く色"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:108
 msgid "Detail color"
-msgstr ""
+msgstr "詳細色"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:123
 msgid "Statistics"
-msgstr ""
+msgstr "統計"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:127
 msgid "Allow player statistics to track your client"
-msgstr ""
+msgstr "選手の統計にクライアントの追跡を許可する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:131
 msgid "Allow player statistics to use your nickname"
-msgstr ""
+msgstr "選手の統計であなたのニックネームを使用できるように許可する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
 msgid "Allow player statistics to rank you in leaderboards"
-msgstr ""
+msgstr "選手の統計が得点表であなたをランク付けできるように許可する"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
 msgid "Country"
@@ -7334,11 +7360,11 @@ msgstr "本当に出かけたいですか?"
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:15
 msgid "Back to work..."
-msgstr ""
+msgstr "仕事に戻る..."
 
 #: qcsrc/menu/xonotic/dialog_quit.qc:17
 msgid "I got some more fragging to do!"
-msgstr ""
+msgstr "後いくつか得点します!"
 
 #: qcsrc/menu/xonotic/dialog_quit.qh:7
 msgid "Quit the game"
@@ -7362,111 +7388,111 @@ msgstr "ペーストする"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:26
 msgid "Bone:"
-msgstr ""
+msgstr "骨:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:31
 msgid "Set * as child"
-msgstr ""
+msgstr "* を子として設定する"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:32
 msgid "Attach to *"
-msgstr ""
+msgstr "* に添付する"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:34
 msgid "Detach from *"
-msgstr ""
+msgstr "* に取り除く"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
 msgid "Visual object properties for *:"
-msgstr ""
+msgstr "* のビジュアルオブジェクトプロパティ:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:41
 msgid "Set alpha:"
-msgstr ""
+msgstr "アルファを設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:44
 msgid "Set color main:"
-msgstr ""
+msgstr "メインカラーを設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
 msgid "Set color glow:"
-msgstr ""
+msgstr "カラーグローを設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
 msgid "Set frame:"
-msgstr ""
+msgstr "フレームを設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
 msgid "Physical object properties for *:"
-msgstr ""
+msgstr "* の物理オブジェクトプロパティ:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
 msgid "Set material:"
-msgstr ""
+msgstr "素材を設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:62
 msgid "Set solidity:"
-msgstr ""
+msgstr "固体の程度を設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
 msgid "Non-solid"
-msgstr ""
+msgstr "非固体"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
 msgid "Solid"
-msgstr ""
+msgstr "固体"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
 msgid "Set physics:"
-msgstr ""
+msgstr "物理を設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
 msgid "Static"
-msgstr ""
+msgstr "静的"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:67
 msgid "Movable"
-msgstr ""
+msgstr "可動"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
 msgid "Physical"
-msgstr ""
+msgstr "物理的"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
 msgid "Set scale:"
-msgstr ""
+msgstr "スケールを設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:72
 msgid "Set force:"
-msgstr ""
+msgstr "強度を設定する:"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:76
 msgid "Claim *"
-msgstr ""
+msgstr "* 請求する"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
 msgid "* object info"
-msgstr ""
+msgstr "* オブジェクト情報"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
 msgid "* mesh info"
-msgstr ""
+msgstr "* メッシュ情報"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
 msgid "* attachment info"
-msgstr ""
+msgstr "* 添付情報"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
 msgid "Show help"
-msgstr ""
+msgstr "ヘルプを表示する"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qc:82
 msgid "* is the object you are facing"
-msgstr ""
+msgstr "* はあなたが直面しているオブジェクトです"
 
 #: qcsrc/menu/xonotic/dialog_sandboxtools.qh:6
 msgid "Sandbox Tools"
-msgstr ""
+msgstr "サンドボックスツール"
 
 #: qcsrc/menu/xonotic/dialog_settings.qc:18
 msgid "Video"
@@ -7547,11 +7573,11 @@ msgstr "武器:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
 msgid "New style sound attenuation"
-msgstr ""
+msgstr "新しいスタイルの音響減衰"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:102
 msgid "Mute sounds when not active"
-msgstr ""
+msgstr "活発でないときに音を消す"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
 msgid "Frequency:"
@@ -7650,6 +7676,8 @@ msgid ""
 "Enable spatialization (blend the right and left channel slightly to decrease "
 "stereo separation a bit for headphones)"
 msgstr ""
+"空間化を有効にする (ヘッドフォンのステレオ分離を少し減らすために、右チャネル"
+"と左チャネルを少しブレンドする)"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
 msgid "Hit indication sound"
@@ -7657,7 +7685,7 @@ msgstr "インパクトインジケーターサウンド"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
 msgid "Play a hit indicator sound when your shot hits an enemy"
-msgstr ""
+msgstr "ショットが敵に当たったときにインパクトインジケーターサウンドを再生する"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:147
 msgid "Chat message sound"
@@ -7669,7 +7697,7 @@ msgstr "メニューサウンド"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:150
 msgid "Play sounds when clicking menu items"
-msgstr ""
+msgstr "メニューアイテムをクリックするとサウンドを再生する"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:151
 msgid "Focus sounds"
@@ -7677,7 +7705,7 @@ msgstr "サウンドを集中させる"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:152
 msgid "Play sounds when hovering over menu items too"
-msgstr ""
+msgstr "メニューアイテムの上にマウスを置いたときにもサウンドを再生する"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
 msgid "Time announcer:"
@@ -7693,23 +7721,23 @@ msgstr "5分"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:161
 msgid "WRN^Both"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
 msgid "Automatic taunts:"
-msgstr ""
+msgstr "自動からかう:"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
 msgid "Automatically taunt enemies after fragging them"
-msgstr ""
+msgstr "削除後に敵を自動的にからかう"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:168
 msgid "Sometimes"
-msgstr ""
+msgstr "時々"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:169
 msgid "Often"
-msgstr ""
+msgstr "しばしば"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:170
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:147
@@ -7719,19 +7747,19 @@ msgstr "常に"
 
 #: qcsrc/menu/xonotic/dialog_settings_audio.qc:176
 msgid "Debug info about sounds"
-msgstr ""
+msgstr "サウンドのついてデバッグ情報"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
 msgid "Are you sure you want to reset all key bindings?"
-msgstr "全てのキーバインディングをリセットしてもよろしいですか?"
+msgstr "全てのキー割り当てをリセットしてもよろしいですか?"
 
 #: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
 msgid "Reset key bindings"
-msgstr ""
+msgstr "キー割り当てをリセットする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
 msgid "Quality preset:"
-msgstr ""
+msgstr "品質プリセット:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
 msgid "PRE^OMG!"
@@ -7739,51 +7767,51 @@ msgstr "OMG!"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:48
 msgid "PRE^Low"
-msgstr ""
+msgstr "低い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:50
 msgid "PRE^Medium"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
 msgid "PRE^Normal"
-msgstr ""
+msgstr "通常"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:54
 msgid "PRE^High"
-msgstr ""
+msgstr "高い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:56
 msgid "PRE^Ultra"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:60
 msgid "PRE^Ultimate"
-msgstr ""
+msgstr "究極"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
 msgid "Geometry detail:"
-msgstr ""
+msgstr "ジオメトリ詳細:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
 msgid "Change the smoothness of the curves on the map"
-msgstr ""
+msgstr "マップ上の曲線の滑らかさを変更する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:68
 msgid "DET^Lowest"
-msgstr ""
+msgstr "最低"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:69
 msgid "DET^Low"
-msgstr ""
+msgstr "低い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:70
 msgid "DET^Normal"
-msgstr ""
+msgstr "通常"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:71
 msgid "DET^Good"
-msgstr ""
+msgstr "良い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:72
 msgid "DET^Best"
@@ -7791,7 +7819,7 @@ msgstr "最高"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
 msgid "DET^Insane"
-msgstr ""
+msgstr "非常識"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
 msgid "Player detail:"
@@ -7799,19 +7827,19 @@ msgstr "選手詳細:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
 msgid "PDET^Low"
-msgstr ""
+msgstr "低い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:80
 msgid "PDET^Medium"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:81
 msgid "PDET^Normal"
-msgstr ""
+msgstr "通常"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:82
 msgid "PDET^Good"
-msgstr ""
+msgstr "良い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:83
 msgid "PDET^Best"
@@ -7819,31 +7847,31 @@ msgstr "最高"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:87
 msgid "Texture resolution:"
-msgstr ""
+msgstr "テクスチャ解像度"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:91
 msgid "RES^Leet"
-msgstr ""
+msgstr "Leet"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:92
 msgid "RES^Lowest"
-msgstr ""
+msgstr "最低"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:93
 msgid "RES^Very low"
-msgstr ""
+msgstr "とても低い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:94
 msgid "RES^Low"
-msgstr ""
+msgstr "低い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:95
 msgid "RES^Normal"
-msgstr ""
+msgstr "通常"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:96
 msgid "RES^Good"
-msgstr ""
+msgstr "良い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:97
 msgid "RES^Best"
@@ -7853,117 +7881,124 @@ msgstr "最高"
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:115
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:120
 msgid "Avoid lossy texture compression"
-msgstr ""
+msgstr "非可逆テクスチャ圧縮を回避する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
 msgid "Disable sky for performance and visibility"
-msgstr ""
+msgstr "パフォーマンスと可視性のために空を無効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
 msgid "Show sky"
-msgstr ""
+msgstr "空を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:132
 msgid "Show surfaces"
-msgstr ""
+msgstr "表面を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:133
 msgid ""
 "Disable textures completely for very slow hardware. This gives a huge "
 "performance boost, but looks very ugly."
 msgstr ""
+"非常に遅いハードウェアでは、テクスチャを完全に無効にします。これにより、パ"
+"フォーマンスが大幅に向上しますが、見た目は非常に醜くなります。"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:136
 msgid "Use lightmaps"
-msgstr ""
+msgstr "ライトマップを使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:137
 msgid ""
 "Use high resolution lightmaps, which will look pretty but use up some extra "
 "video memory"
 msgstr ""
+"高解像度のライトマップを使用する、見た目はきれいですが、追加のビデオメモリを"
+"使い果たします。"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:139
 msgid "Deluxe mapping"
-msgstr ""
+msgstr "デラックスマッピング"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:140
 msgid "Use per-pixel lighting effects"
-msgstr ""
+msgstr "ピクセル照明エフェクトの使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:142
 msgid "Gloss"
-msgstr ""
+msgstr "グロス"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:143
 msgid "Enable the use of glossmaps on textures supporting it"
-msgstr ""
+msgstr "サポートするテクスチャでグロスマップの使用を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:146
 msgid "Offset mapping"
-msgstr ""
+msgstr "オフセットマッピング"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:147
 msgid ""
 "Offset mapping effect that will make textures with bumpmaps appear like they "
 "\"pop out\" of the flat 2D surface"
 msgstr ""
+"バンプマップのあるテクスチャがフラットな2Dサーフェスから飛び出して見えるよう"
+"にするオフセットマッピングエフェクト"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:149
 msgid "Relief mapping"
-msgstr ""
+msgstr "レリーフマッピング"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:150
 msgid ""
 "Higher quality offset mapping, which also has a huge impact on performance"
-msgstr ""
+msgstr "パフォーマンスに大きな影響を与える高品質のオフセットマッピング"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:153
 msgid "Reflections:"
-msgstr ""
+msgstr "反射:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:154
 msgid ""
 "Reflection and refraction quality, has a huge impact on performance on maps "
 "with reflecting surfaces"
 msgstr ""
+"反射と屈折の品質は、反射面を持つマップのパフォーマンスに大きな影響を与えます"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:157
 msgid "Resolution of reflections/refractions"
-msgstr ""
+msgstr "反射 / 屈折の解像度"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:158
 msgid "Blurred"
-msgstr ""
+msgstr "ぼやけた"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:159
 msgid "REFL^Good"
-msgstr ""
+msgstr "良い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:160
 msgid "Sharp"
-msgstr ""
+msgstr "鋭い"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:164
 msgid "Decals"
-msgstr ""
+msgstr "デカール"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:165
 msgid "Enable decals (bullet holes and blood)"
-msgstr ""
+msgstr "デカールを有効にする (銃弾の穴と血)"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:166
 msgid "Decals on models"
-msgstr ""
+msgstr "モデルのデカール"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:170
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:254
 msgid "Distance:"
-msgstr ""
+msgstr "距離:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:173
 msgid "Decals further away than this will not be drawn"
-msgstr ""
+msgstr "この距離から離れたデカールは描画されません"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:177
 msgid "Time:"
@@ -7971,11 +8006,11 @@ msgstr "時刻:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:180
 msgid "Time in seconds before decals fade away"
-msgstr ""
+msgstr "デカールが消えるまでの秒数"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:184
 msgid "Damage effects:"
-msgstr ""
+msgstr "ダメージエフェクト:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:186
 msgid "DMGFX^Disabled"
@@ -7983,124 +8018,133 @@ msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:187
 msgid "Skeletal"
-msgstr ""
+msgstr "骨格"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:188
 msgid "DMGFX^All"
-msgstr ""
+msgstr "全て"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:192
 msgid "No dynamic lighting"
-msgstr ""
+msgstr "動的照明なし"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:193
 msgid "Enable corona flares around certain lights"
-msgstr ""
+msgstr "特定のライトの周りでコロナフレアを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:195
 msgid "Fake corona lighting"
-msgstr ""
+msgstr "偽のコロナ照明"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:196
 msgid ""
 "Enable faster but uglier dynamic lights by rendering bright coronas instead "
 "of real dynamic lights"
 msgstr ""
+"実際のダイナミックライトの代わりに明るいコロナをレンダリングすることで、より"
+"高速で醜いダイナミックライトを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:199
 msgid "Realtime dynamic lighting"
-msgstr ""
+msgstr "リアルタイムの動的照明"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:200
 msgid "Enable rendering of dynamic lights such as explosions and rocket lights"
-msgstr ""
+msgstr "爆発やロケットライトなどの動的ライトのレンダリングを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
 msgid "Shadows"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:203
 msgid "Enable rendering of shadows from dynamic lights"
-msgstr ""
+msgstr "動的ライトからの影のレンダリングを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:206
 msgid "Realtime world lighting"
-msgstr ""
+msgstr "リアルタイムの世界の照明"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:207
 msgid ""
 "Enable rendering of full realtime world lighting on maps that support it. "
 "Note that this might have a big impact on performance."
 msgstr ""
+"それをサポートするマップでフルリアルタイムのワールドライティングのレンダリン"
+"グを有効にする。これはパフォーマンスに大きな影響を与える可能性があることに注"
+"意してください。"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:209
 msgid "Enable rendering of shadows from realtime world lights"
-msgstr ""
+msgstr "リアルタイムのワールドライトからの影のレンダリングを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:213
 msgid "Use normal maps"
-msgstr ""
+msgstr "法線マップを使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:214
 msgid "Enable use of directional shading on textures"
-msgstr ""
+msgstr "テクスチャでの指向性シェーディングの使用を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:216
 msgid "Soft shadows"
-msgstr ""
+msgstr "滑らかな影"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
 msgid "Fade corona according to visibility"
-msgstr ""
+msgstr "可視性に応じてフェードコロナ"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:221
 msgid "Fade coronas according to visibility"
-msgstr ""
+msgstr "可視性に応じてフェードコロナ"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:225
 msgid "Bloom"
-msgstr ""
+msgstr "ブルーム"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:226
 msgid ""
 "Enable bloom effect, which brightens the neighboring pixels of very bright "
 "pixels. Has a big impact on performance."
 msgstr ""
+"非常に明るいピクセルの隣接ピクセルを明るくするブルームエフェクトを有効にす"
+"る。パフォーマンスに大きな影響を与えます。"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:227
 msgid "Extra postprocessing effects"
-msgstr ""
+msgstr "追加の後処理エフェクト"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:228
 msgid ""
 "Enables special postprocessing effects for when damaged or under water or "
 "using a powerup"
 msgstr ""
+"損傷した場合、水中、またはパワーアップを使用した場合の特殊な後処理エフェクト"
+"を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:233
 msgid "Motion blur strength - 0.4 recommended"
-msgstr ""
+msgstr "モーションブラーの強度 - 0.4を勧めす"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:234
 msgid "Motion blur:"
-msgstr ""
+msgstr "モーションブラー:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:240
 msgid "Particles"
-msgstr ""
+msgstr "パーティクル"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:241
 msgid "Spawnpoint effects"
-msgstr ""
+msgstr "現れるポイントエフェクト"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:242
 msgid "Particles effects at all spawn points and whenever a player spawns"
-msgstr ""
+msgstr "全ての現れるポイントで選手が現れるたびにパーティクルエフェクト"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:247
 msgid "Quality:"
-msgstr ""
+msgstr "品質:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:250
 #: qcsrc/menu/xonotic/slider_particles.qc:13
@@ -8108,10 +8152,12 @@ msgid ""
 "Multiplier for amount of particles. Less means less particles, which in turn "
 "gives for better performance"
 msgstr ""
+"パーティクルの量の乗数。少ないということは、パーティクルが少ないことを意味"
+"し、これによりパフォーマンスが向上します。"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.qc:257
 msgid "Particles further away than this will not be drawn"
-msgstr ""
+msgstr "これより遠いパーティクルは描画されません"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:31
 msgid "No crosshair"
@@ -8127,6 +8173,7 @@ msgid ""
 "Set a different crosshair for each weapon, good if you play without weapon "
 "models"
 msgstr ""
+"武器ごとに異なる十字線を設定する。武器モデルなしで遊ぶ場合に適しています"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
@@ -8140,19 +8187,19 @@ msgstr "健康で"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:76
 msgid "Use rings to indicate weapon status"
-msgstr ""
+msgstr "武器のステータスを示すためにリングを使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:93
 msgid "Enable center crosshair dot"
-msgstr ""
+msgstr "中央十字線ドットを有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:111
 msgid "Use normal crosshair color"
-msgstr ""
+msgstr "通常の十字線の色を使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:122
 msgid "Smooth effects of crosshairs"
-msgstr ""
+msgstr "十字線の滑らかなエフェクト"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:125
 msgid "Hit testing:"
@@ -8164,6 +8211,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 ""
+"なし: 十字線のヒットテストを行いません。真の照準: 銃とターゲットの間に障害物"
+"があるときに十字線をぼかす。敵:敵に当たったときに十字線を拡大する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
 msgid "HTTST^Disabled"
@@ -8179,23 +8228,23 @@ msgstr "敵"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:136
 msgid "Blur crosshair if the shot is obstructed"
-msgstr ""
+msgstr "ショットが遮られている場合は十字線をぼかす"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
 msgid "Enlarge crosshair if targeting an enemy"
-msgstr ""
+msgstr "敵を狙った場合は十字線を拡大する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:143
 msgid "Animate crosshair when hitting an enemy"
-msgstr ""
+msgstr "敵に当たったときに十字線をアニメーション化する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:146
 msgid "Animate crosshair when picking up an item"
-msgstr ""
+msgstr "アイテムを拾うときに十字線をアニメーション化する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qh:7
 msgid "Crosshair"
-msgstr ""
+msgstr "十字線"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
 msgid "Scoreboard"
@@ -8203,74 +8252,76 @@ msgstr "得点表"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
 msgid "Fading speed:"
-msgstr ""
+msgstr "フェージング速度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
 msgid "Enable rows / columns highlighting"
-msgstr ""
+msgstr "行 / 列の強調表示を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
 msgid "Show accuracy underneath scoreboard"
-msgstr ""
+msgstr "得点表の下に精度を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
 msgid "Show team sizes:"
-msgstr ""
+msgstr "チームのサイズを表示する:"
 
 #: 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 ""
+"チームサイズの位置: 無効 = 表示されない。左 = 得点表の左側にあり、チームの得"
+"点を右に移動する。右 = 得点表の右側"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
 msgid "Waypoints"
-msgstr ""
+msgstr "ウェイポイント"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
 msgid "Display waypoint markers for objectives on the map"
-msgstr ""
+msgstr "マップ上の目標のウェイポイントマーカーを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
 msgid "Show various gametype specific waypoints"
-msgstr ""
+msgstr "さまざまなゲームタイプ固有のウェイポイントを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
 msgid "Control transparency of the waypoints"
-msgstr ""
+msgstr "ウェイポイントの透明度のコントロール"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
 msgid "Fontsize:"
-msgstr ""
+msgstr "フォントサイズ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
 msgid "Edge offset:"
-msgstr ""
+msgstr "エッジオフセット:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
 msgid "Fade when near the crosshair"
-msgstr ""
+msgstr "十字線の近くでフェードする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
 msgid "Display names instead of icons"
-msgstr ""
+msgstr "アイコンの代わりに名前を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
 msgid "Damage"
-msgstr ""
+msgstr "ダメージ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
 msgid "Overlay:"
-msgstr ""
+msgstr "オーバーレイ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
 msgid "Factor:"
-msgstr ""
+msgstr "因子:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
 msgid "Fade rate:"
-msgstr ""
+msgstr "フェード率:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
 msgid "Player Names"
@@ -8278,11 +8329,11 @@ msgstr "選手名"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:120
 msgid "Show names above players"
-msgstr ""
+msgstr "選手の上に名前を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
 msgid "Max distance:"
-msgstr ""
+msgstr "最大距離:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
 msgid "Decolorize:"
@@ -8295,11 +8346,11 @@ msgstr "チームプレイ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:154
 msgid "Only when near crosshair"
-msgstr ""
+msgstr "十字線に近い場合のみ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
 msgid "Display health and armor"
-msgstr ""
+msgstr "健康と鎧を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
 msgid "Damage overlay:"
@@ -8311,11 +8362,11 @@ msgstr "ダイナミックHUD"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:167
 msgid "HUD moves around following player's movement"
-msgstr ""
+msgstr "HUDは選手の動きに従って動き回る"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:169
 msgid "Shake the HUD when hurt"
-msgstr ""
+msgstr "傷ついたときにHUDを振る"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:173
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qh:6
@@ -8328,35 +8379,35 @@ msgstr "HUD"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:21
 msgid "In order for the HUD editor to show, you must first be in game."
-msgstr ""
+msgstr "HUDエディターを表示するには、まずゲームに参加している必要があります。"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
 msgid "Do you wish to start a local game to set up the HUD?"
-msgstr ""
+msgstr "HUDを構成するローカルゲームを開始しますか?"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
 msgid "Frag Information"
-msgstr ""
+msgstr "削除情報"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:26
 msgid "Display information about killing sprees"
-msgstr ""
+msgstr "殺害に関する情報を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:29
 msgid "Only display sprees if they are achievements"
-msgstr ""
+msgstr "達成である場合のみ殺害を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:34
 msgid "Show spree information in centerprints"
-msgstr ""
+msgstr "センタープリントで殺害情報を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:38
 msgid "Show spree information in death messages"
-msgstr ""
+msgstr "死のメッセージに殺害情報を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:43
 msgid "Sprees in info messages:"
-msgstr ""
+msgstr "情報メッセージの殺害:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
 msgid "SPREES^Disabled"
@@ -8376,15 +8427,15 @@ msgstr "両"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:55
 msgid "Print on a seperate line"
-msgstr ""
+msgstr "別の行に印刷"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:58
 msgid "Add extra frag information to centerprint when available"
-msgstr ""
+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"
@@ -8392,11 +8443,11 @@ msgstr "ゲームモード設定"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:67
 msgid "Display capture times in Capture The Flag"
-msgstr ""
+msgstr "「キャプチャー・ザ・フラッグ」に取れた時間を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:71
 msgid "Display name of flag stealer in Capture The Flag"
-msgstr ""
+msgstr "「キャプチャー・ザ・フラッグ」に旗の強盗者の名を表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:76
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:92
@@ -8406,15 +8457,15 @@ msgstr "その他"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:78
 msgid "Display console messages in the top left corner"
-msgstr ""
+msgstr "左上隅にコンソールメッセージを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:80
 msgid "Display all info messages in the chatbox"
-msgstr ""
+msgstr "チャットボックスに全ての情報メッセージを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:82
 msgid "Display player statuses in the chatbox"
-msgstr ""
+msgstr "チャットボックスに選手のステータスを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:86
 msgid "Powerup notifications"
@@ -8422,11 +8473,11 @@ msgstr "パワーアップ通知"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:89
 msgid "Weapon centerprint notifications"
-msgstr ""
+msgstr "武器センタープリント通知"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:92
 msgid "Weapon info message notifications"
-msgstr ""
+msgstr "武器情報メッセージ通知"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:96
 msgid "Announcers"
@@ -8454,15 +8505,15 @@ msgstr "アイテム"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:32
 msgid "Use simple 2D images instead of item models"
-msgstr ""
+msgstr "アイテムモデルの代わりにシンプルな2D画像を使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
 msgid "Unavailable alpha:"
-msgstr ""
+msgstr "利用できないアルファ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:37
 msgid "Unavailable color:"
-msgstr ""
+msgstr "利用できない色:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:39
 msgid "GHOITEMS^Black"
@@ -8491,19 +8542,19 @@ msgstr "選手達"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
 msgid "Force player models to mine"
-msgstr ""
+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"
-msgstr ""
+msgstr "非チームプレイモードのみ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
 msgid "Body fading:"
-msgstr ""
+msgstr "体フェージング:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
 msgid "Gibs:"
@@ -8511,121 +8562,122 @@ msgstr "内臓:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
 msgid "GIBS^None"
-msgstr ""
+msgstr "なし"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:66
 msgid "GIBS^Few"
-msgstr ""
+msgstr "少ない"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:67
 msgid "GIBS^Many"
-msgstr ""
+msgstr "多い"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qc:68
 msgid "GIBS^Lots"
-msgstr ""
+msgstr "たくさん"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qh:7
 msgid "Models"
-msgstr ""
+msgstr "モデル"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_model.qh:8
 msgid "Customize how players and items are displayed in game"
-msgstr ""
+msgstr "ゲームでのプレーヤーとアイテムの表示方法をカスタマイズする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
 msgid "1st person perspective"
-msgstr ""
+msgstr "一人称視点"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
 msgid "Slide to third person upon death"
-msgstr ""
+msgstr "死後三人称視点に変更する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:33
 msgid "Smooth the view when landing from a jump"
-msgstr ""
+msgstr "ジャンプから着陸するときにビューを滑らかにする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:37
 msgid "Smooth the view while crouching"
-msgstr ""
+msgstr "しゃがみながらビューを滑らかにする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:41
 msgid "View waving while idle"
-msgstr ""
+msgstr "不活発に中にビューを振る"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:45
 msgid "View bobbing while walking around"
-msgstr ""
+msgstr "歩きながらビューをボビングする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:50
 msgid "3rd person perspective"
-msgstr ""
+msgstr "三人称視点"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:53
 msgid "Back distance"
-msgstr ""
+msgstr "後方距離"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:59
 msgid "Up distance"
-msgstr ""
+msgstr "上への距離"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:65
 msgid "Allow passing through walls while spectating"
-msgstr ""
+msgstr "観戦中に壁を通過できるようにする"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:69
 msgid "Field of view:"
-msgstr ""
+msgstr "視野:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:71
 msgid "Field of vision in degrees"
-msgstr ""
+msgstr "度単位の視野"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:75
 msgid "ZOOM^Zoom factor:"
-msgstr ""
+msgstr "ズーム因子:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:77
 msgid "How big the zoom factor is when the zoom button is pressed"
-msgstr ""
+msgstr "ズームボタンを押したときのズーム率頻度"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:80
 msgid "ZOOM^Zoom speed:"
-msgstr ""
+msgstr "ズーム速度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:82
 msgid "How fast the view will be zoomed, disable to zoom instantly"
-msgstr ""
+msgstr "ビューがズームされる速度頻度、無効にするとすぐにズームされる"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:91
 msgid "ZOOM^Instant"
-msgstr ""
+msgstr "瞬時"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:95
 msgid "ZOOM^Zoom sensitivity:"
-msgstr ""
+msgstr "ズーム感度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:97
 msgid ""
 "How zoom changes sensitivity, from 0 (lower sensitivity) to 1 (no "
 "sensitivity change)"
 msgstr ""
+"ズームが感度をどのように変更するか、0 (低い感度) から 1 (感度の変更なし)"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:100
 msgid "Velocity zoom"
-msgstr ""
+msgstr "速度ズーム"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:101
 msgid "Forward movement only"
-msgstr ""
+msgstr "前進のみ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:105
 msgid "VZOOM^Factor"
-msgstr ""
+msgstr "因子"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:112
 msgid "Display reticle 2D overlay while zooming"
-msgstr ""
+msgstr "ズーム中にレチクル2Dオーバーレイを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_view.qc:115
 msgid "Release zoom when you die or respawn"
@@ -8642,7 +8694,7 @@ msgstr "ビュー"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:33
 msgid "Weapon Priority List (* = mutator weapon)"
-msgstr ""
+msgstr "武器優先リスト (* = ミューテーター武器)"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:39
 msgid "Up"
@@ -8654,48 +8706,48 @@ msgstr "下"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:49
 msgid "Use priority list for weapon cycling"
-msgstr ""
+msgstr "武器のサイクリングに優先リストを使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:50
 msgid ""
 "Make use of the list above when cycling through weapons with the mouse wheel"
-msgstr ""
+msgstr "マウスホイールで武器をサイクリングするときは、上記のリストを使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:52
 msgid "Cycle through only usable weapon selections"
-msgstr ""
+msgstr "使用可能な武器の選択のみを循環する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:56
 msgid "Auto switch weapons on pickup"
-msgstr ""
+msgstr "拾ったときに自動的に武器を切り替える"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:57
 msgid ""
 "Automatically switch to newly picked up weapons if they are better than what "
 "you are carrying"
-msgstr ""
+msgstr "持っている武器よりも優れている場合は自動的に収集した武器に切り替える"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:60
 msgid "Release attack buttons when you switch weapons"
-msgstr ""
+msgstr "武器を切り替えるときに攻撃ボタンを解放する"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
 msgid "Draw 1st person weapon model"
-msgstr ""
+msgstr "一人称で武器モデルを描く"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
 msgid "Draw the weapon model"
-msgstr ""
+msgstr "武器モデルを描く"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:68
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:71
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:74
 msgid "Position of the weapon model; requires reconnect"
-msgstr ""
+msgstr "武器モデルの位置、接続が必要だ"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
 msgid "Weapon model opacity:"
-msgstr ""
+msgstr "武器モデルの不透明度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
 msgid "Gun model swaying"
@@ -8712,85 +8764,85 @@ msgstr "武器"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:34
 msgid "Key Bindings"
-msgstr ""
+msgstr "キー割り当て"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:38
 msgid "Change key..."
-msgstr ""
+msgstr "キーを変更する..."
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:42
 msgid "Edit..."
-msgstr ""
+msgstr "編集する..."
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:48
 msgid "Clear"
-msgstr ""
+msgstr "クリアする"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:53
 msgid "Reset all"
-msgstr ""
+msgstr "全てリセットする"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:58
 msgid "Mouse"
-msgstr ""
+msgstr "マウス"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:60
 msgid "Sensitivity:"
-msgstr ""
+msgstr "感度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:62
 msgid "Mouse speed multiplier"
-msgstr ""
+msgstr "マウス速度乗数"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:64
 msgid "Smooth aiming"
-msgstr ""
+msgstr "滑らかな照準"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:65
 msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
-msgstr ""
+msgstr "マウスの動きを滑らかにするが、照準は少し反応が遅くなる"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:67
 msgid "Invert aiming"
-msgstr ""
+msgstr "照準を反転する"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:68
 msgid "Invert mouse movement on the Y-axis"
-msgstr ""
+msgstr "Y-軸上のマウスの動きを反転する"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:70
 msgid "Use system mouse positioning"
-msgstr ""
+msgstr "システムのマウスの位置を使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:75
 msgid "Enable built in mouse acceleration"
-msgstr ""
+msgstr "組み込みのマウス加速を有効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:79
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:83
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:86
 msgid "Disable system mouse acceleration"
-msgstr ""
+msgstr "システムのマウス加速を無効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:80
 msgid "Make use of DGA mouse input"
-msgstr ""
+msgstr "DGAマウス入力を利用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:94
 msgid "Pressing \"enter console\" key also closes it"
-msgstr ""
+msgstr "「コンソールを入力する」キーを押すと、それも閉じる"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:95
 msgid "Allow the console toggling bind to also close the console"
-msgstr ""
+msgstr "コンソールのバインドの切り替えを許可して、コンソールも閉じる"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:97
 msgid "Automatically repeat jumping if holding jump"
-msgstr ""
+msgstr "ジャンプを押し続けると自動的にジャンプを繰り返す"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:100
 msgid "Jetpack on jump:"
-msgstr ""
+msgstr "ジャンプときのジェットパック:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:102
 msgid "JPJUMP^Disabled"
@@ -8798,33 +8850,33 @@ msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:103
 msgid "Air only"
-msgstr ""
+msgstr "空気のみ"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:104
 msgid "JPJUMP^All"
-msgstr ""
+msgstr "全て"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:110
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:115
 #: qcsrc/menu/xonotic/dialog_settings_input.qc:120
 msgid "Use joystick input"
-msgstr ""
+msgstr "ジョイスティック入力を使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
 msgid "Command when pressed:"
-msgstr ""
+msgstr "押されたときのコマンド:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
 msgid "Command when released:"
-msgstr ""
+msgstr "解放された時のコマンド:"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
 msgid "Cancel"
-msgstr ""
+msgstr "キャンセルする"
 
 #: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
 msgid "User defined key bind"
-msgstr ""
+msgstr "ユーザー定義のキー割り当て"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
 #, c-format
@@ -8834,36 +8886,36 @@ msgstr "%d fps"
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
 #, c-format
 msgid "%d KB/s"
-msgstr ""
+msgstr "%d KB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
 #, c-format
 msgid "%d MB/s"
-msgstr ""
+msgstr "%d MB/s"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
 msgid "Network"
-msgstr ""
+msgstr "ネットワーク"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
 msgid "Client UDP port:"
-msgstr ""
+msgstr "クライアントUDPポート:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
 msgid "Force client to use chosen port unless it is set to 0"
-msgstr ""
+msgstr "0に設定されていない限り、選択したポートをクライアントに強制的する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
 msgid "Bandwidth:"
-msgstr ""
+msgstr "バンド幅:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
 msgid "Specify your network speed"
-msgstr ""
+msgstr "ネットワーク速度を指定する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
 msgid "56k"
-msgstr ""
+msgstr "56k"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
 msgid "ISDN"
@@ -8871,71 +8923,71 @@ msgstr "ISDN"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
 msgid "Slow ADSL"
-msgstr ""
+msgstr "遅いADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
 msgid "Fast ADSL"
-msgstr ""
+msgstr "速いADSL"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
 msgid "Broadband"
-msgstr ""
+msgstr "ブロードバンド"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:44
 msgid "Server queries/s:"
-msgstr ""
+msgstr "サーバークエリ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:48
 msgid "Downloads:"
-msgstr ""
+msgstr "ダウンロード:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:50
 msgid "Maximum number of concurrent HTTP/FTP downloads"
-msgstr ""
+msgstr "同時HTTP / FTPダウンロードの最大数"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
 msgid "Download speed:"
-msgstr ""
+msgstr "ダウンロード速度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:65
 msgid "Local latency:"
-msgstr ""
+msgstr "ローカルレイテンシ:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
 msgid "Show netgraph"
-msgstr ""
+msgstr "ネットグラフを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:70
 msgid "Show a graph of packet sizes and other information"
-msgstr ""
+msgstr "パケットサイズとその他の情報のグラフを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:72
 msgid "Client-side movement prediction"
-msgstr ""
+msgstr "クライアント側の動き予測"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:74
 msgid "Movement error compensation"
-msgstr ""
+msgstr "エラー補償の動き"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:78
 msgid "Use encryption (AES) when available"
-msgstr ""
+msgstr "可能な場合は暗号化(AES)を使用する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:81
 msgid "Framerate"
-msgstr ""
+msgstr "フレームレート"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:83
 msgid "Maximum:"
-msgstr ""
+msgstr "最大:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:93
 msgid "MAXFPS^Unlimited"
-msgstr ""
+msgstr "無制限"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:96
 msgid "Target:"
-msgstr ""
+msgstr "目的:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:98
 msgid "TRGT^Disabled"
@@ -8943,23 +8995,23 @@ msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:109
 msgid "Idle limit:"
-msgstr ""
+msgstr "不活発の制限:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:115
 msgid "IDLFPS^Unlimited"
-msgstr ""
+msgstr "無制限"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:119
 msgid "Save processing time for other apps"
-msgstr ""
+msgstr "他のアプリの処理時間を保存する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
 msgid "Show frames per second"
-msgstr ""
+msgstr "FPSを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:123
 msgid "Show your rendered frames per second"
-msgstr ""
+msgstr "レンダリングしたFPSを表示する"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:128
 msgid "Menu tooltips:"
@@ -8970,6 +9022,8 @@ msgid ""
 "Menu tooltips: disabled, standard or advanced (also shows cvar or console "
 "command bound to the menu item)"
 msgstr ""
+"メニューツールチップ: 無効、標準、高度 (メニュー項目にバインドされた cvar コ"
+"マンドまたはコンソールコマンドも表示する)"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:131
 msgid "TLTIP^Disabled"
@@ -9001,7 +9055,7 @@ msgstr "高度な設定..."
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:145
 msgid "Advanced settings where you can tweak every single variable of the game"
-msgstr ""
+msgstr "各ゲーム変数を調整できる詳細設定"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.qc:150
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
@@ -9010,11 +9064,11 @@ msgstr "工場リセット"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
 msgid "Cvar filter:"
-msgstr "CVARフィルター:"
+msgstr "cvarフィルター:"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
 msgid "Modified cvars only"
-msgstr ""
+msgstr "変更されたcvarのみ"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
 msgid "Setting:"
@@ -9042,7 +9096,7 @@ msgstr "全ての設定をリセットしてもよろしいですか?"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
 msgid "This will create a backup config in your data directory"
-msgstr ""
+msgstr "これによりデータディレクトリにバックアップ構成が作成されます"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:23
 msgid "Menu Skins"
@@ -9054,31 +9108,31 @@ msgstr "テキスト言語"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:67
 msgid "Set language"
-msgstr "言語を設定"
+msgstr "言語を設定する"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:72
 msgid "Disable gore effects and harsh language"
-msgstr ""
+msgstr "流血の効果と攻撃的な言葉を無効にする"
 
 #: qcsrc/menu/xonotic/dialog_settings_user.qc:73
 msgid "Replace blood and gibs with content that does not have any gore effects"
-msgstr ""
+msgstr "血と内臓を流血の効果コンテンツに置き換える"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
 msgid "While connected language changes will be applied only to the menu,"
-msgstr ""
+msgstr "接続されている言語の変更はメニューにのみ適用されますが、"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
 msgid "full language changes will take effect starting from the next game"
-msgstr ""
+msgstr "完全な言語の変更は次のゲームから有効になります"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
 msgid "Disconnect now"
-msgstr "今すぐ切断"
+msgstr "今すぐ切断する"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
 msgid "Switch language"
-msgstr "言語を変更"
+msgstr "言語を変更する"
 
 #: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qh:6
 msgid "Warning"
@@ -9134,7 +9188,7 @@ msgstr "色深度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:53
 msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
-msgstr ""
+msgstr "レンダリングするピクセルあたりのビット数 (BPP)、32を勧めす"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:54
 msgid "16bit"
@@ -9150,29 +9204,31 @@ msgstr "フルスケ"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:61
 msgid "Vertical Synchronization"
-msgstr ""
+msgstr "垂直同期"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:62
 msgid ""
 "Enable vertical synchronization to prevent tearing, will cap your fps to the "
 "screen refresh rate"
 msgstr ""
+"垂直同期を有効にしてティアリングを防止し、fpsを画面のリフレッシュレートに制限"
+"する"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:67
 msgid "Flip view horizontally"
-msgstr ""
+msgstr "ビューを水平に反転する"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:68
 msgid "Poor man's left handed mode"
-msgstr ""
+msgstr "左利きモード"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:71
 msgid "Anisotropy:"
-msgstr ""
+msgstr "異方性:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:73
 msgid "Anisotropic filtering quality"
-msgstr ""
+msgstr "異方性フィルタリング品質"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:74
 msgid "ANISO^Disabled"
@@ -9198,13 +9254,15 @@ msgstr "16x"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:81
 msgid "Antialiasing:"
-msgstr ""
+msgstr "アンチエイリアシング:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:84
 msgid ""
 "Enable antialiasing, which smooths the edges of 3D geometry. Note that it "
 "might decrease performance by quite a lot"
 msgstr ""
+"3Dジオメトリのエッジを滑らかにするアンチエイリアスを有効にする。パフォーマン"
+"スが大幅に低下する可能性があることに注意してください"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:85
 msgid "AA^Disabled"
@@ -9212,17 +9270,19 @@ msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:92
 msgid "High-quality frame buffer"
-msgstr ""
+msgstr "高品質のフレームバッファ"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:97
 msgid "Depth first:"
-msgstr ""
+msgstr "深さ優先:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:99
 msgid ""
 "Eliminate overdraw by rendering a depth-only version of the scene before the "
 "normal rendering starts"
 msgstr ""
+"通常のレンダリングが開始する前に、深度のみのバージョンのシーンをレンダリング"
+"することにより、オーバードローを排除する"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:100
 msgid "DF^Disabled"
@@ -9242,7 +9302,7 @@ msgstr "頂点バッファーオブジェクト (VBOs)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:108
 msgid "VBO^Off"
-msgstr ""
+msgstr "無効"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:109
 msgid "Vertices, some Tris (compatible)"
@@ -9255,6 +9315,8 @@ msgid ""
 "Make use of Vertex Buffer Objects to store static geometry in video memory "
 "for faster rendering"
 msgstr ""
+"頂点バッファオブジェクトを使用して、静的ジオメトリをビデオメモリに格納し、レ"
+"ンダリングを高速化する"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:113
 msgid "Vertices"
@@ -9288,7 +9350,7 @@ msgstr "ガンマ:"
 msgid ""
 "Inverse gamma correction value, a brightness effect that does not affect "
 "white or black"
-msgstr ""
+msgstr "逆ガンマ補正値、白または黒に影響を与えない輝度効果"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:133
 msgid "Contrast boost:"
@@ -9296,17 +9358,19 @@ msgstr "コントラストの増加:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:136
 msgid "By how much to multiply the contrast in dark areas"
-msgstr ""
+msgstr "暗い部分のコントラストをどれだけ掛けるか"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:139
 msgid "Saturation:"
-msgstr "飽和:"
+msgstr "彩度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:142
 msgid ""
 "Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
 "requires GLSL color control"
 msgstr ""
+"彩度調整 (0 = グレースケール、1 = 通常、2 = 過飽和)、GLSLカラーコントロールが"
+"必要する"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:146
 msgid "LIT^Ambient:"
@@ -9317,6 +9381,8 @@ msgid ""
 "Ambient lighting, if set too high it tends to make light on maps look dull "
 "and flat"
 msgstr ""
+"アンビエント照明、設定が高すぎると、マップ上のライトが鈍く平坦に見える傾向が"
+"ある"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:150
 msgid "Intensity:"
@@ -9324,17 +9390,19 @@ msgstr "強度:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:152
 msgid "Global rendering brightness"
-msgstr ""
+msgstr "グローバルレンダリングの明るさ"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:155
 msgid "Wait for GPU to finish each frame"
-msgstr ""
+msgstr "GPUが各フレームを完了するまで待つ"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:156
 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 ""
+"GPUが各フレームを完了するまでCPUを待機させる。一部のマシンでは奇妙な入力やビ"
+"デオの遅延に役立つ。"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:158
 msgid "Use OpenGL 2.0 shaders (GLSL)"
@@ -9342,15 +9410,15 @@ msgstr "OpenGL 2.0 シェーダー(GLSL)を使う"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:163
 msgid "Psycho coloring (easter egg)"
-msgstr ""
+msgstr "サイコカラーズ (イースターエッグ)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.qc:166
 msgid "Trippy vertices (easter egg)"
-msgstr ""
+msgstr "幻覚の頂点 (イースターエッグ)"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:109
 msgid "Instant action! (random map with bots)"
-msgstr ""
+msgstr "インスタントアクション! (ボット付きランダムマップ)"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer.qc:116
 msgid "???"
@@ -9383,6 +9451,8 @@ msgstr "シングルプレイヤー"
 #: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
 msgid "Play the singleplayer campaign or instant action matches against bots"
 msgstr ""
+"ボットに対してシングルプレイヤーキャンペーンまたはインスタントアクションマッ"
+"チを遊ぶ"
 
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
 msgid "Winner"
@@ -9390,11 +9460,11 @@ msgstr "勝者"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:32
 msgid "join 'best' team (auto-select)"
-msgstr ""
+msgstr "「最高」チームに参加する (自動選択)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:33
 msgid "Autoselect team (recommended)"
-msgstr ""
+msgstr "チームの自動選択する (推奨)"
 
 #: qcsrc/menu/xonotic/dialog_teamselect.qc:37
 msgid "red"
@@ -9423,11 +9493,11 @@ msgstr "チームの選択"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:10
 msgid "Allow player statistics to use your nickname?"
-msgstr ""
+msgstr "選手の統計であなたのニックネームを使用できるように許可しますか?"
 
 #: qcsrc/menu/xonotic/dialog_uid2name.qc:12
 msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr ""
+msgstr "「いいえ」と答えると、 \"Anonymous player\" として表示される"
 
 #: qcsrc/menu/xonotic/gametypelist.qc:87
 msgid "teamplay"
@@ -9447,27 +9517,27 @@ msgstr "前方"
 
 #: qcsrc/menu/xonotic/keybinder.qc:37
 msgid "backpedal"
-msgstr ""
+msgstr "後方"
 
 #: qcsrc/menu/xonotic/keybinder.qc:38
 msgid "strafe left"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:39
 msgid "strafe right"
-msgstr ""
+msgstr ""
 
 #: qcsrc/menu/xonotic/keybinder.qc:40
 msgid "jump / swim"
-msgstr ""
+msgstr "ジャンプする / 泳ぐ"
 
 #: qcsrc/menu/xonotic/keybinder.qc:41
 msgid "crouch / sink"
-msgstr ""
+msgstr "しゃがむ / 降りる"
 
 #: qcsrc/menu/xonotic/keybinder.qc:42
 msgid "off-hand hook"
-msgstr ""
+msgstr "フック"
 
 #: qcsrc/menu/xonotic/keybinder.qc:43
 msgid "jetpack"
@@ -9495,35 +9565,35 @@ msgstr "最高"
 
 #: qcsrc/menu/xonotic/keybinder.qc:56
 msgid "reload"
-msgstr "リロード"
+msgstr "リロードする"
 
 #: qcsrc/menu/xonotic/keybinder.qc:57
 msgid "drop weapon / throw nade"
-msgstr ""
+msgstr "武器を落とす / 手榴弾を投げる"
 
 #: qcsrc/menu/xonotic/keybinder.qc:84
 msgid "hold zoom"
-msgstr ""
+msgstr "ズームを維持する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:85
 msgid "toggle zoom"
-msgstr ""
+msgstr "ズームを切り替える"
 
 #: qcsrc/menu/xonotic/keybinder.qc:86
 msgid "show scores"
-msgstr ""
+msgstr "得点を表示する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:87
 msgid "screen shot"
-msgstr ""
+msgstr "スクリーンショット"
 
 #: qcsrc/menu/xonotic/keybinder.qc:88
 msgid "maximize radar"
-msgstr ""
+msgstr "レーダーを最大化する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:89
 msgid "3rd person view"
-msgstr ""
+msgstr "三人称ビュー"
 
 #: qcsrc/menu/xonotic/keybinder.qc:90
 msgid "enter spectator mode"
@@ -9543,15 +9613,15 @@ msgstr "チームチャット"
 
 #: qcsrc/menu/xonotic/keybinder.qc:96
 msgid "show chat history"
-msgstr ""
+msgstr "チャットの履歴を表示する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:97
 msgid "vote YES"
-msgstr ""
+msgstr "「はい」を投票する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:98
 msgid "vote NO"
-msgstr ""
+msgstr "「いいえ」を投票する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:102
 msgid "Client"
@@ -9559,23 +9629,23 @@ msgstr "クライアント"
 
 #: qcsrc/menu/xonotic/keybinder.qc:106 qcsrc/menu/xonotic/keybinder.qc:108
 msgid "enter console"
-msgstr ""
+msgstr "コンソールを入力する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:109
 msgid "disconnect"
-msgstr "切断"
+msgstr "切断する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:110
 msgid "quit"
-msgstr ""
+msgstr "ゲームをやめる"
 
 #: qcsrc/menu/xonotic/keybinder.qc:114
 msgid "auto-join team"
-msgstr ""
+msgstr "自動的にチームに参加する"
 
 #: qcsrc/menu/xonotic/keybinder.qc:120
 msgid "drop key/flag, exit vehicle"
-msgstr ""
+msgstr "鍵/旗を落とす / 乗り物から降りる"
 
 #: qcsrc/menu/xonotic/keybinder.qc:121
 msgid "suicide / respawn"
@@ -9583,11 +9653,11 @@ msgstr "自殺する / 再び現れる"
 
 #: qcsrc/menu/xonotic/keybinder.qc:122
 msgid "quick menu"
-msgstr ""
+msgstr "クイックメニュー"
 
 #: qcsrc/menu/xonotic/keybinder.qc:125
 msgid "User defined"
-msgstr ""
+msgstr "ユーザー定義"
 
 #: qcsrc/menu/xonotic/keybinder.qc:132
 msgid "Development"
@@ -9595,24 +9665,26 @@ msgstr "開発"
 
 #: qcsrc/menu/xonotic/keybinder.qc:133
 msgid "sandbox menu"
-msgstr ""
+msgstr "サンドボックスメニュー"
 
 #: qcsrc/menu/xonotic/keybinder.qc:134
 msgid "drag object (sandbox)"
-msgstr ""
+msgstr "オブジェクトをドラッグ (サンドボックス)"
 
 #: qcsrc/menu/xonotic/keybinder.qc:135
 msgid "waypoint editor menu"
-msgstr ""
+msgstr "ウェイポイント編集メニュー"
 
 #: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
 msgid "Do not press this button again!"
-msgstr ""
+msgstr "もう一度このボタンを押さないでください!"
 
 #: qcsrc/menu/xonotic/maplist.qc:288
 msgid ""
 "Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
 msgstr ""
+"あれ? これを遊べません (m is NULL)。これが再度発生しないように再フィルタリン"
+"グします。"
 
 #: qcsrc/menu/xonotic/maplist.qc:296
 #, c-format
@@ -9624,6 +9696,8 @@ msgid ""
 "Huh? Can't play this (invalid game type). Refiltering so this won't happen "
 "again."
 msgstr ""
+"あれ? これを遊べません (invalid game type)。これが再度発生しないように再フィ"
+"ルタリングします。"
 
 #: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
 msgid "spectator"
@@ -9639,7 +9713,7 @@ msgstr "好きなサーバーを取り除く"
 
 #: qcsrc/menu/xonotic/serverlist.qc:257
 msgid "Remove the currently highlighted server from bookmarks"
-msgstr ""
+msgstr "現在ハイライト表示されているサーバーをブックマークから削除する"
 
 #: qcsrc/menu/xonotic/serverlist.qc:261
 msgid "SERVER^Favorite"
@@ -9650,6 +9724,7 @@ msgid ""
 "Bookmark the currently highlighted server so that it's faster to find in the "
 "future"
 msgstr ""
+"現在ハイライトされているサーバーにブックマークを付けて、未来見つけやすくする"
 
 #: qcsrc/menu/xonotic/serverlist.qc:733
 msgid "Ping"
@@ -9705,19 +9780,19 @@ msgstr "有効な状態"
 
 #: qcsrc/menu/xonotic/serverlist.qh:152
 msgid "SLCAT^Favorites"
-msgstr "SLCAT^好き"
+msgstr "好き"
 
 #: qcsrc/menu/xonotic/serverlist.qh:153
 msgid "SLCAT^Recommended"
-msgstr "SLCAT^推奨"
+msgstr "推奨"
 
 #: qcsrc/menu/xonotic/serverlist.qh:154
 msgid "SLCAT^Normal Servers"
-msgstr "SLCAT^通常のサーバー"
+msgstr "通常のサーバー"
 
 #: qcsrc/menu/xonotic/serverlist.qh:155
 msgid "SLCAT^Servers"
-msgstr "SLCAT^サーバー"
+msgstr "サーバー"
 
 #: qcsrc/menu/xonotic/serverlist.qh:156
 msgid "SLCAT^Competitive Mode"
@@ -9725,19 +9800,19 @@ msgstr "SLCAT^競争モード"
 
 #: qcsrc/menu/xonotic/serverlist.qh:157
 msgid "SLCAT^Modified Servers"
-msgstr "SLCAT^変更されたサーバー"
+msgstr "変更されたサーバー"
 
 #: qcsrc/menu/xonotic/serverlist.qh:158
 msgid "SLCAT^Overkill"
-msgstr "SLCAT^オーバーキル"
+msgstr "オーバーキル"
 
 #: qcsrc/menu/xonotic/serverlist.qh:159
 msgid "SLCAT^InstaGib"
-msgstr "SLCAT^インスタギブ"
+msgstr "インスタギブ"
 
 #: qcsrc/menu/xonotic/serverlist.qh:160
 msgid "SLCAT^Defrag Mode"
-msgstr "SLCAT^デフラグモード"
+msgstr "デフラグモード"
 
 #: qcsrc/menu/xonotic/skinlist.qc:70
 msgid "<TITLE>"
@@ -9794,22 +9869,24 @@ msgid ""
 "Change the sharpness of the textures. Lowering it will effectively reduce "
 "texture memory usage, but make the textures appear very blurry."
 msgstr ""
+"テクスチャのシャープネスを変更します。これを下げると、テクスチャのメモリ使用"
+"量がエフェクト的に減少しますが、テクスチャが非常にぼやけて見えます。"
 
 #: qcsrc/menu/xonotic/slider_resolution.qc:115
 msgid "Screen resolution"
-msgstr ""
+msgstr "画面の解像度"
 
 #: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
 msgid "PART^Slow"
-msgstr ""
+msgstr "遅い"
 
 #: qcsrc/menu/xonotic/slider_sbfadetime.qc:15
 msgid "PART^Fast"
-msgstr ""
+msgstr "速い"
 
 #: qcsrc/menu/xonotic/slider_sbfadetime.qc:16
 msgid "PART^Instant"
-msgstr ""
+msgstr "瞬時"
 
 #: qcsrc/menu/xonotic/statslist.qc:29
 msgid "January"
@@ -9899,12 +9976,12 @@ msgstr "勝利率:"
 #: qcsrc/menu/xonotic/statslist.qc:167
 #, c-format
 msgid "Kills/Deaths:"
-msgstr "殺された者 / 死者"
+msgstr "キル数 / デス数:"
 
 #: qcsrc/menu/xonotic/statslist.qc:173
 #, c-format
 msgid "Kill ratio:"
-msgstr "殺害率"
+msgstr "キル率:"
 
 #: qcsrc/menu/xonotic/statslist.qc:208
 msgid "ELO:"
@@ -9912,35 +9989,37 @@ msgstr "ELO:"
 
 #: qcsrc/menu/xonotic/statslist.qc:215
 msgid "Rank:"
-msgstr ""
+msgstr "ランク:"
 
 #: qcsrc/menu/xonotic/statslist.qc:222
 msgid "Percentile:"
-msgstr ""
+msgstr "パーセンタイル:"
 
 #: qcsrc/menu/xonotic/statslist.qc:247
 #, c-format
 msgid "%d (unranked)"
-msgstr ""
+msgstr "%d (ランクなし)"
 
 #: qcsrc/menu/xonotic/util.qc:420
 msgid "Update can be downloaded at:"
-msgstr ""
+msgstr "更新はここからダウンロードできます:"
 
 #: qcsrc/menu/xonotic/util.qc:528
 msgid "Autogenerating mapinfo for newly added maps..."
-msgstr ""
+msgstr "新しく追加されたマップの mapinfo を自動生成している..."
 
 #: qcsrc/menu/xonotic/util.qc:566
 #, c-format
 msgid "Update to %s now!"
-msgstr ""
+msgstr "今すぐ %s に更新している!"
 
 #: qcsrc/menu/xonotic/util.qc:650
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems."
 msgstr ""
+"^1ERROR: テクスチャ圧縮が必要ですが、サポートされていません。\n"
+"^1視覚的な問題が予想されます。"
 
 #: qcsrc/menu/xonotic/util.qc:780
 msgid "Use default"
index 080354107d4087b87427f7e03870212cb376ae9c..ec6eaa06537d5e11adebba25f130a7fce08d147e 100644 (file)
@@ -10,7 +10,7 @@
 # Liang Liu <dxkliu@126.com>, 2019
 # Losier Blackheath <losier.cc@gmail.com>, 2018
 # sapphireliu <balancedliu@gmail.com>, 2014
-# 杜茂森 <dumaosen_main01@outlook.com>, 2018-2019
+# 杜茂森 <dumaosen_main01@outlook.com>, 2018-2020
 # 杜茂森 <dumaosen_main01@outlook.com>, 2018
 # 韬 刘 <jiegushijia@gmail.com>, 2019
 msgid ""
@@ -18,8 +18,8 @@ msgstr ""
 "Project-Id-Version: Xonotic\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2020-06-07 07:23+0200\n"
-"PO-Revision-Date: 2020-06-07 05:23+0000\n"
-"Last-Translator: divVerent <divVerent@xonotic.org>\n"
+"PO-Revision-Date: 2020-07-25 11:27+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"
@@ -796,7 +796,7 @@ msgstr ""
 
 #: qcsrc/client/hud/panel/scoreboard.qc:136
 msgid "Player rank"
-msgstr ""
+msgstr "玩家排名"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:136
 msgid "SCO^rank"
@@ -820,7 +820,7 @@ msgstr "SCO^重生数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:139
 msgid "Number of rounds won"
-msgstr ""
+msgstr "赢得场数"
 
 #: qcsrc/client/hud/panel/scoreboard.qc:139
 msgid "SCO^rounds won"
@@ -1202,23 +1202,23 @@ msgstr "偷球者"
 
 #: qcsrc/common/items/item/ammo.qh:66
 msgid "bullets"
-msgstr ""
+msgstr "子弹"
 
 #: qcsrc/common/items/item/ammo.qh:96
 msgid "cells"
-msgstr ""
+msgstr "细胞"
 
 #: qcsrc/common/items/item/ammo.qh:126
 msgid "plasma"
-msgstr ""
+msgstr "等离子"
 
 #: qcsrc/common/items/item/ammo.qh:156
 msgid "rockets"
-msgstr ""
+msgstr "火箭"
 
 #: qcsrc/common/items/item/ammo.qh:190
 msgid "shells"
-msgstr ""
+msgstr "装甲"
 
 #: qcsrc/common/items/item/armor.qh:42
 msgid "Small armor"
@@ -1256,11 +1256,11 @@ msgstr "超级血包"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:215
 msgid "Jetpack"
-msgstr ""
+msgstr "火箭包"
 
 #: qcsrc/common/items/item/jetpack.qh:71
 msgid "fuel"
-msgstr ""
+msgstr "燃料"
 
 #: qcsrc/common/items/item/jetpack.qh:96
 msgid "Fuel regenerator"
@@ -1504,7 +1504,7 @@ msgstr ""
 
 #: qcsrc/common/minigames/minigame/bd.qc:2
 msgid "Bulldozer"
-msgstr ""
+msgstr "推土机"
 
 #: qcsrc/common/minigames/minigame/bd.qc:1092
 #: qcsrc/common/minigames/minigame/ps.qc:421
@@ -1700,7 +1700,7 @@ msgstr ""
 
 #: qcsrc/common/minigames/minigame/ttt.qc:2
 msgid "Tic Tac Toe"
-msgstr ""
+msgstr "井字棋"
 
 #: qcsrc/common/minigames/minigame/ttt.qc:672
 msgid "Single Player"
@@ -1860,11 +1860,11 @@ msgstr ""
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:26
 msgid "Ice grenade"
-msgstr ""
+msgstr "冰榴弹"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:34
 msgid "Translocate grenade"
-msgstr ""
+msgstr "穿越榴弹"
 
 #: qcsrc/common/mutators/mutator/nades/nades.inc:42
 msgid "Spawn grenade"
index b1631b2333f56e6ba6ad1d9290fd89f0f77cddb8..98b6b1a9051c2c13917e46a6748b10263f130b2a 100644 (file)
@@ -2,8 +2,8 @@
 //  Master config for core game modes
 // ===================================
 
-// global gametype setting (0 = deathmatch)
-set gamecfg 0
+// global gametype setting (uses gametype shortname, default gametype is deathmatch)
+set gamecfg "dm"
 
 
 // =================
index 6e56e0d6b9cabece3b603ffc1e7b0a9f2ca8251e..820c46d2d0c39c7ce4046b9e97e0bbb450b6cf0e 100644 (file)
@@ -14,7 +14,6 @@ pt    "Portuguese" "Português" 84%
 pt_BR "Portuguese (Brazil)" "Português (Brasil)" 99%
 ro    "Romanian" "Romana" 74%
 fi    "Finnish" "Suomi" 100%
-ja_JP "ja_JP" "ja_JP" 74%
 el    "Greek" "Ελληνική" 47%
 be    "Belarusian" "Беларуская" 54%
 bg    "Bulgarian" "Български" 59%
@@ -23,4 +22,5 @@ sr    "Serbian" "Српски" 64%
 uk    "Ukrainian" "Українська" 50%
 zh_CN "Chinese (China)" "中文" 57%
 zh_TW "Chinese (Taiwan)" "國語" 61%
+ja_JP "Japanese" "日本語" 100%
 ko    "Korean" "한국의" 29%
index 41f0706ea3d72f95c1d2b4180c3a27d5dd6232ad..10f2f8b03049f4ba921c48f5465322b6eeff41a3 100644 (file)
@@ -20,6 +20,7 @@ seta notification_ANNCE_ACHIEVEMENT_ELECTROBITCH "2" "0 = disabled, 1 = enabled
 seta notification_ANNCE_ACHIEVEMENT_IMPRESSIVE "1" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_ACHIEVEMENT_YODA "1" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_BEGIN "2" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
+seta notification_ANNCE_HEADSHOT "2" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_INSTAGIB_LASTSECOND "1" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_INSTAGIB_NARROWLY "1" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
 seta notification_ANNCE_INSTAGIB_TERMINATED "1" "0 = disabled, 1 = enabled if gentle mode is off, 2 = always enabled"
index 363465dfb77ff4723ac42c4a258c9864dae0d9b2..83897dfd3f250541e3f2d56e67f9cf391698faa2 100644 (file)
@@ -4,7 +4,6 @@
 #include <client/miscfunctions.qh>
 
 #include <common/ent_cs.qh>
-#include <common/mapinfo.qh>
 
 // Info messages (#14)
 
@@ -122,22 +121,15 @@ void HUD_InfoMessages()
                                InfoMessage(s);
                        }
 
-                       MUTATOR_CALLHOOK(DrawInfoMessages, pos, mySize);
+                       bool mutator_returnvalue = MUTATOR_CALLHOOK(DrawInfoMessages, pos, mySize, img_curr_group);
+                       pos = M_ARGV(0, vector);
+                       img_curr_group = M_ARGV(2, int);
 
-                       if(!warmup_stage && ISGAMETYPE(LMS))
+                       if(!mutator_returnvalue)
                        {
-                               entity sk;
-                               sk = playerslots[player_localnum];
-                               if(sk.(scores(ps_primary)) >= 666)
-                                       s = _("^1Match has already begun");
-                               else if(sk.(scores(ps_primary)) > 0)
-                                       s = _("^1You have no more lives left");
-                               else
-                                       s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey(_("jump"), "+jump"));
-                       }
-                       else
                                s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey(_("jump"), "+jump"));
-                       InfoMessage(s);
+                               InfoMessage(s);
+                       }
                }
 
                if (time < STAT(GAMESTARTTIME))
index 0a8b8cf5ed18f8d6815c02a194130fd37b15e5a6..17ea987bf6c3cd9b03e13338d0e3940f296bd46d 100644 (file)
 #include <common/ent_cs.qh>
 #include <common/scores.qh>
 #include <common/gamemodes/_mod.qh>
+#include <common/gamemodes/gamemode/ctf/cl_ctf.qh>
 
 // Mod icons (#10)
 
 void HUD_ModIcons_Export(int fh)
 {
        // allow saving cvars that aesthetically change the panel into hud skin files
-       HUD_Write_Cvar("hud_panel_modicons_ca_layout");
-       HUD_Write_Cvar("hud_panel_modicons_dom_layout");
-       HUD_Write_Cvar("hud_panel_modicons_freezetag_layout");
-}
-
-void DrawCAItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
-{
-       TC(int, layout); TC(int, i);
-       int stat = -1;
-       string pic = "";
-       vector color = '0 0 0';
-       switch(i)
-       {
-               case 0: stat = STAT(REDALIVE); pic = "player_red"; color = '1 0 0'; break;
-               case 1: stat = STAT(BLUEALIVE); pic = "player_blue"; color = '0 0 1'; break;
-               case 2: stat = STAT(YELLOWALIVE); pic = "player_yellow"; color = '1 1 0'; break;
-               default:
-               case 3: stat = STAT(PINKALIVE); pic = "player_pink"; color = '1 0 1'; break;
-       }
-
-       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)
-       {
-               drawpic_aspect_skin(myPos, pic, vec2(0.5 * mySize.x, mySize.y), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-               drawstring_aspect(myPos + eX * 0.5 * mySize.x, ftos(stat), vec2(0.5 * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
-       }
-       else
-               drawstring_aspect(myPos, ftos(stat), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
-}
-
-// Clan Arena and Freeze Tag HUD modicons
-void HUD_Mod_CA(vector myPos, vector mySize)
-{
-       mod_active = 1; // required in each mod function that always shows something
-
-       int layout;
-       if(ISGAMETYPE(CA))
-               layout = autocvar_hud_panel_modicons_ca_layout;
-       else //if(ISGAMETYPE(FREEZETAG))
-               layout = autocvar_hud_panel_modicons_freezetag_layout;
-       int rows, columns;
-       float aspect_ratio;
-       aspect_ratio = (layout) ? 2 : 1;
-       rows = HUD_GetRowCount(team_count, mySize, aspect_ratio);
-       columns = ceil(team_count/rows);
-
-       int i;
-       float row = 0, column = 0;
-       vector pos = '0 0 0', itemSize;
-       itemSize = vec2(mySize.x / columns, mySize.y / rows);
-       for(i=0; i<team_count; ++i)
-       {
-               pos.x = myPos.x + column * itemSize.x;
-               pos.y = myPos.y + row * itemSize.y;
-
-               DrawCAItem(pos, itemSize, aspect_ratio, layout, i);
-
-               ++row;
-               if(row >= rows)
-               {
-                       row = 0;
-                       ++column;
-               }
-       }
-}
-
-// Race/CTS HUD mod icons
-float crecordtime_prev; // last remembered crecordtime
-float crecordtime_change_time; // time when crecordtime last changed
-float srecordtime_prev; // last remembered srecordtime
-float srecordtime_change_time; // time when srecordtime last changed
-
-float race_status_time;
-int race_status_prev;
-string race_status_name_prev;
-
-// Check if the given name already exist in race rankings? In that case, where? (otherwise return 0)
-int race_CheckName(string net_name)
-{
-       int rank = 0;
-       string zoned_name = strzone(strdecolorize(entcs_GetName(player_localnum)));
-       for (int i = RANKINGS_CNT - 1; i >= 0; --i)
-               if (strdecolorize(grecordholder[i]) == zoned_name)
-               {
-                       rank = i + 1;
-                       break;
-               }
-       strfree(zoned_name);
-       return rank;
-}
 
-void race_showTime(string text, vector pos, vector timeText_ofs, float theTime, vector textSize, float f)
-{
-       drawstring_aspect(pos, text, textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-       drawstring_aspect(pos + timeText_ofs, TIME_ENCODED_TOSTRING(theTime), textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-       if (f < 1) {
-               drawstring_aspect_expanding(pos, text, textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
-               drawstring_aspect_expanding(pos + timeText_ofs, TIME_ENCODED_TOSTRING(theTime), textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
-       }
-}
-
-void HUD_Mod_Race(vector pos, vector mySize)
-{
-       entity me = playerslots[player_localnum];
-       float score = me.(scores(ps_primary));
-
-       if(!(scores_flags(ps_primary) & SFL_TIME) || teamplay) // race/cts record display on HUD
-       {
-               mod_active = 0; // hide it in this case!
-               return; // no records in the actual race
-       }
-
-       mod_active = 1;
-
-       // clientside personal record
-       string rr;
-       if(ISGAMETYPE(CTS))
-               rr = CTS_RECORD;
-       else
-               rr = RACE_RECORD;
-       float t = stof(db_get(ClientProgsDB, strcat(shortmapname, rr, "time")));
-
-       if(score && (score < t || !t)) {
-               db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
-               if(autocvar_cl_autodemo_delete_keeprecords)
-               {
-                       float f = autocvar_cl_autodemo_delete;
-                       f &= ~1;
-                       cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
-               }
-       }
-
-       if(t != crecordtime_prev) {
-               crecordtime_prev = t;
-               crecordtime_change_time = time;
-       }
-
-       vector textPos, medalPos;
-       float squareSize;
-       if(mySize.x > mySize.y) {
-               // text on left side
-               squareSize = min(mySize.y, mySize.x/2);
-               vector ofs = vec2(0.5 * max(0, mySize.x/2 - squareSize), 0.5 * (mySize.y - squareSize));
-               textPos = pos + ofs;
-               ofs.x += 0.5 * mySize.x;
-               medalPos = pos + ofs;
-       } else {
-               // text on top
-               squareSize = min(mySize.x, mySize.y/2);
-               vector ofs = vec2(0.5 * (mySize.x - squareSize), 0.5 * max(0, mySize.y/2 - squareSize));
-               textPos = pos + ofs;
-               ofs.y += 0.5 * mySize.y;
-               medalPos = pos + ofs;
-       }
-       vector textSize = vec2(squareSize, 0.25 * squareSize);
-
-       race_showTime(_("Personal best"), textPos, eY * 0.25 * squareSize, t, textSize, time - crecordtime_change_time);
-
-       // server record
-       t = race_server_record;
-       if(t != srecordtime_prev) {
-               srecordtime_prev = t;
-               srecordtime_change_time = time;
-       }
-
-       textPos += eY * 0.5 * squareSize;
-       race_showTime(_("Server best"), textPos, eY * 0.25 * squareSize, t, textSize, time - srecordtime_change_time);
-
-       if (race_status != race_status_prev || race_status_name != race_status_name_prev) {
-               race_status_time = time + 5;
-               race_status_prev = race_status;
-               strcpy(race_status_name_prev, race_status_name);
-       }
-
-       // race "awards"
-       float a = bound(0, race_status_time - time, 1);
-       string s = textShortenToWidth(ColorTranslateRGB(race_status_name), squareSize, '1 1 0' * 0.1 * squareSize, stringwidth_colors);
-
-       float rank = 0;
-       if(race_status > 0)
-               rank = race_CheckName(race_status_name);
-       string rankname = count_ordinal(rank);
-       vector namepos = medalPos + '0 0.8 0' * squareSize;
-       vector rankpos = medalPos + '0 0.15 0' * squareSize;
-
-       if(race_status == 0)
-               drawpic_aspect_skin(medalPos, "race_newfail", '1 1 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-       else if(race_status == 1) {
-               drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newtime", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-       } else if(race_status == 2) {
-               if(strdecolorize(race_status_name) == strdecolorize(entcs_GetName(player_localnum)) || !race_myrank || race_myrank < rank)
-                       drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrankgreen", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               else
-                       drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrankyellow", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-       } else if(race_status == 3) {
-               drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrecordserver", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
-               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
-       }
-
-       if (race_status_time - time <= 0) {
-               race_status_prev = -1;
-               race_status = -1;
-               strfree(race_status_name);
-               strfree(race_status_name_prev);
-       }
+       FOREACH(Gametypes, it.m_modicons_export, it.m_modicons_export(fh));
 }
 
 void HUD_ModIcons_SetFunc()
index a451f924b029d386b86365fa50d2fdb610bbc9a2..139f29c3099f83ec00c969c7c8e59436929e91de 100644 (file)
@@ -4,7 +4,6 @@
 #include <client/defs.qh>
 #include <client/miscfunctions.qh>
 #include <client/main.qh>
-#include <common/mapinfo.qh>
 #include <lib/csqcmodel/cl_player.qh>
 
 // Physics (#15)
@@ -38,7 +37,7 @@ void HUD_Physics()
        {
                if(!autocvar_hud_panel_physics) return;
                if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
-               if(autocvar_hud_panel_physics == 3 && !(ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
+               if(autocvar_hud_panel_physics == 3 && !MUTATOR_CALLHOOK(HUD_Physics_showoptional)) return;
        }
 
        HUD_Panel_LoadCvars();
index cd0b26e0bd7af067bd797092e82f045b20b796dc..a0a971cb1f1732b95ddafae8b136303b6f1db0f5 100644 (file)
@@ -3,7 +3,6 @@
 #include <client/autocvars.qh>
 #include <client/defs.qh>
 #include <client/miscfunctions.qh>
-#include <common/mapinfo.qh>
 
 // Race timer (#8)
 
@@ -103,7 +102,7 @@ void HUD_RaceTimer ()
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_racetimer) return;
-               if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
+               if(!MUTATOR_CALLHOOK(ShowRaceTimer)) return;
                if(spectatee_status == -1) return;
        }
 
index e31aa01e91724a4efbf271d15737c5cbeb13111e..59bfa1a95ae9c256319b26b04518583ade31e31a 100644 (file)
@@ -4,7 +4,6 @@
 #include <client/defs.qh>
 #include <client/miscfunctions.qh>
 #include <common/ent_cs.qh>
-#include <common/mapinfo.qh>
 #include <client/mapvoting.qh>
 #include <client/resources.qh>
 #include <client/teamradar.qh>
@@ -353,10 +352,12 @@ void HUD_Radar()
 
        IL_EACH(g_radarlinks, true, draw_teamradar_link(it.origin, it.velocity, it.team));
 
+       bool mutator_returnvalue = MUTATOR_CALLHOOK(TeamRadar_Draw); // TODO: allow players to show on the radar as well!
+
        IL_EACH(g_radaricons, it.teamradar_icon, {
                if ( hud_panel_radar_mouse )
                if ( GetResource(it, RES_HEALTH) >= 0 )
-               if ( it.team == myteam + 1 || ISGAMETYPE(RACE) || !teamplay )
+               if ( it.team == myteam + 1 || mutator_returnvalue || !teamplay )
                {
                        vector coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(it.origin));
                        if(vdist((mousepos - coord), <, 8))
index 10aec79ff6939f663dea3139994111e894a21f8c..a6ec774b870a1cf85623115e79927e7f39289ca7 100644 (file)
@@ -5,7 +5,6 @@
 #include <client/miscfunctions.qh>
 #include "scoreboard.qh"
 #include <common/ent_cs.qh>
-#include <common/mapinfo.qh>
 #include <common/scores.qh>
 
 // Score (#7)
@@ -146,7 +145,7 @@ void HUD_Score()
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_score) return;
-               if(spectatee_status == -1 && (ISGAMETYPE(RACE) || ISGAMETYPE(CTS))) return;
+               if(MUTATOR_CALLHOOK(HUD_Score_show)) return;
        }
 
        HUD_Panel_LoadCvars();
index 120feeafa05cb858f0835c232b4e88f796e7ee88..47e08cbd835be0905cdd6689fe292d6a21e36df8 100644 (file)
@@ -83,8 +83,6 @@ bool autocvar_hud_panel_scoreboard_accuracy_nocolors = false;
 float autocvar_hud_panel_scoreboard_accuracy_showdelay = 2;
 float autocvar_hud_panel_scoreboard_accuracy_showdelay_minpos = 0.75;
 
-bool autocvar_hud_panel_scoreboard_ctf_leaderboard = true;
-
 bool autocvar_hud_panel_scoreboard_dynamichud = false;
 
 float autocvar_hud_panel_scoreboard_maxheight = 0.6;
@@ -1148,7 +1146,7 @@ bool Scoreboard_WouldDraw()
                return true;
        else if (intermission == 2)
                return false;
-       else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && !ISGAMETYPE(CTS)
+       else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && !MUTATOR_CALLHOOK(DrawDeathScoreboard)
                && (!HUD_MinigameMenu_IsOpened() || !active_minigame))
        {
                return true;
@@ -1396,7 +1394,7 @@ vector Scoreboard_MapStats_Draw(vector pos, vector rgb, vector bg_size) {
 }
 
 
-vector Scoreboard_Rankings_Draw(vector pos, entity pl, vector rgb, vector bg_size)
+vector Scoreboard_Rankings_Draw(vector pos, string ranktitle, entity pl, vector rgb, vector bg_size)
 {
        int i;
        RANKINGS_RECEIVED_CNT = 0;
@@ -1410,7 +1408,7 @@ vector Scoreboard_Rankings_Draw(vector pos, entity pl, vector rgb, vector bg_siz
        vector hl_rgb = rgb + '0.5 0.5 0.5';
 
        pos.y += hud_fontsize.y;
-       drawstring(pos + eX * panel_bg_padding, ((ISGAMETYPE(CTF)) ? _("Capture time rankings") : _("Rankings")), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawstring(pos + eX * panel_bg_padding, ranktitle, hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
        pos.y += 1.25 * hud_fontsize.y;
        if(panel.current_panel_bg != "0")
                pos.y += panel_bg_border;
@@ -1506,7 +1504,7 @@ float scoreboard_time;
 bool have_weapon_stats;
 bool Scoreboard_AccuracyStats_WouldDraw(float ypos)
 {
-       if (ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || ISGAMETYPE(NEXBALL))
+       if (MUTATOR_CALLHOOK(DrawScoreboardAccuracy))
                return false;
        if (!autocvar_hud_panel_scoreboard_accuracy || warmup_stage || ypos > 0.91 * vid_conheight)
                return false;
@@ -1629,7 +1627,7 @@ void Scoreboard_Draw()
        str = "";
        if(tl > 0)
                str = strcat(str, sprintf(_("^3%1.0f minutes"), tl));
-       if(!ISGAMETYPE(LMS))
+       if(!gametype.m_hidelimits)
        {
                if(fl > 0)
                {
@@ -1818,7 +1816,8 @@ void Scoreboard_Draw()
        if (Scoreboard_AccuracyStats_WouldDraw(pos.y))
                pos = Scoreboard_AccuracyStats_Draw(pos, panel_bg_color, bg_size);
 
-       if(ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || (autocvar_hud_panel_scoreboard_ctf_leaderboard && ISGAMETYPE(CTF) && STAT(CTF_SHOWLEADERBOARD))) {
+       if(MUTATOR_CALLHOOK(ShowRankings)) {
+               string ranktitle = M_ARGV(0, string);
                if(race_speedaward) {
                        drawcolorcodedstring(pos, sprintf(_("Speed award: %d%s ^7(%s^7)"), race_speedaward, race_speedaward_unit, ColorTranslateRGB(race_speedaward_holder)), hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                        pos.y += 1.25 * hud_fontsize.y;
@@ -1827,7 +1826,7 @@ void Scoreboard_Draw()
                        drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d%s ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_unit, ColorTranslateRGB(race_speedaward_alltimebest_holder)), hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                        pos.y += 1.25 * hud_fontsize.y;
                }
-               pos = Scoreboard_Rankings_Draw(pos, playerslots[player_localnum], panel_bg_color, bg_size);
+               pos = Scoreboard_Rankings_Draw(pos, ranktitle, playerslots[player_localnum], panel_bg_color, bg_size);
        }
 
        pos = Scoreboard_MapStats_Draw(pos, panel_bg_color, bg_size);
index 4aab1b93bb520315148e1574e95ccf1b8d111bf2..60f8394900203204be439257a509e5f46cc7af8c 100644 (file)
@@ -3,7 +3,6 @@
 #include <client/autocvars.qh>
 #include <client/defs.qh>
 #include <client/miscfunctions.qh>
-#include <common/mapinfo.qh>
 
 // Vote (#9)
 
@@ -15,7 +14,7 @@ void HUD_Vote_Export(int fh)
 
 void HUD_Vote()
 {
-       if(autocvar_cl_allow_uid2name == -1 && (ISGAMETYPE(CTS) || ISGAMETYPE(RACE) || (serverflags & SERVERFLAG_PLAYERSTATS)))
+       if(autocvar_cl_allow_uid2name == -1 && (MUTATOR_CALLHOOK(ShowRankings) || (serverflags & SERVERFLAG_PLAYERSTATS)))
        {
                // this dialog gets overriden by the uid2name menu dialog, if it exists
                // TODO remove this client side uid2name dialog in the next release
index c025bdd4651229ed39d182281ca9f4542b31fb59..2129b7802735149564d8891117e29ed61db9ce4e 100644 (file)
@@ -636,7 +636,7 @@ void GameTypeVote_ReadOption(int i)
        }
        else
        {
-               Gametype type = MapInfo_Type_FromString(gt);
+               Gametype type = MapInfo_Type_FromString(gt, false);
                mv_pk3[i] = strzone(MapInfo_Type_ToText(type));
                mv_desc[i] = MapInfo_Type_Description(type);
        }
index 2b1792878258416133ec80e54b66b21825925d03..23bbe00d89e767d5dc5c81d3d045fb75e80c1e34 100644 (file)
@@ -118,6 +118,12 @@ MUTATOR_HOOKABLE(HUD_Draw_overlay, EV_HUD_Draw_overlay);
 
 MUTATOR_HOOKABLE(HUD_Powerups_add, EV_NO_ARGS);
 
+/** return true to show the physics HUD panel when optional mode is enabled */
+MUTATOR_HOOKABLE(HUD_Physics_showoptional, EV_NO_ARGS);
+
+/** return true to hide the score HUD panel */
+MUTATOR_HOOKABLE(HUD_Score_show, EV_NO_ARGS);
+
 /** Return true to not draw any vortex beam */
 #define EV_Particles_VortexBeam(i, o) \
        /** beam shot origin */  i(vector, MUTATOR_ARGV_0_vector) \
@@ -163,10 +169,19 @@ MUTATOR_HOOKABLE(DrawCrosshair, EV_NO_ARGS);
 /** Return true to not draw scoreboard */
 MUTATOR_HOOKABLE(DrawScoreboard, EV_NO_ARGS);
 
-/** Called when drawing info messages, allows adding new info messages */
+/** Return true to not draw scoreboard while dead */
+MUTATOR_HOOKABLE(DrawDeathScoreboard, EV_NO_ARGS);
+
+/** Return true to not show accuracy stats in the scoreboard */
+MUTATOR_HOOKABLE(DrawScoreboardAccuracy, EV_NO_ARGS);
+
+/** Called when drawing info messages, allows adding new info messages. Return true to hide the standard join message */
 #define EV_DrawInfoMessages(i, o) \
        /** pos */                          i(vector, MUTATOR_ARGV_0_vector) \
+       /***/                           o(vector, MUTATOR_ARGV_0_vector) \
        /** mySize */                   i(vector, MUTATOR_ARGV_1_vector) \
+       /** img_curr_group */   i(int, MUTATOR_ARGV_2_int) \
+       /***/                                   o(int, MUTATOR_ARGV_2_int) \
        /**/
 MUTATOR_HOOKABLE(DrawInfoMessages, EV_DrawInfoMessages);
 
@@ -203,3 +218,23 @@ MUTATOR_HOOKABLE(DamageInfo, EV_DamageInfo);
 
 /** Return true to not draw zoom reticle */
 MUTATOR_HOOKABLE(DrawReticle, EV_NO_ARGS);
+
+/** Return true to show leaderboard rankings, needs title argument set */
+#define EV_ShowRankings(i, o) \
+       /** rankings title */   o(string, MUTATOR_ARGV_0_string) \
+       /**/
+MUTATOR_HOOKABLE(ShowRankings, EV_ShowRankings);
+
+/** Called when drawing a player's nameplate, return true to hide it */
+#define EV_ShowNames_Draw(i, o) \
+       /** entity id */ i(entity, MUTATOR_ARGV_0_entity) \
+       /** alpha */     i(float, MUTATOR_ARGV_1_float) \
+       /***/            o(float, MUTATOR_ARGV_1_float) \
+       /**/
+MUTATOR_HOOKABLE(ShowNames_Draw, EV_ShowNames_Draw);
+
+/** Return true to display the race timer HUD panel */
+MUTATOR_HOOKABLE(ShowRaceTimer, EV_NO_ARGS);
+
+/** Return true to force team radar to display entities regardless of their team */
+MUTATOR_HOOKABLE(TeamRadar_Draw, EV_NO_ARGS);
index 8d219c5444b03ebf9c1e0a3afbaa7ce0a3d5b200..d4a221cbc8a09c238faa5d44b4b7930fd8c2239a 100644 (file)
@@ -8,7 +8,6 @@
 #include <common/ent_cs.qh>
 #include <common/constants.qh>
 #include <common/net_linked.qh>
-#include <common/mapinfo.qh>
 #include <common/teams.qh>
 
 #include <lib/csqcmodel/cl_model.qh>
@@ -126,7 +125,8 @@ void Draw_ShowNames(entity this)
                if (f < 0) f = 0;
                a *= f;
        }
-       if (a < ALPHA_MIN_VISIBLE && ISGAMETYPE(CTS)) return;
+       if (MUTATOR_CALLHOOK(ShowNames_Draw, this, a)) return;
+       a = M_ARGV(1, float);
        if (vdist(this.origin - view_origin, >=, max_shot_distance)) return;
        float dist = vlen(this.origin - view_origin);
        if (autocvar_hud_shownames_maxdistance)
index 05d2306695076006f86478c26d5852bc74760b77..c9ad52ef93bf66cdd64ee0a04c2065bd244af937 100644 (file)
@@ -953,7 +953,7 @@ void HUD_Draw(entity this)
        if(autocvar_r_letterbox == 0)
                if(autocvar_viewsize < 120)
                {
-                       if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS)))
+                       if(!MUTATOR_CALLHOOK(DrawScoreboardAccuracy))
                                Accuracy_LoadLevels();
 
                        HUD_Main();
index 9ee58f5fe1c07323097ca2c08ff2f9df091bf34f..d3a144620a59b9e840d6f1ca96c48cafaa005a19 100644 (file)
@@ -51,7 +51,7 @@ bool Net_Write_Effect(entity this, entity client, int sf)
        return true;
 }
 
-void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
+void Send_Effect_Except(entity eff, vector eff_loc, vector eff_vel, int eff_cnt, entity ignore)
 {
        if(!eff) { return; }
        if(!eff.eent_eff_trail && !eff_cnt) { return; } // effect has no count!
@@ -64,10 +64,15 @@ void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
        net_eff.eent_net_count = eff_cnt;
        net_eff.eent_eff_trail = eff.eent_eff_trail;
 
-       FOREACH_CLIENT(IS_REAL_CLIENT(it), Net_Write_Effect(net_eff, it, 0));
+       FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != ignore && !(IS_SPEC(it) && it.enemy && it.enemy == ignore), Net_Write_Effect(net_eff, it, 0));
        delete(net_eff);
 }
 
+void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
+{
+       Send_Effect_Except(eff, eff_loc, eff_vel, eff_cnt, NULL);
+}
+
 void Send_Effect_(string eff_name, vector eff_loc, vector eff_vel, int eff_cnt)
 {
        // problem with this is, we might not have all the available effects for it
index fe7bbc31a595596debb3be13632472e11d7cf905..525336377683936185575b745add520e730c8522 100644 (file)
@@ -3,6 +3,7 @@
 #include "effect.qh"
 
 #ifdef SVQC
+void Send_Effect_Except(entity eff, vector eff_loc, vector eff_vel, int eff_cnt, entity ignore);
 void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt);
 void Send_Effect_(string eff_name, vector eff_loc, vector eff_vel, int eff_cnt);
 #endif
index 80c6bbacf96f9ec6426913aa227862bc2c90bf64..090d2b111902b66247a52978b1c404598a5b4c1a 100644 (file)
@@ -9089,8 +9089,8 @@ SUB(TE_TEI_G3_HIT) {
 }
 
 // respawn ghosts effect
-DEF(RESPAWN_GHOST);
-SUB(RESPAWN_GHOST) {
+DEF(respawn_ghost);
+SUB(respawn_ghost) {
        MY(count) = 75;
        MY(type) = "static";
        MY(color_min) = "0xA0A0A0";
index 8ce2b6ed3a4a8b7ea0fd09ddf75bf9b241b03847..06b8baa1a325999039f6ebe76da88534d82f63c2 100644 (file)
@@ -17,7 +17,7 @@
                 * @param gs the global sound def
                 * @param r a random number in 0..1
                 */
-               void globalsound(int channel, entity from, entity gs, float r, int chan, float _vol, float _atten)
+               void globalsound(int channel, entity from, entity gs, float r, int chan, float _vol, float _atten, float _pitch)
                {
                        //assert(IS_PLAYER(from), eprint(from));
                        if (channel == MSG_ONE && !IS_REAL_CLIENT(msg_entity)) return;
                                string sample = GlobalSound_sample(gs.m_globalsoundstr, r);
                                switch (channel) {
                                        case MSG_ONE:
-                                               soundto(channel, from, chan, sample, _vol, _atten);
+                                               soundto(channel, from, chan, sample, _vol, _atten, _pitch);
                                                break;
                                        case MSG_ALL:
-                                               _sound(from, chan, sample, _vol, _atten);
+                                               if(sound_allowed(MSG_BROADCAST, from))
+                                                       sound7(from, chan, sample, _vol, _atten, _pitch, 0);
                                                break;
                                }
                                return;
                        }
+                       // FIXME: pitch not implemented
                        WriteHeader(channel, globalsound);
                        WriteByte(channel, gs.m_id);
                        WriteByte(channel, r * 255);
@@ -50,7 +52,7 @@
                * @param ps the player sound def
                * @param r a random number in 0..1
                */
-               void playersound(int channel, entity from, entity ps, float r, int chan, float _vol, float _atten)
+               void playersound(int channel, entity from, entity ps, float r, int chan, float _vol, float _atten, float _pitch)
                {
                        //assert(IS_PLAYER(from), eprint(from));
                        if (channel == MSG_ONE && !IS_REAL_CLIENT(msg_entity)) return;
                                string sample = GlobalSound_sample(s, r);
                                switch (channel) {
                                        case MSG_ONE:
-                                               soundto(channel, from, chan, sample, _vol, _atten);
+                                               soundto(channel, from, chan, sample, _vol, _atten, _pitch);
                                                break;
                                        case MSG_ALL:
-                                               _sound(from, chan, sample, _vol, _atten);
+                                               if(sound_allowed(MSG_BROADCAST, from))
+                                                       sound7(from, chan, sample, _vol, _atten, _pitch, 0);
                                                break;
                                }
                                return;
                        }
+                       // FIXME: pitch not implemented
                        WriteHeader(channel, playersound);
                        WriteByte(channel, ps.m_id);
                        WriteByte(channel, r * 255);
                return sample;
        }
 
+       float GlobalSound_pitch(float _pitch)
+       {
+               // customizable gradient function that crosses (0,a), (c,1) and asymptotically approaches b
+               float a = 1.5; // max pitch
+               float b = 0.75; // min pitch
+               float c = 100; // standard pitch (scale * 100)
+               float d = _pitch;
+               float pitch_shift = (b*d*(a-1) + a*c*(1-b)) / (d*(a-1) + c*(1-b));
+
+               return pitch_shift * 100;
+       }
+
        void PrecacheGlobalSound(string sample)
        {
                int n;
                        if (gs == NULL && ps == NULL && sample == "") return;
                        if(this.classname == "body") return;
                        float r = random();
+                       float myscale = ((this.scale) ? this.scale : 1); // safety net
+                       float thepitch = ((myscale == 1) ? 0 : GlobalSound_pitch(myscale * 100));
                        if (sample != "") sample = GlobalSound_sample(sample, r);
                        switch (voicetype)
                        {
                                                if (IS_REAL_CLIENT(msg_entity))
                                                {
                                                        float atten = (CS(msg_entity).cvar_cl_voice_directional == 1) ? ATTEN_MIN : ATTEN_NONE;
-                                                       if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten);
-                                                       else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten);
-                                                       else soundto(MSG_ONE, this, chan, sample, vol, atten);
+                                                       if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten, thepitch);
+                                                       else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten, thepitch);
+                                                       else soundto(MSG_ONE, this, chan, sample, vol, atten, thepitch);
                                                }
                                        }
                                        if (voicetype == VOICETYPE_LASTATTACKER_ONLY) break;
                                        msg_entity = this;
                                        if (IS_REAL_CLIENT(msg_entity))
                                        {
-                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, VOL_BASE, ATTEN_NONE);
-                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, VOL_BASE, ATTEN_NONE);
-                                               else soundto(MSG_ONE, this, chan, sample, VOL_BASE, ATTEN_NONE);
+                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, VOL_BASE, ATTEN_NONE, thepitch);
+                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, VOL_BASE, ATTEN_NONE, thepitch);
+                                               else soundto(MSG_ONE, this, chan, sample, VOL_BASE, ATTEN_NONE, thepitch);
                                        }
                                        break;
                                }
                                        #define X() \
                                                MACRO_BEGIN \
                                                        float atten = (CS(msg_entity).cvar_cl_voice_directional == 1) ? ATTEN_MIN : ATTEN_NONE; \
-                                                       if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten); \
-                                                       else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten); \
-                                                       else soundto(MSG_ONE, this, chan, sample, vol, atten); \
+                                                       if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten, thepitch); \
+                                                       else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten, thepitch); \
+                                                       else soundto(MSG_ONE, this, chan, sample, vol, atten, thepitch); \
                                                MACRO_END
 
                                        if (fake) { msg_entity = this; X(); }
                                                                        ? bound(ATTEN_MIN, CS(msg_entity).cvar_cl_voice_directional_taunt_attenuation, \
                                                                        ATTEN_MAX) \
                                                                        : ATTEN_NONE; \
-                                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten); \
-                                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten); \
-                                                               else soundto(MSG_ONE, this, chan, sample, vol, atten); \
+                                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, atten, thepitch); \
+                                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, atten, thepitch); \
+                                                               else soundto(MSG_ONE, this, chan, sample, vol, atten, thepitch); \
                                                        } \
                                                MACRO_END
                                        if (fake)
                                        msg_entity = this;
                                        if (fake)
                                        {
-                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, ATTEN_NORM);
-                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, ATTEN_NORM);
-                                               else soundto(MSG_ONE, this, chan, sample, vol, ATTEN_NORM);
+                                               if (gs) globalsound(MSG_ONE, this, gs, r, chan, vol, ATTEN_NORM, thepitch);
+                                               else if (ps) playersound(MSG_ONE, this, ps, r, chan, vol, ATTEN_NORM, thepitch);
+                                               else soundto(MSG_ONE, this, chan, sample, vol, ATTEN_NORM, thepitch);
                                        }
                                        else
                                        {
-                                               if (gs) globalsound(MSG_ALL, this, gs, r, chan, vol, ATTEN_NORM);
-                                               else if (ps) playersound(MSG_ALL, this, ps, r, chan, vol, ATTEN_NORM);
-                                               else _sound(this, chan, sample, vol, ATTEN_NORM);
+                                               if (gs) globalsound(MSG_ALL, this, gs, r, chan, vol, ATTEN_NORM, thepitch);
+                                               else if (ps) playersound(MSG_ALL, this, ps, r, chan, vol, ATTEN_NORM, thepitch);
+                                               else if (sound_allowed(MSG_BROADCAST, this)) sound7(this, chan, sample, vol, ATTEN_NORM, thepitch, 0);
                                        }
                                        break;
                                }
index 2b6b52896f88fd3ec4d935c74dc20f8efaca256a..5460d72ac07d90671728f64e9a46e8d696fc4aec 100644 (file)
@@ -123,6 +123,8 @@ entity GetVoiceMessage(string type);
 
 string GlobalSound_sample(string pair, float r);
 
+float GlobalSound_pitch(float _pitch);
+
 #ifdef SVQC
 
        void _GlobalSound(entity this, entity gs, entity ps, string sample, float chan, float vol, float voicetype, bool fake);
index e03d3c52e6530922fc93af01093e6c389de56d80..2235e53d74f41597bafb4eb13802bbd2e9b97532 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/assault/assault.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/assault/sv_assault.qc>
 #endif
index 211daa89e3fba8f56711c4c56c0ec9959a837439..32bd160ba945bfbfb2be4102af02e9cce531fa92 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/assault/assault.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/assault/sv_assault.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/assault/assault.qc b/qcsrc/common/gamemodes/gamemode/assault/assault.qc
new file mode 100644 (file)
index 0000000..c3e582a
--- /dev/null
@@ -0,0 +1 @@
+#include "assault.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/assault/assault.qh b/qcsrc/common/gamemodes/gamemode/assault/assault.qh
new file mode 100644 (file)
index 0000000..f4f4b3f
--- /dev/null
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+CLASS(Assault, Gametype)
+    INIT(Assault)
+    {
+        this.gametype_init(this, _("Assault"),"as","g_assault",GAMETYPE_FLAG_TEAMPLAY,"","timelimit=20",_("Destroy obstacles to find and destroy the enemy power core before time runs out"));
+    }
+    METHOD(Assault, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "target_assault_roundend")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(Assault, m_isTwoBaseMode, bool())
+    {
+        return true;
+    }
+    METHOD(Assault, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
+    }
+    ATTRIB(Assault, m_legacydefaults, string, "20 0");
+ENDCLASS(Assault)
+REGISTER_GAMETYPE(ASSAULT, NEW(Assault));
+#define g_assault IS_GAMETYPE(ASSAULT)
index ce7b59399ab0816d5a9a9a8e0a14673d9b1acd73..d2a6992f671fa0fccfe1a5c58c3ca05ffb874674 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/clanarena/clanarena.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/clanarena/cl_clanarena.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/clanarena/sv_clanarena.qc>
 #endif
index 55789f77ab3f395bd523d69d1cb5c91273a88646..b583c0dd6ecb01fa16188e9f19e79d90c8382aa2 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/clanarena/clanarena.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/clanarena/cl_clanarena.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/clanarena/sv_clanarena.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qc b/qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qc
new file mode 100644 (file)
index 0000000..2bded9d
--- /dev/null
@@ -0,0 +1,79 @@
+#include "cl_clanarena.qh"
+
+void HUD_Mod_CA_Export(int fh)
+{
+       HUD_Write_Cvar("hud_panel_modicons_ca_layout");
+}
+
+void DrawCAItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
+{
+       TC(int, layout); TC(int, i);
+       int stat = -1;
+       string pic = "";
+       vector color = '0 0 0';
+       switch(i)
+       {
+               case 0: stat = STAT(REDALIVE); pic = "player_red"; color = '1 0 0'; break;
+               case 1: stat = STAT(BLUEALIVE); pic = "player_blue"; color = '0 0 1'; break;
+               case 2: stat = STAT(YELLOWALIVE); pic = "player_yellow"; color = '1 1 0'; break;
+               default:
+               case 3: stat = STAT(PINKALIVE); pic = "player_pink"; color = '1 0 1'; break;
+       }
+
+       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)
+       {
+               drawpic_aspect_skin(myPos, pic, vec2(0.5 * mySize.x, mySize.y), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawstring_aspect(myPos + eX * 0.5 * mySize.x, ftos(stat), vec2(0.5 * mySize.x, mySize.y), color, panel_fg_alpha, DRAWFLAG_NORMAL);
+       }
+       else
+               drawstring_aspect(myPos, ftos(stat), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+}
+
+void HUD_Mod_CA_Draw(vector myPos, vector mySize, int layout)
+{
+       int rows, columns;
+       float aspect_ratio;
+       aspect_ratio = (layout) ? 2 : 1;
+       rows = HUD_GetRowCount(team_count, mySize, aspect_ratio);
+       columns = ceil(team_count/rows);
+
+       int i;
+       float row = 0, column = 0;
+       vector pos = '0 0 0', itemSize;
+       itemSize = vec2(mySize.x / columns, mySize.y / rows);
+       for(i=0; i<team_count; ++i)
+       {
+               pos.x = myPos.x + column * itemSize.x;
+               pos.y = myPos.y + row * itemSize.y;
+
+               DrawCAItem(pos, itemSize, aspect_ratio, layout, i);
+
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       ++column;
+               }
+       }
+}
+
+// Clan Arena and Freeze Tag HUD modicons
+void HUD_Mod_CA(vector myPos, vector mySize)
+{
+       mod_active = 1; // required in each mod function that always shows something
+
+       HUD_Mod_CA_Draw(myPos, mySize, autocvar_hud_panel_modicons_ca_layout);
+}
diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qh b/qcsrc/common/gamemodes/gamemode/clanarena/cl_clanarena.qh
new file mode 100644 (file)
index 0000000..7ccd5bb
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+void HUD_Mod_CA(vector myPos, vector mySize);
+void HUD_Mod_CA_Draw(vector myPos, vector mySize, int layout);
+void HUD_Mod_CA_Export(int fh);
diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qc b/qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qc
new file mode 100644 (file)
index 0000000..079d4b6
--- /dev/null
@@ -0,0 +1 @@
+#include "clanarena.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qh b/qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qh
new file mode 100644 (file)
index 0000000..3b3dace
--- /dev/null
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_CA(vector pos, vector mySize);
+void HUD_Mod_CA_Export(int fh);
+#endif
+CLASS(ClanArena, Gametype)
+    INIT(ClanArena)
+    {
+        this.gametype_init(this, _("Clan Arena"),"ca","g_ca",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill all enemy teammates to win the round"));
+    }
+    METHOD(ClanArena, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_ca_teams", cvar_defstring("g_ca_teams"));
+            return true;
+        }
+        switch (k) {
+            case "teams":
+                cvar_set("g_ca_teams", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(ClanArena, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        if(spawnpoints >= 8 && diameter > 4096)
+            return true;
+        return false;
+    }
+    METHOD(ClanArena, m_setTeams, void(string sa))
+    {
+        cvar_set("g_ca_teams", sa);
+    }
+    METHOD(ClanArena, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Frag limit:"),      5,  100,  5, "fraglimit_override",        "g_ca_teams_override",          _("The amount of frags needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(ClanArena, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
+    ATTRIB(ClanArena, m_modicons_export, void(int fh), HUD_Mod_CA_Export);
+#endif
+    ATTRIB(ClanArena, m_legacydefaults, string, "10 20 0");
+ENDCLASS(ClanArena)
+REGISTER_GAMETYPE(CA, NEW(ClanArena));
+#define g_ca IS_GAMETYPE(CA)
index cbbe9afb7efd5545b4967b16c96ce445df078d02..85f8e22ae66238441cfec0d6e24667f3b954082c 100644 (file)
@@ -187,3 +187,16 @@ void HUD_Mod_CTF(vector pos, vector mySize)
     X(neutral);
     #undef X
 }
+
+bool autocvar_hud_panel_scoreboard_ctf_leaderboard = true;
+
+REGISTER_MUTATOR(cl_ctf, true);
+
+MUTATOR_HOOKFUNCTION(cl_ctf, ShowRankings)
+{
+    if(autocvar_hud_panel_scoreboard_ctf_leaderboard && ISGAMETYPE(CTF) && STAT(CTF_SHOWLEADERBOARD))
+    {
+        M_ARGV(0, string) = _("Capture time rankings");
+        return true;
+    }
+}
index 3cbd334b276544ea8977bff8fc654414c3146f01..5d74f31cce3fb7d625ff3c2a4e19778502269fc2 100644 (file)
@@ -1,5 +1,44 @@
 #pragma once
 
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_CTF(vector pos, vector mySize);
+void HUD_Mod_CTF_Reset();
+#endif
+CLASS(CaptureTheFlag, Gametype)
+    INIT(CaptureTheFlag)
+    {
+        this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=20 caplimit=10 leadlimit=6",_("Find and bring the enemy flag to your base to capture it, defend your base from the other team"));
+    }
+    METHOD(CaptureTheFlag, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "item_flag_team2" || v == "team_CTF_blueflag")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(CaptureTheFlag, m_isTwoBaseMode, bool())
+    {
+        return true;
+    }
+    METHOD(CaptureTheFlag, m_setTeams, void(string sa))
+    {
+        cvar_set("fraglimit", sa);
+    }
+    METHOD(CaptureTheFlag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Capture limit:"),   1,   20,  1, "capturelimit_override",     string_null,                    _("The amount of captures needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(CaptureTheFlag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CTF);
+    ATTRIB(CaptureTheFlag, m_modicons_reset, void(), HUD_Mod_CTF_Reset);
+#endif
+    ATTRIB(CaptureTheFlag, m_legacydefaults, string, "300 20 10 0");
+ENDCLASS(CaptureTheFlag)
+REGISTER_GAMETYPE(CTF, NEW(CaptureTheFlag));
+#define g_ctf IS_GAMETYPE(CTF)
+
+#ifdef GAMEQC
 const int CTF_RED_FLAG_TAKEN                   = 1;
 const int CTF_RED_FLAG_LOST                            = 2;
 const int CTF_RED_FLAG_CARRYING                        = 3;
@@ -18,3 +57,4 @@ const int CTF_NEUTRAL_FLAG_CARRYING           = 768;
 const int CTF_FLAG_NEUTRAL                             = 2048;
 const int CTF_SHIELDED                                 = 4096;
 const int CTF_STALEMATE                                        = 8192;
+#endif
index a48cd89ddad1053d7e198df6446bf25f8a114ed0..f60b8de4cfc4c7da886439a61d481ef4649cd1ea 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/cts/cts.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/cts/cl_cts.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/cts/sv_cts.qc>
 #endif
index d05e62987fc613e48a9f253520b0de6f9fc0b9b0..5e9ba6326d09a90d1ef9e6f7535920a541d258f4 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/cts/cts.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/cts/cl_cts.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/cts/sv_cts.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/cts/cl_cts.qc b/qcsrc/common/gamemodes/gamemode/cts/cl_cts.qc
new file mode 100644 (file)
index 0000000..27d6b86
--- /dev/null
@@ -0,0 +1,42 @@
+#include "cl_cts.qh"
+
+REGISTER_MUTATOR(cl_cts, true);
+
+MUTATOR_HOOKFUNCTION(cl_cts, HUD_Physics_showoptional)
+{
+       return ISGAMETYPE(CTS); // show the optional physics panel
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, HUD_Score_show)
+{
+       return spectatee_status == -1 && ISGAMETYPE(CTS); // hide the score panel while observing
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, DrawDeathScoreboard)
+{
+       return ISGAMETYPE(CTS); // no scoreboard shown while dead
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, DrawScoreboardAccuracy)
+{
+       return ISGAMETYPE(CTS); // accuracy is not a factor in this gamemode
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, ShowRankings)
+{
+       if(ISGAMETYPE(CTS))
+       {
+               M_ARGV(0, string) = _("Rankings");
+               return true;
+       }
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, ShowNames_Draw)
+{
+       return (ISGAMETYPE(CTS) && M_ARGV(1, float) < ALPHA_MIN_VISIBLE);
+}
+
+MUTATOR_HOOKFUNCTION(cl_cts, ShowRaceTimer)
+{
+       return ISGAMETYPE(CTS); // show the race timer panel
+}
diff --git a/qcsrc/common/gamemodes/gamemode/cts/cl_cts.qh b/qcsrc/common/gamemodes/gamemode/cts/cl_cts.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
diff --git a/qcsrc/common/gamemodes/gamemode/cts/cts.qc b/qcsrc/common/gamemodes/gamemode/cts/cts.qc
new file mode 100644 (file)
index 0000000..cfc0c6f
--- /dev/null
@@ -0,0 +1 @@
+#include "cts.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/cts/cts.qh b/qcsrc/common/gamemodes/gamemode/cts/cts.qh
new file mode 100644 (file)
index 0000000..c59b73c
--- /dev/null
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+#if defined(CSQC)
+       #include <common/gamemodes/gamemode/race/cl_race.qh>
+#endif
+
+CLASS(RaceCTS, Gametype)
+    INIT(RaceCTS)
+    {
+        this.gametype_init(this, _("Race CTS"),"cts","g_cts",0,"cloaked","timelimit=20",_("Race for fastest time."));
+    }
+    METHOD(RaceCTS, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "target_startTimer")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(RaceCTS, m_setTeams, void(string sa))
+    {
+        // this is the skill of the map
+        // not parsed by anything yet
+        // for map databases
+        //  cvar_set("fraglimit", sa);
+    }
+    METHOD(RaceCTS, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
+    }
+#ifdef CSQC
+    ATTRIB(RaceCTS, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
+#endif
+    ATTRIB(RaceCTS, m_legacydefaults, string, "20 0 0");
+ENDCLASS(RaceCTS)
+REGISTER_GAMETYPE(CTS, NEW(RaceCTS));
+#define g_cts IS_GAMETYPE(CTS)
index ba2449386cd20b9de4795a5ced19e00f44be1b07..4b37b093e225f947c05e138508c001c5a40ce631 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/deathmatch/sv_deathmatch.qc>
 #endif
index abc7db377aba51025c210a7a9d40329dafad65a6..3e67c78ef257b8251350d1f99b686f6728d55e17 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/deathmatch/sv_deathmatch.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qc b/qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qc
new file mode 100644 (file)
index 0000000..fd1e1e1
--- /dev/null
@@ -0,0 +1 @@
+#include "deathmatch.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qh b/qcsrc/common/gamemodes/gamemode/deathmatch/deathmatch.qh
new file mode 100644 (file)
index 0000000..ca55a3b
--- /dev/null
@@ -0,0 +1,16 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+CLASS(Deathmatch, Gametype)
+    INIT(Deathmatch)
+    {
+        this.gametype_init(this, _("Deathmatch"),"dm","g_dm",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PREFERRED,"","timelimit=15 pointlimit=30 leadlimit=0",_("Score as many frags as you can"));
+    }
+    METHOD(Deathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        return true;
+    }
+    ATTRIB(Deathmatch, m_legacydefaults, string, "30 20 0");
+ENDCLASS(Deathmatch)
+REGISTER_GAMETYPE(DEATHMATCH, NEW(Deathmatch));
index 418a843d9b51e1276d2fc9ec9813370b46e8c4ab..5a91165e956061d12d1c15e27dba292433fb9982 100644 (file)
@@ -2,6 +2,11 @@
 
 #include <client/hud/panel/modicons.qh>
 
+void HUD_Mod_Dom_Export(int fh)
+{
+       HUD_Write_Cvar("hud_panel_modicons_dom_layout");
+}
+
 int autocvar_hud_panel_modicons_dom_layout;
 
 void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, int layout, int i)
index 11ab3daca7ce3787ef67dd49e753020ca9faa8ed..5e04dd04917b2adab5cd9a22203eaef1e62cd22f 100644 (file)
@@ -1,3 +1,4 @@
 #pragma once
 
 void HUD_Mod_Dom(vector myPos, vector mySize);
+void HUD_Mod_Dom_Export(int fh);
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..4ebb684255465129e357ddf37fa70c700db05674 100644 (file)
@@ -1 +1,43 @@
 #pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_Dom(vector pos, vector mySize);
+void HUD_Mod_Dom_Export(int fh);
+#endif
+CLASS(Domination, Gametype)
+    INIT(Domination)
+    {
+        this.gametype_init(this, _("Domination"),"dom","g_domination",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0",_("Capture and defend all the control points to win"));
+    }
+    METHOD(Domination, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_domination_default_teams", cvar_defstring("g_domination_default_teams"));
+            return true;
+        }
+        switch (k) {
+            case "teams":
+                cvar_set("g_domination_default_teams", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(Domination, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "dom_controlpoint")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(Domination, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),    50,  500, 10, "g_domination_point_limit",  "g_domination_teams_override",  _("The amount of points needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(Domination, m_modicons, void(vector pos, vector mySize), HUD_Mod_Dom);
+    ATTRIB(Domination, m_modicons_export, void(int fh), HUD_Mod_Dom_Export);
+#endif
+    ATTRIB(Domination, m_legacydefaults, string, "200 20 0");
+ENDCLASS(Domination)
+REGISTER_GAMETYPE(DOMINATION, NEW(Domination));
index 59258167506697cfcaa7384ce4ea94a0ea6a0362..1a7e0d33963d8efae1a5a431be38f6423ae0fa83 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/duel/duel.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/duel/sv_duel.qc>
 #endif
index 00e553c202ddf2e48aab9d5767fde5eb443b4a23..6d6cc3c2e25a4d41a009071eaafe13c4f1bf86dd 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/duel/duel.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/duel/sv_duel.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/duel/duel.qc b/qcsrc/common/gamemodes/gamemode/duel/duel.qc
new file mode 100644 (file)
index 0000000..6cba48c
--- /dev/null
@@ -0,0 +1 @@
+#include "duel.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/duel/duel.qh b/qcsrc/common/gamemodes/gamemode/duel/duel.qh
new file mode 100644 (file)
index 0000000..298e62e
--- /dev/null
@@ -0,0 +1,28 @@
+#pragma once
+
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
+#include <common/mapinfo.qh>
+
+CLASS(Duel, Gametype)
+    INIT(Duel)
+    {
+        this.gametype_init(this, _("Duel"),"duel","g_duel",GAMETYPE_FLAG_USEPOINTS,"","timelimit=10 pointlimit=0 leadlimit=0",_("Fight in a one versus one arena battle to decide the winner"));
+    }
+    METHOD(Duel, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        return (diameter < 16384);
+    }
+    METHOD(Duel, m_isForcedSupported, bool(Gametype this))
+    {
+        if(!cvar("g_duel_not_dm_maps"))
+        {
+            // if this is set, all DM maps support duel too
+            // TODO: we should really check the size of maps, some DM maps do not work for duel!
+            if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
+                return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
+        }
+        return false;
+    }
+ENDCLASS(Duel)
+REGISTER_GAMETYPE(DUEL, NEW(Duel));
+#define g_duel IS_GAMETYPE(DUEL)
index 4d628003561edf58724cf9a7eec923eb5a4d40e5..28034e64c470edd89d01bfd6b0e4ae0c9fb0526c 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/freezetag/freezetag.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/freezetag/cl_freezetag.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/freezetag/sv_freezetag.qc>
 #endif
index 785d7b81369428d0eda09b3d23362f542e63cb40..84007e936e15dcd81d92ef16d7b87e91a81921e1 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/freezetag/freezetag.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/freezetag/cl_freezetag.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/freezetag/sv_freezetag.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qc b/qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qc
new file mode 100644 (file)
index 0000000..df4931a
--- /dev/null
@@ -0,0 +1,15 @@
+#include "cl_freezetag.qh"
+
+#include <common/gamemodes/gamemode/clanarena/cl_clanarena.qh>
+
+void HUD_Mod_FreezeTag_Export(int fh)
+{
+       HUD_Write_Cvar("hud_panel_modicons_freezetag_layout");
+}
+
+void HUD_Mod_FreezeTag(vector myPos, vector mySize)
+{
+       mod_active = 1; // required in each mod function that always shows something
+
+       HUD_Mod_CA_Draw(myPos, mySize, autocvar_hud_panel_modicons_freezetag_layout);
+}
diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qh b/qcsrc/common/gamemodes/gamemode/freezetag/cl_freezetag.qh
new file mode 100644 (file)
index 0000000..0d2f440
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_FreezeTag_Export(int fh);
diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qc b/qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qc
new file mode 100644 (file)
index 0000000..9bb8304
--- /dev/null
@@ -0,0 +1 @@
+#include "freezetag.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qh b/qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qh
new file mode 100644 (file)
index 0000000..61d3b91
--- /dev/null
@@ -0,0 +1,52 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+#if defined(CSQC)
+       #include <common/gamemodes/gamemode/clanarena/cl_clanarena.qh>
+#endif
+
+#ifdef CSQC
+void HUD_Mod_FreezeTag(vector myPos, vector mySize);
+void HUD_Mod_FreezeTag_Export(int fh);
+#endif
+CLASS(FreezeTag, Gametype)
+    INIT(FreezeTag)
+    {
+        this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win"));
+    }
+    METHOD(FreezeTag, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_freezetag_teams", cvar_defstring("g_freezetag_teams"));
+            return true;
+        }
+        switch (k) {
+            case "teams":
+                cvar_set("g_freezetag_teams", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(FreezeTag, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        if(spawnpoints >= 8 && diameter > 4096)
+            return true;
+        return false;
+    }
+    METHOD(FreezeTag, m_setTeams, void(string sa))
+    {
+        cvar_set("g_freezetag_teams", sa);
+    }
+    METHOD(FreezeTag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Frag limit:"),      5,  100,  5, "fraglimit_override",        "g_freezetag_teams_override",   _("The amount of frags needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(FreezeTag, m_modicons, void(vector pos, vector mySize), HUD_Mod_FreezeTag);
+    ATTRIB(FreezeTag, m_modicons_export, void(int fh), HUD_Mod_FreezeTag_Export);
+#endif
+    ATTRIB(FreezeTag, m_legacydefaults, string, "10 20 0");
+ENDCLASS(FreezeTag)
+REGISTER_GAMETYPE(FREEZETAG, NEW(FreezeTag));
+#define g_freezetag IS_GAMETYPE(FREEZETAG)
index a197891fe8737bfac787195ce64c093b8c2dba55..e8b28e96bc460ff67f58b3c84b0ab228c16e551d 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/invasion/invasion.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/invasion/sv_invasion.qc>
 #endif
index f90ea9b31e7c8bbf3d0649ab7574c937eb27e59e..5181956f2023028ddb6c2ff4e6bef2e37bc8ce0b 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/invasion/invasion.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/invasion/sv_invasion.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/invasion/invasion.qc b/qcsrc/common/gamemodes/gamemode/invasion/invasion.qc
new file mode 100644 (file)
index 0000000..6462b92
--- /dev/null
@@ -0,0 +1 @@
+#include "invasion.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/invasion/invasion.qh b/qcsrc/common/gamemodes/gamemode/invasion/invasion.qh
new file mode 100644 (file)
index 0000000..2195b84
--- /dev/null
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+CLASS(Invasion, Gametype)
+    INIT(Invasion)
+    {
+        this.gametype_init(this, _("Invasion"),"inv","g_invasion",GAMETYPE_FLAG_USEPOINTS,"","pointlimit=50 teams=0 type=0",_("Survive against waves of monsters"));
+    }
+    METHOD(Invasion, m_parse_mapinfo, bool(string k, string v))
+    {
+        switch (k) {
+            case "teams":
+                cvar_set("g_invasion_teams", v);
+                return true;
+            case "type":
+                cvar_set("g_invasion_type", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(Invasion, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "invasion_spawnpoint")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(Invasion, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
+    }
+ENDCLASS(Invasion)
+REGISTER_GAMETYPE(INVASION, NEW(Invasion));
index 31c5711424834925e91cb53e21d64da6ea2e9e39..a215040507d5bafe17968fb2c83b07db25174ce7 100644 (file)
@@ -207,7 +207,7 @@ void invasion_SpawnChosenMonster(Monster mon)
                setsize(e, mon.m_mins, mon.m_maxs);
 
                if(MoveToRandomMapLocation(e, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, 10, 1024, 256))
-                       monster = spawnmonster(e, tospawn, mon.monsterid, NULL, NULL, e.origin, false, false, 2);
+                       monster = spawnmonster(e, tospawn, mon, NULL, NULL, e.origin, false, false, 2);
                else
                {
                        delete(e);
@@ -215,7 +215,7 @@ void invasion_SpawnChosenMonster(Monster mon)
                }
        }
        else // if spawnmob field falls through (unset), fallback to mon (relying on spawnmonster for that behaviour)
-               monster = spawnmonster(spawn(), ((spawn_point.spawnmob && spawn_point.spawnmob != "") ? spawn_point.spawnmob : tospawn), mon.monsterid, spawn_point, spawn_point, spawn_point.origin, false, false, 2);
+               monster = spawnmonster(spawn(), ((spawn_point.spawnmob && spawn_point.spawnmob != "") ? spawn_point.spawnmob : tospawn), mon, spawn_point, spawn_point, spawn_point.origin, false, false, 2);
 
        if(!monster)
                return;
@@ -290,7 +290,7 @@ bool Invasion_CheckWinner()
 
        IL_EACH(g_monsters, GetResource(it, RES_HEALTH) > 0,
        {
-               if((get_monsterinfo(it.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER)
+               if(it.monsterdef.spawnflags & MON_FLAG_SUPERMONSTER)
                        ++supermonster_count;
                ++total_alive_monsters;
 
@@ -467,7 +467,7 @@ MUTATOR_HOOKFUNCTION(inv, MonsterSpawn)
 
        mon.monster_skill = inv_monsterskill;
 
-       if((get_monsterinfo(mon.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER)
+       if(mon.monsterdef.spawnflags & MON_FLAG_SUPERMONSTER)
                Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_INVASION_SUPERMONSTER, mon.monster_name);
 }
 
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..cf21ab0d3770d596e9ddccbd78c42970b2401442 100644 (file)
@@ -1 +1,21 @@
 #pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_Keepaway(vector pos, vector mySize);
+#endif
+CLASS(Keepaway, Gametype)
+    INIT(Keepaway)
+    {
+        this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=30",_("Hold the ball to get points for kills"));
+    }
+    METHOD(Keepaway, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        return true;
+    }
+#ifdef CSQC
+    ATTRIB(Keepaway, m_modicons, void(vector pos, vector mySize), HUD_Mod_Keepaway);
+#endif
+ENDCLASS(Keepaway)
+REGISTER_GAMETYPE(KEEPAWAY, NEW(Keepaway));
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..cc9cecdaf2a19aaabf2281fcad12b4b7e104d22b 100644 (file)
@@ -1 +1,46 @@
 #pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_KH(vector pos, vector mySize);
+#endif
+CLASS(KeyHunt, Gametype)
+    INIT(KeyHunt)
+    {
+        this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0",_("Gather all the keys to win the round"));
+    }
+    METHOD(KeyHunt, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_keyhunt_teams", cvar_defstring("g_keyhunt_teams"));
+            return true;
+        }
+        switch (k) {
+            case "teams":
+                cvar_set("g_keyhunt_teams", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(KeyHunt, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        if(spawnpoints >= 12 && diameter > 5120)
+            return true;
+        return false;
+    }
+    METHOD(KeyHunt, m_setTeams, void(string sa))
+    {
+        cvar_set("g_keyhunt_teams", sa);
+    }
+    METHOD(KeyHunt, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit",     "g_keyhunt_teams_override",     _("The amount of points needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(KeyHunt, m_modicons, void(vector pos, vector mySize), HUD_Mod_KH);
+#endif
+    ATTRIB(KeyHunt, m_legacydefaults, string, "1000 20 3 0");
+ENDCLASS(KeyHunt)
+REGISTER_GAMETYPE(KEYHUNT, NEW(KeyHunt));
index fcf63d7cc9eb7b8ec640083f63c8e39fdc92820c..11f7446644eaa2772495d0bcd946ea9c5fa5f667 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/lms/lms.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/lms/cl_lms.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/lms/sv_lms.qc>
 #endif
index 51c1ee15f4d571cbb551c755ce6049c585f9d583..1b1143f4bb7c947f4190dfed9bda1e3317763ba8 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/lms/lms.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/lms/cl_lms.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/lms/sv_lms.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc b/qcsrc/common/gamemodes/gamemode/lms/cl_lms.qc
new file mode 100644 (file)
index 0000000..649f964
--- /dev/null
@@ -0,0 +1,30 @@
+#include "cl_lms.qh"
+
+REGISTER_MUTATOR(cl_lms, true);
+
+MUTATOR_HOOKFUNCTION(cl_lms, DrawInfoMessages)
+{
+       if(!warmup_stage && ISGAMETYPE(LMS))
+       {
+               entity sk = playerslots[player_localnum];
+               vector pos = M_ARGV(0, vector);
+               vector mySize = M_ARGV(1, vector);
+               vector fontsize = '0.2 0.2 0' * mySize.y;
+               int img_curr_group = M_ARGV(2, int);
+               if(sk.(scores(ps_primary)) >= 666)
+               {
+                       InfoMessage(_("^1Match has already begun"));
+                       M_ARGV(0, vector) = pos;
+                       M_ARGV(2, int) = img_curr_group;
+                       return true;
+               }
+               else if(sk.(scores(ps_primary)) > 0)
+               {
+                       InfoMessage(_("^1You have no more lives left"));
+                       M_ARGV(0, vector) = pos;
+                       M_ARGV(2, int) = img_curr_group;
+                       return true;
+               }
+       }
+       return false;
+}
diff --git a/qcsrc/common/gamemodes/gamemode/lms/cl_lms.qh b/qcsrc/common/gamemodes/gamemode/lms/cl_lms.qh
new file mode 100644 (file)
index 0000000..6f70f09
--- /dev/null
@@ -0,0 +1 @@
+#pragma once
diff --git a/qcsrc/common/gamemodes/gamemode/lms/lms.qc b/qcsrc/common/gamemodes/gamemode/lms/lms.qc
new file mode 100644 (file)
index 0000000..92fb7df
--- /dev/null
@@ -0,0 +1 @@
+#include "lms.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/lms/lms.qh b/qcsrc/common/gamemodes/gamemode/lms/lms.qh
new file mode 100644 (file)
index 0000000..8a208c5
--- /dev/null
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+CLASS(LastManStanding, Gametype)
+    INIT(LastManStanding)
+    {
+        this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_HIDELIMITS,"","timelimit=20 lives=5 leadlimit=0",_("Survive and kill until the enemies have no lives left"));
+    }
+    METHOD(LastManStanding, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        return true;
+    }
+    METHOD(LastManStanding, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Lives:"),           3,   50,  1, "g_lms_lives_override",      string_null,                    string_null);
+    }
+    ATTRIB(LastManStanding, m_legacydefaults, string, "9 20 0");
+ENDCLASS(LastManStanding)
+REGISTER_GAMETYPE(LMS, NEW(LastManStanding));
index 5a6b42dc467ecc5e17927f77fb97356d8bdbec61..19b7b63ce4912d424950877f576de9f64dd2ff8b 100644 (file)
@@ -42,3 +42,8 @@ MUTATOR_HOOKFUNCTION(cl_nb, WantEventchase)
                return true;
        return false;
 }
+
+MUTATOR_HOOKFUNCTION(cl_nb, DrawScoreboardAccuracy)
+{
+       return ISGAMETYPE(NEXBALL); // accuracy is not a factor in this gamemode
+}
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..9a8fca3ab9c874d6745217ce71e8add77791d6b3 100644 (file)
@@ -1 +1,33 @@
 #pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_NexBall(vector pos, vector mySize);
+#endif
+CLASS(NexBall, Gametype)
+    INIT(NexBall)
+    {
+        this.gametype_init(this, _("Nexball"),"nb","g_nexball",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 pointlimit=5 leadlimit=0",_("Shoot and kick the ball into the enemies goal, keep your goal clean"));
+    }
+    METHOD(NexBall, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(substring(v, 0, 8) == "nexball_" || substring(v, 0, 4) == "ball")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(NexBall, m_isTwoBaseMode, bool())
+    {
+        return true;
+    }
+    METHOD(NexBall, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Goals:"),           1,   50,  1, "g_nexball_goallimit",       string_null,                    _("The amount of goals needed before the match will end"));
+    }
+#ifdef CSQC
+    ATTRIB(NexBall, m_modicons, void(vector pos, vector mySize), HUD_Mod_NexBall);
+#endif
+    ATTRIB(NexBall, m_legacydefaults, string, "5 20 0");
+ENDCLASS(NexBall)
+REGISTER_GAMETYPE(NEXBALL, NEW(NexBall));
+#define g_nexball IS_GAMETYPE(NEXBALL)
index ccabc47a518c502e9196af25e26a632032e23773..bde6340798bc057586660158a61df0a01a17f0de 100644 (file)
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <common/weapons/_all.qh>
+
 CLASS(BallStealer, PortoLaunch)
 /* flags     */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM);
 /* impulse   */ ATTRIB(BallStealer, impulse, int, 0);
index add678d7b3f513389689f3c59f3a5c56005156fe..0c375494bca1ea501f5fa1d51383fc0a32cee30a 100644 (file)
@@ -1,5 +1,26 @@
 #pragma once
 
+#include <common/mapinfo.qh>
+
+CLASS(Onslaught, Gametype)
+    INIT(Onslaught)
+    {
+        this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",GAMETYPE_FLAG_TEAMPLAY,"","pointlimit=1 timelimit=20",_("Capture control points to reach and destroy the enemy generator"));
+    }
+    METHOD(Onslaught, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "onslaught_generator")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(Onslaught, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
+    }
+    ATTRIB(Onslaught, m_legacydefaults, string, "20 0");
+ENDCLASS(Onslaught)
+REGISTER_GAMETYPE(ONSLAUGHT, NEW(Onslaught));
+
 #ifdef GAMEQC
 REGISTER_NET_LINKED(ENT_CLIENT_GENERATOR)
 REGISTER_NET_LINKED(ENT_CLIENT_CONTROLPOINT_ICON)
index 9675634ec7b5c64780e8707421028ef821b7b11f..1f3e43378c71919fce84baf73f2d26e2e59d4587 100644 (file)
@@ -998,7 +998,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(ONS_GENERATOR_ALARM), VOL_BASE, ATTEN_NONE);
+                       soundto(MSG_ONE, this, CHAN_AUTO, SND(ONS_GENERATOR_ALARM), VOL_BASE, ATTEN_NONE, 0);
                }
                else
                        Send_Notification(NOTIF_ONE, it, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_ONS_NOTSHIELDED));
index 5ed2c9598192123438f5821ffcc251858853bc50..f7c47947a691aeec9641dc45b9633476fe42cb25 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/race/race.qc>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/race/cl_race.qc>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/race/sv_race.qc>
 #endif
index 1e76e7af30bc562380d86abfc7abf9d2894bee89..52348a2197c8ae24f1685824634712940760d942 100644 (file)
@@ -1,4 +1,8 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/race/race.qh>
+#ifdef CSQC
+    #include <common/gamemodes/gamemode/race/cl_race.qh>
+#endif
 #ifdef SVQC
     #include <common/gamemodes/gamemode/race/sv_race.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/race/cl_race.qc b/qcsrc/common/gamemodes/gamemode/race/cl_race.qc
new file mode 100644 (file)
index 0000000..c2346a4
--- /dev/null
@@ -0,0 +1,183 @@
+#include "cl_race.qh"
+
+// Race/CTS HUD mod icons
+float crecordtime_prev; // last remembered crecordtime
+float crecordtime_change_time; // time when crecordtime last changed
+float srecordtime_prev; // last remembered srecordtime
+float srecordtime_change_time; // time when srecordtime last changed
+
+float race_status_time;
+int race_status_prev;
+string race_status_name_prev;
+
+// Check if the given name already exist in race rankings? In that case, where? (otherwise return 0)
+int race_CheckName(string net_name)
+{
+       int rank = 0;
+       string zoned_name = strzone(strdecolorize(entcs_GetName(player_localnum)));
+       for (int i = RANKINGS_CNT - 1; i >= 0; --i)
+               if (strdecolorize(grecordholder[i]) == zoned_name)
+               {
+                       rank = i + 1;
+                       break;
+               }
+       strfree(zoned_name);
+       return rank;
+}
+
+void race_showTime(string text, vector pos, vector timeText_ofs, float theTime, vector textSize, float f)
+{
+       drawstring_aspect(pos, text, textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawstring_aspect(pos + timeText_ofs, TIME_ENCODED_TOSTRING(theTime), textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+       if (f < 1) {
+               drawstring_aspect_expanding(pos, text, textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
+               drawstring_aspect_expanding(pos + timeText_ofs, TIME_ENCODED_TOSTRING(theTime), textSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, f);
+       }
+}
+
+void HUD_Mod_Race(vector pos, vector mySize)
+{
+       entity me = playerslots[player_localnum];
+       float score = me.(scores(ps_primary));
+
+       if(!(scores_flags(ps_primary) & SFL_TIME) || teamplay) // race/cts record display on HUD
+       {
+               mod_active = 0; // hide it in this case!
+               return; // no records in the actual race
+       }
+
+       mod_active = 1;
+
+       // clientside personal record
+       string rr;
+       if(ISGAMETYPE(CTS))
+               rr = CTS_RECORD;
+       else
+               rr = RACE_RECORD;
+       float t = stof(db_get(ClientProgsDB, strcat(shortmapname, rr, "time")));
+
+       if(score && (score < t || !t)) {
+               db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
+               if(autocvar_cl_autodemo_delete_keeprecords)
+               {
+                       float f = autocvar_cl_autodemo_delete;
+                       f &= ~1;
+                       cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
+               }
+       }
+
+       if(t != crecordtime_prev) {
+               crecordtime_prev = t;
+               crecordtime_change_time = time;
+       }
+
+       vector textPos, medalPos;
+       float squareSize;
+       if(mySize.x > mySize.y) {
+               // text on left side
+               squareSize = min(mySize.y, mySize.x/2);
+               vector ofs = vec2(0.5 * max(0, mySize.x/2 - squareSize), 0.5 * (mySize.y - squareSize));
+               textPos = pos + ofs;
+               ofs.x += 0.5 * mySize.x;
+               medalPos = pos + ofs;
+       } else {
+               // text on top
+               squareSize = min(mySize.x, mySize.y/2);
+               vector ofs = vec2(0.5 * (mySize.x - squareSize), 0.5 * max(0, mySize.y/2 - squareSize));
+               textPos = pos + ofs;
+               ofs.y += 0.5 * mySize.y;
+               medalPos = pos + ofs;
+       }
+       vector textSize = vec2(squareSize, 0.25 * squareSize);
+
+       race_showTime(_("Personal best"), textPos, eY * 0.25 * squareSize, t, textSize, time - crecordtime_change_time);
+
+       // server record
+       t = race_server_record;
+       if(t != srecordtime_prev) {
+               srecordtime_prev = t;
+               srecordtime_change_time = time;
+       }
+
+       textPos += eY * 0.5 * squareSize;
+       race_showTime(_("Server best"), textPos, eY * 0.25 * squareSize, t, textSize, time - srecordtime_change_time);
+
+       if (race_status != race_status_prev || race_status_name != race_status_name_prev) {
+               race_status_time = time + 5;
+               race_status_prev = race_status;
+               strcpy(race_status_name_prev, race_status_name);
+       }
+
+       // race "awards"
+       float a = bound(0, race_status_time - time, 1);
+       string s = textShortenToWidth(ColorTranslateRGB(race_status_name), squareSize, '1 1 0' * 0.1 * squareSize, stringwidth_colors);
+
+       float rank = 0;
+       if(race_status > 0)
+               rank = race_CheckName(race_status_name);
+       string rankname = count_ordinal(rank);
+       vector namepos = medalPos + '0 0.8 0' * squareSize;
+       vector rankpos = medalPos + '0 0.15 0' * squareSize;
+
+       if(race_status == 0)
+               drawpic_aspect_skin(medalPos, "race_newfail", '1 1 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+       else if(race_status == 1) {
+               drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newtime", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+       } else if(race_status == 2) {
+               if(strdecolorize(race_status_name) == strdecolorize(entcs_GetName(player_localnum)) || !race_myrank || race_myrank < rank)
+                       drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrankgreen", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               else
+                       drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrankyellow", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+       } else if(race_status == 3) {
+               drawpic_aspect_skin(medalPos + '0.1 0 0' * squareSize, "race_newrecordserver", '1 1 0' * 0.8 * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring_aspect(namepos, s, '1 0.2 0' * squareSize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
+               drawstring_aspect(rankpos, rankname, '1 0.15 0' * squareSize, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+       }
+
+       if (race_status_time - time <= 0) {
+               race_status_prev = -1;
+               race_status = -1;
+               strfree(race_status_name);
+               strfree(race_status_name_prev);
+       }
+}
+
+REGISTER_MUTATOR(cl_race, true);
+
+MUTATOR_HOOKFUNCTION(cl_race, HUD_Physics_showoptional)
+{
+       return ISGAMETYPE(RACE); // show the optional physics panel
+}
+
+MUTATOR_HOOKFUNCTION(cl_race, HUD_Score_show)
+{
+       return spectatee_status == -1 && ISGAMETYPE(RACE); // hide the score panel while observing
+}
+
+MUTATOR_HOOKFUNCTION(cl_race, ShowRankings)
+{
+       if(ISGAMETYPE(RACE))
+       {
+               M_ARGV(0, string) = _("Rankings");
+               return true;
+       }
+}
+
+MUTATOR_HOOKFUNCTION(cl_race, DrawScoreboardAccuracy)
+{
+       return ISGAMETYPE(RACE); // accuracy is not a factor in this gamemode
+}
+
+MUTATOR_HOOKFUNCTION(cl_race, ShowRaceTimer)
+{
+       return ISGAMETYPE(RACE); // show the race timer panel
+}
+
+MUTATOR_HOOKFUNCTION(cl_race, TeamRadar_Draw)
+{
+       return ISGAMETYPE(RACE); // show all competitors in a race
+}
diff --git a/qcsrc/common/gamemodes/gamemode/race/cl_race.qh b/qcsrc/common/gamemodes/gamemode/race/cl_race.qh
new file mode 100644 (file)
index 0000000..8ed2e3a
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+void HUD_Mod_Race(vector pos, vector mySize);
diff --git a/qcsrc/common/gamemodes/gamemode/race/race.qc b/qcsrc/common/gamemodes/gamemode/race/race.qc
new file mode 100644 (file)
index 0000000..f41a747
--- /dev/null
@@ -0,0 +1 @@
+#include "race.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/race/race.qh b/qcsrc/common/gamemodes/gamemode/race/race.qh
new file mode 100644 (file)
index 0000000..2eed343
--- /dev/null
@@ -0,0 +1,46 @@
+#pragma once
+
+#include <common/mapinfo.qh>
+
+#ifdef CSQC
+void HUD_Mod_Race(vector pos, vector mySize);
+#endif
+CLASS(Race, Gametype)
+    INIT(Race)
+    {
+        this.gametype_init(this, _("Race"),"rc","g_race",GAMETYPE_FLAG_USEPOINTS,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0",_("Race against other players to the finish line"));
+    }
+    METHOD(Race, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_race_qualifying_timelimit", cvar_defstring("g_race_qualifying_timelimit"));
+            return true;
+        }
+        switch (k) {
+            case "qualifying_timelimit":
+                cvar_set("g_race_qualifying_timelimit", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(Race, m_generate_mapinfo, void(Gametype this, string v))
+    {
+        if(v == "trigger_race_checkpoint")
+            MapInfo_Map_supportedGametypes |= this.m_flags;
+    }
+    METHOD(Race, m_isTwoBaseMode, bool())
+    {
+        return true;
+    }
+    METHOD(Race, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Laps:"),            1,   25,  1, "g_race_laps_limit",         string_null,                    string_null);
+    }
+#ifdef CSQC
+    ATTRIB(Race, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
+#endif
+    ATTRIB(Race, m_legacydefaults, string, "20 5 7 15 0");
+ENDCLASS(Race)
+REGISTER_GAMETYPE(RACE, NEW(Race));
+#define g_race IS_GAMETYPE(RACE)
index 5c0e949a8ae1a6c6eaf3a795fbb1ab8a5a9ca6d5..bea3814f00e5d0d887f6eb40cb6d3dcdaf46eb43 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/tdm/tdm.qc>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/tdm/sv_tdm.qc>
 #endif
index 5be8ea6e6fa7b2537c6e7469d95785ee06f67857..4ff6f48a0438604e2ad5b9f2e79d69c0e65e49c3 100644 (file)
@@ -1,4 +1,5 @@
 // generated file; do not modify
+#include <common/gamemodes/gamemode/tdm/tdm.qh>
 #ifdef SVQC
     #include <common/gamemodes/gamemode/tdm/sv_tdm.qh>
 #endif
diff --git a/qcsrc/common/gamemodes/gamemode/tdm/tdm.qc b/qcsrc/common/gamemodes/gamemode/tdm/tdm.qc
new file mode 100644 (file)
index 0000000..ca84d01
--- /dev/null
@@ -0,0 +1 @@
+#include "tdm.qh"
diff --git a/qcsrc/common/gamemodes/gamemode/tdm/tdm.qh b/qcsrc/common/gamemodes/gamemode/tdm/tdm.qh
new file mode 100644 (file)
index 0000000..d0e2394
--- /dev/null
@@ -0,0 +1,52 @@
+#pragma once
+
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
+#include <common/mapinfo.qh>
+
+CLASS(TeamDeathmatch, Gametype)
+    INIT(TeamDeathmatch)
+    {
+        this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",GAMETYPE_FLAG_TEAMPLAY | GAMETYPE_FLAG_USEPOINTS | GAMETYPE_FLAG_PRIORITY,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Help your team score the most frags against the enemy team"));
+    }
+    METHOD(TeamDeathmatch, m_parse_mapinfo, bool(string k, string v))
+    {
+        if (!k) {
+            cvar_set("g_tdm_teams", cvar_defstring("g_tdm_teams"));
+            return true;
+        }
+        switch (k) {
+            case "teams":
+                cvar_set("g_tdm_teams", v);
+                return true;
+        }
+        return false;
+    }
+    METHOD(TeamDeathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
+    {
+        if(spawnpoints >= 8 && diameter > 4096)
+            return true;
+        return false;
+    }
+    METHOD(TeamDeathmatch, m_isForcedSupported, bool(Gametype this))
+    {
+        if(cvar("g_tdm_on_dm_maps"))
+        {
+            // if this is set, all DM maps support TDM too
+            if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
+                return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
+        }
+        return false;
+    }
+    METHOD(TeamDeathmatch, m_setTeams, void(string sa))
+    {
+        cvar_set("g_tdm_teams", sa);
+    }
+    METHOD(TeamDeathmatch, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
+    {
+        TC(Gametype, this);
+        returns(menu, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit",         "g_tdm_teams_override",         _("The amount of points needed before the match will end"));
+    }
+    ATTRIB(TeamDeathmatch, m_legacydefaults, string, "50 20 2 0");
+ENDCLASS(TeamDeathmatch)
+REGISTER_GAMETYPE(TEAM_DEATHMATCH, NEW(TeamDeathmatch));
+#define g_tdm IS_GAMETYPE(TEAM_DEATHMATCH)
index 23de32c7ca1767aecb8adc9f92f3fd5a961335d0..26eb8e4b60f64c3dd85d2c66cec13ca5d9448c53 100644 (file)
@@ -611,7 +611,7 @@ void _MapInfo_Map_ApplyGametypeEx(string s, Gametype pWantedType, Gametype pThis
        }
 }
 
-Gametype MapInfo_Type_FromString(string gtype)
+Gametype MapInfo_Type_FromString(string gtype, bool dowarn)
 {
        string replacement = "";
        bool do_warn = true;
@@ -632,7 +632,7 @@ Gametype MapInfo_Type_FromString(string gtype)
        }
        if (replacement != "")
        {
-               if(do_warn && WARN_COND)
+               if (dowarn && WARN_COND)
                        LOG_WARNF("MapInfo_Type_FromString (probably %s): using deprecated name '%s'. Should use '%s'.", MapInfo_Map_bspname, gtype, replacement);
                gtype = replacement;
        }
@@ -1150,7 +1150,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                else if(t == "type")
                {
                        t = car(s); s = cdr(s);
-                       Gametype f = MapInfo_Type_FromString(t);
+                       Gametype f = MapInfo_Type_FromString(t, true);
                        //if(WARN_COND)
                                //LOG_WARN("Map ", pFilename, " contains the legacy 'type' keyword which is deprecated and will be removed in the future. Please migrate the mapinfo file to 'gametype'.");
                        if(f)
@@ -1161,7 +1161,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                else if(t == "gametype")
                {
                        t = car(s); s = cdr(s);
-                       Gametype f = MapInfo_Type_FromString(t);
+                       Gametype f = MapInfo_Type_FromString(t, true);
                        if(f)
                                _MapInfo_Map_ApplyGametypeEx (s, pGametypeToSet, f);
                        else if(WARN_COND)
@@ -1212,7 +1212,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        t = car(s); s = cdr(s);
                        bool all = t == "all";
                        Gametype f = NULL;
-                       if(all || (f = MapInfo_Type_FromString(t)))
+                       if(all || (f = MapInfo_Type_FromString(t, true)))
                        {
                                if((all ? MAPINFO_TYPE_ALL : f.m_flags) & pGametypeToSet.m_flags)
                                {
@@ -1229,7 +1229,7 @@ float MapInfo_Get_ByName_NoFallbacks(string pFilename, int pAllowGenerate, Gamet
                        t = car(s); s = cdr(s);
                        bool all = t == "all";
                        Gametype f = NULL;
-                       if(all || (f = MapInfo_Type_FromString(t)))
+                       if(all || (f = MapInfo_Type_FromString(t, true)))
                        {
                                if((all ? MAPINFO_TYPE_ALL : f.m_flags) & pGametypeToSet.m_flags)
                                {
@@ -1378,7 +1378,7 @@ int MapInfo_CurrentFeatures()
 
 Gametype MapInfo_CurrentGametype()
 {
-       Gametype prev = REGISTRY_GET(Gametypes, cvar("gamecfg"));
+       Gametype prev = MapInfo_Type_FromString(cvar_string("gamecfg"), false);
        FOREACH(Gametypes, cvar(it.netname) && it != prev, return it);
        return prev ? prev : MAPINFO_TYPE_DEATHMATCH;
 }
@@ -1462,7 +1462,7 @@ string MapInfo_ListAllAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
 void MapInfo_LoadMapSettings_SaveGameType(Gametype t)
 {
        MapInfo_SwitchGameType(t);
-       cvar_set("gamecfg", ftos(t.m_id));
+       cvar_set("gamecfg", t.mdl);
        MapInfo_LoadedGametype = t;
 }
 
@@ -1482,21 +1482,38 @@ void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
 
                if(MapInfo_Map_supportedGametypes == 0)
                {
-                       LOG_SEVERE("Mapinfo system is not functional at all. Assuming deathmatch.");
-                       MapInfo_Map_supportedGametypes = MAPINFO_TYPE_DEATHMATCH.m_flags;
-                       MapInfo_LoadMapSettings_SaveGameType(MAPINFO_TYPE_DEATHMATCH);
-                       _MapInfo_Map_ApplyGametypeEx("", MAPINFO_TYPE_DEATHMATCH, MAPINFO_TYPE_DEATHMATCH);
+                       RandomSelection_Init();
+                       FOREACH(Gametypes, it.m_priority == 2, 
+                       {
+                               MapInfo_Map_supportedGametypes |= it.m_flags;
+                               RandomSelection_AddEnt(it, 1, 1);
+                       });
+                       if(RandomSelection_chosen_ent)
+                               t = RandomSelection_chosen_ent;
+                       LOG_SEVEREF("Mapinfo system is not functional at all. Falling back to a preferred mode (%s).", t.mdl);
+                       MapInfo_LoadMapSettings_SaveGameType(t);
+                       _MapInfo_Map_ApplyGametypeEx("", t, t);
                        return; // do not call Get_ByName!
                }
 
+#if 0
+               // find the lowest bit in the supported gametypes
+               // unnecessary now that we select one at random
                int _t = 1;
                while(!(MapInfo_Map_supportedGametypes & 1))
                {
                        _t <<= 1;
                        MapInfo_Map_supportedGametypes = floor(MapInfo_Map_supportedGametypes >> 1);
                }
+#endif
+               RandomSelection_Init();
                Gametype t_prev = t;
-               FOREACH(Gametypes, it.m_flags == _t, { t = it; break; });
+               FOREACH(Gametypes, MapInfo_Map_supportedGametypes & it.m_flags,
+               {
+                       RandomSelection_AddEnt(it, 1, it.m_priority);
+               });
+               if(RandomSelection_chosen_ent)
+                       t = RandomSelection_chosen_ent;
 
                // t is now a supported mode!
                LOG_WARNF("can't play the selected map in the given game mode (%s). Falling back to a supported mode (%s).", t_prev.mdl, t.mdl);
index 43f5b30cfa993e7df3184a1c37e8204200f536c2..18044b1b45e5e45a69a13b9ea797e63062f687f8 100644 (file)
@@ -16,6 +16,12 @@ int MapInfo_Map_flags;
 vector MapInfo_Map_mins; // these are '0 0 0' if not supported!
 vector MapInfo_Map_maxs; // these are '0 0 0' if not specified!
 
+const int GAMETYPE_FLAG_TEAMPLAY        = BIT(0); // teamplay based
+const int GAMETYPE_FLAG_USEPOINTS       = BIT(1); // gametype has point-based scoring
+const int GAMETYPE_FLAG_PREFERRED       = BIT(2); // preferred (when available) in random selections
+const int GAMETYPE_FLAG_PRIORITY        = BIT(3); // priority selection when preferred gametype isn't available in random selections
+const int GAMETYPE_FLAG_HIDELIMITS      = BIT(4); // don't display a score limit needed for winning the match in the scoreboard
+
 int MAPINFO_TYPE_ALL;
 .int m_flags;
 
@@ -33,13 +39,18 @@ CLASS(Gametype, Object)
     ATTRIB(Gametype, team, bool, false);
     /** does this gametype use a point limit? */
     ATTRIB(Gametype, frags, bool, true);
+    /** should this gametype display a score limit in the scoreboard? */
+    ATTRIB(Gametype, m_hidelimits, bool, false);
     /** game type defaults */
     ATTRIB(Gametype, model2, string);
     /** game type description */
     ATTRIB(Gametype, gametype_description, string);
+    /** game type priority in random selections */
+    ATTRIB(Gametype, m_priority, int, 0);
 #ifdef CSQC
     ATTRIB(Gametype, m_modicons, void(vector pos, vector mySize));
     ATTRIB(Gametype, m_modicons_reset, void());
+    ATTRIB(Gametype, m_modicons_export, void(int fh));
 #endif
 
     /** DO NOT USE, this is compatibility for legacy maps! */
@@ -84,530 +95,35 @@ CLASS(Gametype, Object)
         returns(this.message, strcat("gametype_", this.mdl));
     }
 
-    METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, bool gteamplay, bool gusepoints, string mutators, string defaults, string gdescription))
+    METHOD(Gametype, gametype_init, void(Gametype this, string hname, string sname, string g_name, int gflags, string mutators, string defaults, string gdescription))
     {
         this.netname = g_name;
         this.mdl = sname;
         this.message = hname;
-        this.team = gteamplay;
+        this.team = (gflags & GAMETYPE_FLAG_TEAMPLAY);
         this.m_mutators = cons(sname, mutators);
         this.model2 = defaults;
         this.gametype_description = gdescription;
-        this.frags = gusepoints;
+        this.frags = (gflags & GAMETYPE_FLAG_USEPOINTS);
+        this.m_priority = ((gflags & GAMETYPE_FLAG_PREFERRED) ? 2 : ((gflags & GAMETYPE_FLAG_PRIORITY) ? 1 : 0));
+        this.m_hidelimits = (gflags & GAMETYPE_FLAG_HIDELIMITS);
 
         // same as `1 << m_id`
         MAPINFO_TYPE_ALL |= this.items = this.m_flags = (MAPINFO_TYPE_ALL + 1);
     }
 ENDCLASS(Gametype)
 
-REGISTRY(Gametypes, 24)
+REGISTRY(Gametypes, 32)
 REGISTER_REGISTRY(Gametypes)
+REGISTRY_SORT(Gametypes);
 REGISTRY_CHECK(Gametypes)
 
 REGISTRY_DEFINE_GET(Gametypes, NULL)
+STATIC_INIT(Gametypes_renumber) { FOREACH(Gametypes, true, it.m_id = i); }
 #define REGISTER_GAMETYPE(NAME, inst) REGISTER(Gametypes, MAPINFO_TYPE, NAME, m_id, inst)
 
 #define IS_GAMETYPE(NAME) (MapInfo_LoadedGametype == MAPINFO_TYPE_##NAME)
 
-CLASS(Deathmatch, Gametype)
-    INIT(Deathmatch)
-    {
-        this.gametype_init(this, _("Deathmatch"),"dm","g_dm",false,true,"","timelimit=15 pointlimit=30 leadlimit=0",_("Score as many frags as you can"));
-    }
-    METHOD(Deathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        return true;
-    }
-    ATTRIB(Deathmatch, m_legacydefaults, string, "30 20 0");
-ENDCLASS(Deathmatch)
-REGISTER_GAMETYPE(DEATHMATCH, NEW(Deathmatch));
-
-CLASS(LastManStanding, Gametype)
-    INIT(LastManStanding)
-    {
-        this.gametype_init(this, _("Last Man Standing"),"lms","g_lms",false,true,"","timelimit=20 lives=5 leadlimit=0",_("Survive and kill until the enemies have no lives left"));
-    }
-    METHOD(LastManStanding, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        return true;
-    }
-    METHOD(LastManStanding, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Lives:"),           3,   50,  1, "g_lms_lives_override",      string_null,                    string_null);
-    }
-    ATTRIB(LastManStanding, m_legacydefaults, string, "9 20 0");
-ENDCLASS(LastManStanding)
-REGISTER_GAMETYPE(LMS, NEW(LastManStanding));
-
-#ifdef CSQC
-void HUD_Mod_Race(vector pos, vector mySize);
-#endif
-CLASS(Race, Gametype)
-    INIT(Race)
-    {
-        this.gametype_init(this, _("Race"),"rc","g_race",false,true,"","timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0",_("Race against other players to the finish line"));
-    }
-    METHOD(Race, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_race_qualifying_timelimit", cvar_defstring("g_race_qualifying_timelimit"));
-            return true;
-        }
-        switch (k) {
-            case "qualifying_timelimit":
-                cvar_set("g_race_qualifying_timelimit", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(Race, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "trigger_race_checkpoint")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(Race, m_isTwoBaseMode, bool())
-    {
-        return true;
-    }
-    METHOD(Race, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Laps:"),            1,   25,  1, "g_race_laps_limit",         string_null,                    string_null);
-    }
-#ifdef CSQC
-    ATTRIB(Race, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
-#endif
-    ATTRIB(Race, m_legacydefaults, string, "20 5 7 15 0");
-ENDCLASS(Race)
-REGISTER_GAMETYPE(RACE, NEW(Race));
-#define g_race IS_GAMETYPE(RACE)
-
-CLASS(RaceCTS, Gametype)
-    INIT(RaceCTS)
-    {
-        this.gametype_init(this, _("Race CTS"),"cts","g_cts",false,false,"cloaked","timelimit=20",_("Race for fastest time."));
-    }
-    METHOD(RaceCTS, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "target_startTimer")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(RaceCTS, m_setTeams, void(string sa))
-    {
-        // this is the skill of the map
-        // not parsed by anything yet
-        // for map databases
-        //  cvar_set("fraglimit", sa);
-    }
-    METHOD(RaceCTS, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
-    }
-#ifdef CSQC
-    ATTRIB(RaceCTS, m_modicons, void(vector pos, vector mySize), HUD_Mod_Race);
-#endif
-    ATTRIB(RaceCTS, m_legacydefaults, string, "20 0 0");
-ENDCLASS(RaceCTS)
-REGISTER_GAMETYPE(CTS, NEW(RaceCTS));
-#define g_cts IS_GAMETYPE(CTS)
-
-CLASS(TeamDeathmatch, Gametype)
-    INIT(TeamDeathmatch)
-    {
-        this.gametype_init(this, _("Team Deathmatch"),"tdm","g_tdm",true,true,"","timelimit=15 pointlimit=50 teams=2 leadlimit=0",_("Help your team score the most frags against the enemy team"));
-    }
-    METHOD(TeamDeathmatch, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_tdm_teams", cvar_defstring("g_tdm_teams"));
-            return true;
-        }
-        switch (k) {
-            case "teams":
-                cvar_set("g_tdm_teams", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(TeamDeathmatch, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        if(spawnpoints >= 8 && diameter > 4096)
-            return true;
-        return false;
-    }
-    METHOD(TeamDeathmatch, m_isForcedSupported, bool(Gametype this))
-    {
-        if(cvar("g_tdm_on_dm_maps"))
-        {
-            // if this is set, all DM maps support TDM too
-            if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
-                return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
-        }
-        return false;
-    }
-    METHOD(TeamDeathmatch, m_setTeams, void(string sa))
-    {
-        cvar_set("g_tdm_teams", sa);
-    }
-    METHOD(TeamDeathmatch, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit",         "g_tdm_teams_override",         _("The amount of points needed before the match will end"));
-    }
-    ATTRIB(TeamDeathmatch, m_legacydefaults, string, "50 20 2 0");
-ENDCLASS(TeamDeathmatch)
-REGISTER_GAMETYPE(TEAM_DEATHMATCH, NEW(TeamDeathmatch));
-#define g_tdm IS_GAMETYPE(TEAM_DEATHMATCH)
-
-#ifdef CSQC
-void HUD_Mod_CTF(vector pos, vector mySize);
-void HUD_Mod_CTF_Reset();
-#endif
-CLASS(CaptureTheFlag, Gametype)
-    INIT(CaptureTheFlag)
-    {
-        this.gametype_init(this, _("Capture the Flag"),"ctf","g_ctf",true,true,"","timelimit=20 caplimit=10 leadlimit=6",_("Find and bring the enemy flag to your base to capture it, defend your base from the other team"));
-    }
-    METHOD(CaptureTheFlag, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "item_flag_team2" || v == "team_CTF_blueflag")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(CaptureTheFlag, m_isTwoBaseMode, bool())
-    {
-        return true;
-    }
-    METHOD(CaptureTheFlag, m_setTeams, void(string sa))
-    {
-        cvar_set("fraglimit", sa);
-    }
-    METHOD(CaptureTheFlag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Capture limit:"),   1,   20,  1, "capturelimit_override",     string_null,                    _("The amount of captures needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(CaptureTheFlag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CTF);
-    ATTRIB(CaptureTheFlag, m_modicons_reset, void(), HUD_Mod_CTF_Reset);
-#endif
-    ATTRIB(CaptureTheFlag, m_legacydefaults, string, "300 20 10 0");
-ENDCLASS(CaptureTheFlag)
-REGISTER_GAMETYPE(CTF, NEW(CaptureTheFlag));
-#define g_ctf IS_GAMETYPE(CTF)
-
-#ifdef CSQC
-void HUD_Mod_CA(vector pos, vector mySize);
-#endif
-CLASS(ClanArena, Gametype)
-    INIT(ClanArena)
-    {
-        this.gametype_init(this, _("Clan Arena"),"ca","g_ca",true,true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill all enemy teammates to win the round"));
-    }
-    METHOD(ClanArena, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_ca_teams", cvar_defstring("g_ca_teams"));
-            return true;
-        }
-        switch (k) {
-            case "teams":
-                cvar_set("g_ca_teams", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(ClanArena, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        if(spawnpoints >= 8 && diameter > 4096)
-            return true;
-        return false;
-    }
-    METHOD(ClanArena, m_setTeams, void(string sa))
-    {
-        cvar_set("g_ca_teams", sa);
-    }
-    METHOD(ClanArena, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Frag limit:"),      5,  100,  5, "fraglimit_override",        "g_ca_teams_override",          _("The amount of frags needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(ClanArena, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
-#endif
-    ATTRIB(ClanArena, m_legacydefaults, string, "10 20 0");
-ENDCLASS(ClanArena)
-REGISTER_GAMETYPE(CA, NEW(ClanArena));
-#define g_ca IS_GAMETYPE(CA)
-
-#ifdef CSQC
-void HUD_Mod_Dom(vector pos, vector mySize);
-#endif
-CLASS(Domination, Gametype)
-    INIT(Domination)
-    {
-        this.gametype_init(this, _("Domination"),"dom","g_domination",true,true,"","timelimit=20 pointlimit=200 teams=2 leadlimit=0",_("Capture and defend all the control points to win"));
-    }
-    METHOD(Domination, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_domination_default_teams", cvar_defstring("g_domination_default_teams"));
-            return true;
-        }
-        switch (k) {
-            case "teams":
-                cvar_set("g_domination_default_teams", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(Domination, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "dom_controlpoint")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(Domination, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),    50,  500, 10, "g_domination_point_limit",  "g_domination_teams_override",  _("The amount of points needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(Domination, m_modicons, void(vector pos, vector mySize), HUD_Mod_Dom);
-#endif
-    ATTRIB(Domination, m_legacydefaults, string, "200 20 0");
-ENDCLASS(Domination)
-REGISTER_GAMETYPE(DOMINATION, NEW(Domination));
-
-#ifdef CSQC
-void HUD_Mod_KH(vector pos, vector mySize);
-#endif
-CLASS(KeyHunt, Gametype)
-    INIT(KeyHunt)
-    {
-        this.gametype_init(this, _("Key Hunt"),"kh","g_keyhunt",true,true,"","timelimit=20 pointlimit=1000 teams=3 leadlimit=0",_("Gather all the keys to win the round"));
-    }
-    METHOD(KeyHunt, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_keyhunt_teams", cvar_defstring("g_keyhunt_teams"));
-            return true;
-        }
-        switch (k) {
-            case "teams":
-                cvar_set("g_keyhunt_teams", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(KeyHunt, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        if(spawnpoints >= 12 && diameter > 5120)
-            return true;
-        return false;
-    }
-    METHOD(KeyHunt, m_setTeams, void(string sa))
-    {
-        cvar_set("g_keyhunt_teams", sa);
-    }
-    METHOD(KeyHunt, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit",     "g_keyhunt_teams_override",     _("The amount of points needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(KeyHunt, m_modicons, void(vector pos, vector mySize), HUD_Mod_KH);
-#endif
-    ATTRIB(KeyHunt, m_legacydefaults, string, "1000 20 3 0");
-ENDCLASS(KeyHunt)
-REGISTER_GAMETYPE(KEYHUNT, NEW(KeyHunt));
-
-CLASS(Assault, Gametype)
-    INIT(Assault)
-    {
-        this.gametype_init(this, _("Assault"),"as","g_assault",true,false,"","timelimit=20",_("Destroy obstacles to find and destroy the enemy power core before time runs out"));
-    }
-    METHOD(Assault, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "target_assault_roundend")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(Assault, m_isTwoBaseMode, bool())
-    {
-        return true;
-    }
-    METHOD(Assault, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
-    }
-    ATTRIB(Assault, m_legacydefaults, string, "20 0");
-ENDCLASS(Assault)
-REGISTER_GAMETYPE(ASSAULT, NEW(Assault));
-#define g_assault IS_GAMETYPE(ASSAULT)
-
-CLASS(Onslaught, Gametype)
-    INIT(Onslaught)
-    {
-        this.gametype_init(this, _("Onslaught"),"ons","g_onslaught",true,false,"","pointlimit=1 timelimit=20",_("Capture control points to reach and destroy the enemy generator"));
-    }
-    METHOD(Onslaught, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "onslaught_generator")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(Onslaught, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
-    }
-    ATTRIB(Onslaught, m_legacydefaults, string, "20 0");
-ENDCLASS(Onslaught)
-REGISTER_GAMETYPE(ONSLAUGHT, NEW(Onslaught));
-
-#ifdef CSQC
-void HUD_Mod_NexBall(vector pos, vector mySize);
-#endif
-CLASS(NexBall, Gametype)
-    INIT(NexBall)
-    {
-        this.gametype_init(this, _("Nexball"),"nb","g_nexball",true,true,"","timelimit=20 pointlimit=5 leadlimit=0",_("Shoot and kick the ball into the enemies goal, keep your goal clean"));
-    }
-    METHOD(NexBall, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(substring(v, 0, 8) == "nexball_" || substring(v, 0, 4) == "ball")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(NexBall, m_isTwoBaseMode, bool())
-    {
-        return true;
-    }
-    METHOD(NexBall, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Goals:"),           1,   50,  1, "g_nexball_goallimit",       string_null,                    _("The amount of goals needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(NexBall, m_modicons, void(vector pos, vector mySize), HUD_Mod_NexBall);
-#endif
-    ATTRIB(NexBall, m_legacydefaults, string, "5 20 0");
-ENDCLASS(NexBall)
-REGISTER_GAMETYPE(NEXBALL, NEW(NexBall));
-#define g_nexball IS_GAMETYPE(NEXBALL)
-
-CLASS(FreezeTag, Gametype)
-    INIT(FreezeTag)
-    {
-        this.gametype_init(this, _("Freeze Tag"),"ft","g_freezetag",true,true,"","timelimit=20 pointlimit=10 teams=2 leadlimit=6",_("Kill enemies to freeze them, stand next to frozen teammates to revive them; freeze all enemies to win"));
-    }
-    METHOD(FreezeTag, m_parse_mapinfo, bool(string k, string v))
-    {
-        if (!k) {
-            cvar_set("g_freezetag_teams", cvar_defstring("g_freezetag_teams"));
-            return true;
-        }
-        switch (k) {
-            case "teams":
-                cvar_set("g_freezetag_teams", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(FreezeTag, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        if(spawnpoints >= 8 && diameter > 4096)
-            return true;
-        return false;
-    }
-    METHOD(FreezeTag, m_setTeams, void(string sa))
-    {
-        cvar_set("g_freezetag_teams", sa);
-    }
-    METHOD(FreezeTag, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Frag limit:"),      5,  100,  5, "fraglimit_override",        "g_freezetag_teams_override",   _("The amount of frags needed before the match will end"));
-    }
-#ifdef CSQC
-    ATTRIB(FreezeTag, m_modicons, void(vector pos, vector mySize), HUD_Mod_CA);
-#endif
-    ATTRIB(FreezeTag, m_legacydefaults, string, "10 20 0");
-ENDCLASS(FreezeTag)
-REGISTER_GAMETYPE(FREEZETAG, NEW(FreezeTag));
-#define g_freezetag IS_GAMETYPE(FREEZETAG)
-
-#ifdef CSQC
-void HUD_Mod_Keepaway(vector pos, vector mySize);
-#endif
-CLASS(Keepaway, Gametype)
-    INIT(Keepaway)
-    {
-        this.gametype_init(this, _("Keepaway"),"ka","g_keepaway",false,true,"","timelimit=20 pointlimit=30",_("Hold the ball to get points for kills"));
-    }
-    METHOD(Keepaway, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        return true;
-    }
-#ifdef CSQC
-    ATTRIB(Keepaway, m_modicons, void(vector pos, vector mySize), HUD_Mod_Keepaway);
-#endif
-ENDCLASS(Keepaway)
-REGISTER_GAMETYPE(KEEPAWAY, NEW(Keepaway));
-
-CLASS(Invasion, Gametype)
-    INIT(Invasion)
-    {
-        this.gametype_init(this, _("Invasion"),"inv","g_invasion",false,true,"","pointlimit=50 teams=0 type=0",_("Survive against waves of monsters"));
-    }
-    METHOD(Invasion, m_parse_mapinfo, bool(string k, string v))
-    {
-        switch (k) {
-            case "teams":
-                cvar_set("g_invasion_teams", v);
-                return true;
-            case "type":
-                cvar_set("g_invasion_type", v);
-                return true;
-        }
-        return false;
-    }
-    METHOD(Invasion, m_generate_mapinfo, void(Gametype this, string v))
-    {
-        if(v == "invasion_spawnpoint")
-            MapInfo_Map_supportedGametypes |= this.m_flags;
-    }
-    METHOD(Invasion, m_configuremenu, void(Gametype this, entity menu, void(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip) returns))
-    {
-        TC(Gametype, this);
-        returns(menu, _("Point limit:"),    50,  500, 10, string_null,                 string_null,                    string_null);
-    }
-ENDCLASS(Invasion)
-REGISTER_GAMETYPE(INVASION, NEW(Invasion));
-
-CLASS(Duel, Gametype)
-    INIT(Duel)
-    {
-        this.gametype_init(this, _("Duel"),"duel","g_duel",false,true,"","timelimit=10 pointlimit=0 leadlimit=0",_("Fight in a one versus one arena battle to decide the winner"));
-    }
-    METHOD(Duel, m_isAlwaysSupported, bool(Gametype this, int spawnpoints, float diameter))
-    {
-        return (diameter < 16384);
-    }
-    METHOD(Duel, m_isForcedSupported, bool(Gametype this))
-    {
-        if(!cvar("g_duel_not_dm_maps"))
-        {
-            // if this is set, all DM maps support duel too
-            // TODO: we should really check the size of maps, some DM maps do not work for duel!
-            if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags))
-                return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported)
-        }
-        return false;
-    }
-ENDCLASS(Duel)
-REGISTER_GAMETYPE(DUEL, NEW(Duel));
-#define g_duel IS_GAMETYPE(DUEL)
-
 const int MAPINFO_FEATURE_WEAPONS       = 1; // not defined for instagib-only maps
 const int MAPINFO_FEATURE_VEHICLES      = 2;
 const int MAPINFO_FEATURE_TURRETS       = 4;
@@ -659,7 +175,7 @@ string MapInfo_ListAllAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
 // gets a gametype from a string
 string _MapInfo_GetDefaultEx(Gametype t);
 float _MapInfo_GetTeamPlayBool(Gametype t);
-Gametype MapInfo_Type_FromString(string t);
+Gametype MapInfo_Type_FromString(string t, bool dowarn);
 string MapInfo_Type_Description(Gametype t);
 string MapInfo_Type_ToString(Gametype t);
 string MapInfo_Type_ToText(Gametype t);
index 60920fafb8c5c95599af7b2090570bfc30ae84d6..3c4229a098da8dd69eda7fe1549fd4a0b4f03ca4 100644 (file)
@@ -35,7 +35,7 @@ spawnfunc(func_bobbing)
        if (this.noise != "")
        {
                precache_sound(this.noise);
-               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE);
+               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE, 0);
        }
        if (!this.speed)
                this.speed = 4;
index e92af677cc565dabd71a4177c94b17983f0ab6a0..24d7139435dc9bc7dcb3c5e1bd1ece102611ea71 100644 (file)
@@ -187,7 +187,7 @@ void func_breakable_init_for_player(entity this, entity player)
        if (this.noise1 && this.state == STATE_ALIVE && IS_REAL_CLIENT(player))
        {
                msg_entity = player;
-               soundto (MSG_ONE, this, CH_TRIGGER_SINGLE, this.noise1, VOL_BASE, ATTEN_NORM);
+               soundto (MSG_ONE, this, CH_TRIGGER_SINGLE, this.noise1, VOL_BASE, ATTEN_NORM, 0);
        }
 }
 
index 28e0f0f7c74df039f84a7f2d111ca32a634f0844..73bb60536c110058e20360b1f8d63cfe508e0a34 100644 (file)
@@ -46,7 +46,7 @@ spawnfunc(func_fourier)
        if (this.noise != "")
        {
                precache_sound(this.noise);
-               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE);
+               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE, 0);
        }
 
        if (!this.speed)
index 6fb3a435aa59b7b557cf04b521f2e77a01367665..23cdf1d49f4ac454c8d6901070e9d90ab9df3199 100644 (file)
@@ -1,22 +1,45 @@
 #include "ladder.qh"
 REGISTER_NET_LINKED(ENT_CLIENT_LADDER)
 
-void func_ladder_touch(entity this, entity toucher)
+void func_ladder_think(entity this)
 {
-#ifdef SVQC
-       if (!toucher.iscreature)
-               return;
-       if(IS_VEHICLE(toucher))
-               return;
-#elif defined(CSQC)
-       if(!IS_PLAYER(toucher)) // don't allow non-player predicted entities!
-               return;
+#ifdef CSQC
+       // TODO: check if this is what is causing the glitchiness when switching between them
+       float dt = time - this.move_time;
+       this.move_time = time;
+       if(dt <= 0) { return; }
 #endif
 
-       EXACTTRIGGER_TOUCH(this, toucher);
+       // set myself as current ladders where possible
+       IL_EACH(g_ladderents, it.ladder_entity == this,
+       {
+               it.ladder_entity = NULL;
+               IL_REMOVE(g_ladderents, it);
+       });
 
-       toucher.ladder_time = time + 0.1;
-       toucher.ladder_entity = this;
+       FOREACH_ENTITY_RADIUS((this.absmin + this.absmax) * 0.5, vlen(this.absmax - this.absmin) * 0.5 + 1, !it.ladder_entity && IS_PLAYER(it) && it.move_movetype != MOVETYPE_NOCLIP && !IS_DEAD(it),
+       {
+               vector emin = it.absmin;
+               vector emax = it.absmax;
+               if(this.solid == SOLID_BSP || (IS_CSQC && this.solid == SOLID_TRIGGER)) // CSQC doesn't expand properly
+               {
+                       emin -= '1 1 1';
+                       emax += '1 1 1';
+               }
+               if(boxesoverlap(emin, emax, this.absmin, this.absmax)) // quick
+               {
+                       if(WarpZoneLib_BoxTouchesBrush(emin, emax, this, it)) // accurate
+                       {
+                               if(!it.ladder_entity)
+                                       IL_PUSH(g_ladderents, it);
+                               it.ladder_entity = this;
+                       }
+               }
+       });
+
+#ifdef SVQC
+       this.nextthink = time;
+#endif
 }
 
 #ifdef SVQC
@@ -41,9 +64,10 @@ void func_ladder_link(entity this)
 
 void func_ladder_init(entity this)
 {
-       settouch(this, func_ladder_touch);
        trigger_init(this);
        func_ladder_link(this);
+       setthink(this, func_ladder_think);
+       this.nextthink = time;
 
        if(min(this.absmax.x - this.absmin.x, this.absmax.y - this.absmin.y) > 100)
                return;
@@ -124,8 +148,15 @@ spawnfunc(func_water)
 #elif defined(CSQC)
 .float speed;
 
+void func_ladder_draw(entity this) { func_ladder_think(this); }
+
 void func_ladder_remove(entity this)
 {
+       IL_EACH(g_ladderents, it.ladder_entity == this,
+       {
+               it.ladder_entity = NULL;
+               IL_REMOVE(g_ladderents, it);
+       });
        strfree(this.classname);
 }
 
@@ -134,15 +165,22 @@ NET_HANDLE(ENT_CLIENT_LADDER, bool isnew)
        this.classname = strzone(ReadString());
        this.skin = ReadByte();
        this.speed = ReadCoord();
+       this.solid = SOLID_TRIGGER;
 
        trigger_common_read(this, false);
 
-       this.solid = SOLID_TRIGGER;
-       settouch(this, func_ladder_touch);
+       if(isnew)
+               IL_PUSH(g_drawables, this);
+       this.draw = func_ladder_draw;
        this.drawmask = MASK_NORMAL;
+
        this.move_time = time;
        this.entremove = func_ladder_remove;
 
+       // NOTE: CSQC's version of setorigin doesn't expand
+       this.absmin -= '1 1 1';
+       this.absmax += '1 1 1';
+
        return true;
 }
 #endif
index 26cbbda032b0422dc6f7e9c6e749be79a4ccd3d7..e087ba8410a341fb09d77f6fa338030a7d109b65 100644 (file)
@@ -1,4 +1,6 @@
 #pragma once
 
-.float ladder_time;
+IntrusiveList g_ladderents;
+STATIC_INIT(g_ladderents) { g_ladderents = IL_NEW(); }
+
 .entity ladder_entity;
index a59f7a93baf6a6427dc8b7813e020ec50e39ae54..c582f47f626f55d1ec528c35893775553d6a0c75 100644 (file)
@@ -28,7 +28,7 @@ spawnfunc(func_pendulum)
        if (this.noise != "")
        {
                precache_sound(this.noise);
-               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE);
+               soundto(MSG_INIT, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE, 0);
        }
 
        this.active = ACTIVE_ACTIVE;
index 35351ee08e0a69a882a90ed7043ae18d8072c7e0..1864b6dfe43062131b27f718971800b0414a97b0 100644 (file)
@@ -47,7 +47,7 @@ void func_rotating_init_for_player(entity this, entity player)
        if (this.noise && this.noise != "" && this.active == ACTIVE_ACTIVE && IS_REAL_CLIENT(player))
        {
                msg_entity = player;
-               soundto (MSG_ONE, this, CH_AMBIENT_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE);
+               soundto (MSG_ONE, this, CH_AMBIENT_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE, 0);
        }
 }
 
index 61da52acbc483daef7c55c1e9d136000d7ace990..4882fe37d83937798985bb545dd62c37783be626 100644 (file)
@@ -128,7 +128,7 @@ void func_vectormamamam_init_for_player(entity this, entity player)
        if (this.noise && this.noise != "" && this.active == ACTIVE_ACTIVE && IS_REAL_CLIENT(player))
        {
                msg_entity = player;
-               soundto(MSG_ONE, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE);
+               soundto(MSG_ONE, this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_IDLE, 0);
        }
 }
 
index 7166e46ca66ef0906aa0b653b831e6e6caa759dd..876fed7a7306cab48686a8adef6c1e18caf94e0c 100644 (file)
@@ -28,7 +28,7 @@ void target_changelevel_use(entity this, entity actor, entity trigger)
        }
 
        if(this.gametype != "")
-               MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype));
+               MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype, false));
 
        if (this.chmap == "")
        {
index 354f4ca6f6f2adbb3f6613d5d091f990dfc50784..6766139c5db5008758d1c203a52594dd599e7641 100644 (file)
@@ -28,7 +28,7 @@ void target_speaker_use_activator(entity this, entity actor, entity trigger)
        else
                snd = this.noise;
        msg_entity = actor;
-       soundto(MSG_ONE, this, CH_TRIGGER, snd, VOL_BASE * this.volume, this.atten);
+       soundto(MSG_ONE, this, CH_TRIGGER, snd, VOL_BASE * this.volume, this.atten, 0);
 }
 void target_speaker_use_on(entity this, entity actor, entity trigger)
 {
@@ -83,7 +83,7 @@ spawnfunc(target_speaker)
        if(this.noise)
                precache_sound (this.noise);
 
-       if(!this.atten && (this.spawnflags & SPEAKER_GLOBAL))
+       if(!this.atten && (this.spawnflags & SPEAKER_GLOBAL) && !(this.spawnflags & 3)) // special check for quake 3: looped sounds are never global
        {
                LOG_WARN("target_speaker uses legacy spawnflag GLOBAL (BIT(2)), please set atten to -1 instead");
                this.atten = -1;
index 987347283fb646e2b73e5569ccceb7d8a97a614f..ab9c8dca570c1a3b196973b85515beb952489545 100644 (file)
@@ -16,7 +16,7 @@
     #include "../deathtypes/all.qh"
     #include "../turrets/sv_turrets.qh"
     #include "../vehicles/all.qh"
-    #include "../mapinfo.qh"
+    #include <common/gamemodes/_mod.qh>
     #include <server/anticheat.qh>
 #endif
 
index 2c160eae95e8a05e75f1ead2512b81c257716242..5138419d1ada9546081f6ce63549bd14a389a74c 100644 (file)
@@ -571,8 +571,6 @@ float trigger_push_send(entity this, entity to, float sf)
        WriteByte(MSG_ENTITY, this.active);
        WriteCoord(MSG_ENTITY, this.height);
 
-       WriteVector(MSG_ENTITY, this.movedir);
-
        trigger_common_write(this, true);
 
        return true;
@@ -704,8 +702,6 @@ NET_HANDLE(ENT_CLIENT_TRIGGER_PUSH, bool isnew)
        this.active = ReadByte();
        this.height = ReadCoord();
 
-       this.movedir = ReadVector();
-
        trigger_common_read(this, true);
 
        this.entremove = trigger_remove_generic;
index 58840159ef60c60a386dbc5a817b3ad52ae93bc8..dfcacdc609b2da10aa47b4b1756be4d4dea6091e 100644 (file)
@@ -6,8 +6,6 @@ REGISTRY(Monsters, BITS(5))
 #define get_monsterinfo(i) REGISTRY_GET(Monsters, i)
 REGISTER_REGISTRY(Monsters)
 REGISTRY_CHECK(Monsters)
-const int MON_FIRST = 1;
-#define MON_LAST (REGISTRY_COUNT(Monsters) - 1)
 #define REGISTER_MONSTER(id, inst) REGISTER(Monsters, MON, id, monsterid, inst)
 
 #include "monster.qh"
index aba9c9aa9b66713607aa3f2c4d02412744b82e51..146f64d405533ca59aac5636f81720f16d922157 100644 (file)
@@ -17,6 +17,7 @@ const int MON_FLAG_HIDDEN = BIT(16);
 
 // entity properties of monsterinfo:
 .bool(int, entity actor, entity targ, .entity weaponentity) monster_attackfunc;
+.entity monsterdef;
 
 // animations
 .vector anim_blockend;
index 1cba349ed96e39fe5baa594b4f447b04d7af8651..8addac3531f58b4f02625b27d4082c078cf41371 100644 (file)
@@ -388,7 +388,7 @@ bool M_Mage_Attack(int attack_type, entity actor, entity targ, .entity weaponent
        return false;
 }
 
-spawnfunc(monster_mage) { Monster_Spawn(this, true, MON_MAGE.monsterid); }
+spawnfunc(monster_mage) { Monster_Spawn(this, true, MON_MAGE); }
 
 #endif // SVQC
 
index 2e3f02a0623a86f5591c5b922e0f8ce13ee27b7d..c67d90664267231a8e60df654a811425431d6795 100644 (file)
@@ -197,7 +197,7 @@ bool M_Shambler_Attack(int attack_type, entity actor, entity targ, .entity weapo
        return false;
 }
 
-spawnfunc(monster_shambler) { Monster_Spawn(this, true, MON_SHAMBLER.monsterid); }
+spawnfunc(monster_shambler) { Monster_Spawn(this, true, MON_SHAMBLER); }
 #endif // SVQC
 
 #ifdef SVQC
index d9a51c05e9a4649718deac200f0e5f4beeff9b6a..08d28218786524d462b6cf2d321b91aa38e899b0 100644 (file)
@@ -104,7 +104,7 @@ void M_Spider_Attack_Web_Explode(entity this)
                Send_Effect(EFFECT_ELECTRO_IMPACT, this.origin, '0 0 0', 1);
                RadiusDamage(this, this.realowner, 0, 0, 25, NULL, NULL, 25, this.projectiledeathtype, DMG_NOWEP, NULL);
 
-               FOREACH_ENTITY_RADIUS(this.origin, 25, it != this && it.takedamage && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && it.monsterid != MON_SPIDER.monsterid,
+               FOREACH_ENTITY_RADIUS(this.origin, 25, it != this && it.takedamage && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && it.monsterdef != MON_SPIDER,
                {
                        it.spider_slowness = time + (autocvar_g_monster_spider_attack_web_damagetime);
                });
@@ -185,7 +185,7 @@ bool M_Spider_Attack(int attack_type, entity actor, entity targ, .entity weapone
        return false;
 }
 
-spawnfunc(monster_spider) { Monster_Spawn(this, true, MON_SPIDER.monsterid); }
+spawnfunc(monster_spider) { Monster_Spawn(this, true, MON_SPIDER); }
 #endif // SVQC
 
 #ifdef SVQC
index 4de122e8494419205178cc87dc74f77957699c7f..0a811cb70b5ee9da3e259c03048e1516fa771703 100644 (file)
@@ -106,7 +106,7 @@ bool M_Wyvern_Attack(int attack_type, entity actor, entity targ, .entity weapone
        return false;
 }
 
-spawnfunc(monster_wyvern) { Monster_Spawn(this, true, MON_WYVERN.monsterid); }
+spawnfunc(monster_wyvern) { Monster_Spawn(this, true, MON_WYVERN); }
 #endif // SVQC
 
 #ifdef SVQC
index 3b2c0451b89a8657afd9d681c3cd39a97a48d744..70981fa00293ec65e4e4fec6b9d6d83a04a6e302 100644 (file)
@@ -125,7 +125,7 @@ bool M_Zombie_Attack(int attack_type, entity actor, entity targ, .entity weapone
        return false;
 }
 
-spawnfunc(monster_zombie) { Monster_Spawn(this, true, MON_ZOMBIE.monsterid); }
+spawnfunc(monster_zombie) { Monster_Spawn(this, true, MON_ZOMBIE); }
 #endif // SVQC
 
 #ifdef SVQC
index 4c2b5ff269a601b1ff502f3977f97af5552aa532..b938b10ed60b9e5149e00803f771b1ce297be15b 100644 (file)
@@ -78,7 +78,7 @@ bool Monster_ValidTarget(entity this, entity targ)
 
        if((targ == this)
        || (autocvar_g_monsters_lineofsight && !checkpvs(this.origin + this.view_ofs, targ)) // enemy cannot be seen
-       || (IS_VEHICLE(targ) && !((REGISTRY_GET(Monsters, this.monsterid)).spawnflags & MON_FLAG_RANGED)) // melee vs vehicle is useless
+       || (IS_VEHICLE(targ) && !(this.monsterdef.spawnflags & MON_FLAG_RANGED)) // melee vs vehicle is useless
        || (time < game_starttime) // monsters do nothing before match has started
        || (targ.takedamage == DAMAGE_NO)
        || (game_stopped)
@@ -260,7 +260,7 @@ void Monster_Sound_Precache(string f)
 
 void Monster_Sounds_Precache(entity this)
 {
-       string m = (REGISTRY_GET(Monsters, this.monsterid)).m_model.model_str();
+       string m = this.monsterdef.m_model.model_str();
        float globhandle, n, i;
        string f;
 
@@ -465,7 +465,7 @@ void Monster_UpdateModel(entity this)
        this.anim_die2   = animfixfps(this, '9 1 0.01', '0 0 0');*/
 
        // then get the real values
-       Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+       Monster mon = this.monsterdef;
        mon.mr_anim(mon, this);
 }
 
@@ -512,7 +512,7 @@ bool Monster_Respawn_Check(entity this)
        return true;
 }
 
-void Monster_Respawn(entity this) { Monster_Spawn(this, true, this.monsterid); }
+void Monster_Respawn(entity this) { Monster_Spawn(this, true, this); }
 
 .vector        pos1, pos2;
 
@@ -878,16 +878,16 @@ void Monster_Dead_Think(entity this)
 void Monster_Appear(entity this, entity actor, entity trigger)
 {
        this.enemy = actor;
-       Monster_Spawn(this, false, this.monsterid);
+       Monster_Spawn(this, false, this.monsterdef);
 }
 
-bool Monster_Appear_Check(entity this, int monster_id)
+bool Monster_Appear_Check(entity this, Monster monster_id)
 {
        if(!(this.spawnflags & MONSTERFLAG_APPEAR))
                return false;
 
        setthink(this, func_null);
-       this.monsterid = monster_id; // set so this monster is properly registered (otherwise, normal initialization is used)
+       this.monsterdef = monster_id; // set so this monster is properly registered (otherwise, normal initialization is used)
        this.nextthink = 0;
        this.use = Monster_Appear;
        this.flags = FL_MONSTER; // set so this monster can get butchered
@@ -977,7 +977,7 @@ void Monster_Dead(entity this, entity attacker, float gibbed)
 
        CSQCModel_UnlinkEntity(this);
 
-       Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+       Monster mon = this.monsterdef;
        mon.mr_death(mon, this);
 
        if(this.candrop && this.weapon)
@@ -1008,7 +1008,7 @@ void Monster_Damage(entity this, entity inflictor, entity attacker, float damage
        float take = v.x;
        //float save = v.y;
 
-       Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+       Monster mon = this.monsterdef;
        take = mon.mr_pain(mon, this, take, attacker, deathtype);
 
        if(take)
@@ -1236,7 +1236,7 @@ void Monster_Think(entity this)
                this.last_enemycheck = time + 1; // check for enemies every second
        }
 
-       Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+       Monster mon = this.monsterdef;
        if(mon.mr_think(mon, this))
        {
                Monster_Move(this, this.speed2, this.speed, this.stopspeed);
@@ -1252,7 +1252,7 @@ void Monster_Think(entity this)
 
 bool Monster_Spawn_Setup(entity this)
 {
-       Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+       Monster mon = this.monsterdef;
        mon.mr_setup(mon, this);
 
        // ensure some basic needs are met
@@ -1297,7 +1297,7 @@ bool Monster_Spawn_Setup(entity this)
        if(autocvar_g_monsters_healthbars)
        {
                entity wp = WaypointSprite_Spawn(WP_Monster, 0, 1024, this, '0 0 1' * (this.maxs.z + 15), NULL, this.team, this, sprite, true, RADARICON_DANGER);
-               wp.wp_extra = this.monsterid;
+               wp.wp_extra = this.monsterdef.monsterid;
                wp.colormod = ((this.team) ? Team_ColorRGB(this.team) : '1 0 0');
                if(!(this.spawnflags & MONSTERFLAG_INVINCIBLE))
                {
@@ -1315,12 +1315,11 @@ bool Monster_Spawn_Setup(entity this)
        return true;
 }
 
-bool Monster_Spawn(entity this, bool check_appear, int mon_id)
+bool Monster_Spawn(entity this, bool check_appear, Monster mon)
 {
        // setup the basic required properties for a monster
-       entity mon = REGISTRY_GET(Monsters, mon_id);
-       if(!mon.monsterid) { return false; } // invalid monster
 
+       if(!mon || mon == MON_Null) { return false; } // invalid monster
        if(!autocvar_g_monsters) { Monster_Remove(this); return false; }
 
        if(!(this.spawnflags & MONSTERFLAG_RESPAWNED) && !(this.flags & FL_MONSTER))
@@ -1332,7 +1331,7 @@ bool Monster_Spawn(entity this, bool check_appear, int mon_id)
                        precache_model(this.mdl_dead);
        }
 
-       if(check_appear && Monster_Appear_Check(this, mon_id)) { return true; } // return true so the monster isn't removed
+       if(check_appear && Monster_Appear_Check(this, mon)) { return true; } // return true so the monster isn't removed
 
        if(!this.monster_skill)
                this.monster_skill = cvar("g_monsters_skill");
@@ -1365,7 +1364,7 @@ bool Monster_Spawn(entity this, bool check_appear, int mon_id)
        if(!this.damagedbycontents)
                IL_PUSH(g_damagedbycontents, this);
        this.damagedbycontents  = true;
-       this.monsterid                  = mon_id;
+       this.monsterdef                 = mon;
        this.event_damage               = Monster_Damage;
        this.event_heal                 = Monster_Heal;
        settouch(this, Monster_Touch);
index 9d890d7358eb71335c9f0f0e47fa40612f4853eb..755abaaf2c67f69950d4be432bd6f8c3c7cddad6 100644 (file)
@@ -70,7 +70,7 @@ void Monster_Remove(entity this);
 
 void monsters_setstatus(entity this);
 
-bool Monster_Spawn(entity this, bool check_appear, int mon_id);
+bool Monster_Spawn(entity this, bool check_appear, Monster mon);
 
 void monster_setupcolors(entity this);
 
index d456282d429ee6fbc6c5113f90b7f57484b8fcff..f4ae76df8ce919049741f1763cb6a795c5857da2 100644 (file)
@@ -8,7 +8,7 @@
     #include <server/autocvars.qh>
     #include <server/defs.qh>
 #endif
-entity spawnmonster (entity e, string monster, int monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag)
+entity spawnmonster (entity e, string monster, Monster monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag)
 {
        e.spawnflags = MONSTERFLAG_SPAWNED;
 
@@ -26,7 +26,7 @@ entity spawnmonster (entity e, string monster, int monster_id, entity spawnedby,
                        RandomSelection_AddEnt(it, 1, 1);
                });
 
-               monster_id = RandomSelection_chosen_ent.monsterid;
+               monster_id = RandomSelection_chosen_ent;
        }
        else if(monster != "")
        {
@@ -36,12 +36,12 @@ entity spawnmonster (entity e, string monster, int monster_id, entity spawnedby,
                        if(it.netname == monster)
                        {
                                found = true;
-                               monster_id = it.monsterid; // we have the monster, old monster id is no longer required
+                               monster_id = it; // we have the monster, old monster id is no longer required
                                break;
                        }
                });
 
-               if(!found && !monster_id)
+               if(!found && monster_id == MON_Null)
                {
                        if(removeifinvalid)
                        {
@@ -49,7 +49,10 @@ entity spawnmonster (entity e, string monster, int monster_id, entity spawnedby,
                                return NULL; // no good
                        }
                        else
-                               monster_id = MON_FIRST;
+                       {
+                               // select a random valid monster type if no valid monster was provided
+                               return spawnmonster(e, "random", MON_Null, spawnedby, own, orig, respwn, removeifinvalid, moveflag);
+                       }
                }
        }
 
index 983676db87d3c4a225dd141db6017ebe173624d4..2c1127b7ddadc7c62ca2956811da1c4421f4b5d9 100644 (file)
@@ -1,3 +1,5 @@
 #pragma once
 
-entity spawnmonster (entity e, string monster, int monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag);
+#include <common/monsters/monster.qh>
+
+entity spawnmonster (entity e, string monster, Monster monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool removeifinvalid, int moveflag);
index 13c98e93fa1f64e75271e79cba146614c1b6dd94..d12ee2bc6c184196a462a4d85ae218f80a9970b8 100644 (file)
@@ -17,7 +17,7 @@ void spawner_use(entity this, entity actor, entity trigger)
        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);
+       e = spawnmonster(e, this.spawnmob, MON_Null, this, this, this.origin, false, true, this.monster_moveflags);
 }
 
 spawnfunc(monster_spawner)
index f4ff4d34a532f22557c838b613bf6f3bd69f1286..a23fc36970a6822f5ca48af79b29487c338a5df5 100644 (file)
@@ -179,7 +179,7 @@ MUTATOR_HOOKFUNCTION(mutator_instagib, MonsterSpawn)
        entity mon = M_ARGV(0, entity);
 
        // always refill ammo
-       if(mon.monsterid == MON_MAGE.monsterid)
+       if(mon.monsterdef == MON_MAGE)
                mon.skin = 1;
 }
 
index 1f74f1fe53c9ed39eb687cd14bf5caf62b34005a..723a3ccbc678fb82238c0d6075426632b8ca7927 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "items.qh"
+#include <common/gamemodes/_mod.qh>
 
 float autocvar_g_instagib_invis_alpha;
 int autocvar_g_instagib_extralives;
index 7dffc0f4d0fc9a8d4b6122f00709feb82d2ad127..bd539aa8e68bf84451c76eab1ec82276e98c4e37 100644 (file)
@@ -673,7 +673,7 @@ void nade_monster_boom(entity this)
 {
        entity e = spawn();
        e.noalign = true; // don't drop to floor
-       e = spawnmonster(e, this.pokenade_type, 0, this.realowner, this.realowner, this.origin, false, false, 1);
+       e = spawnmonster(e, this.pokenade_type, MON_Null, this.realowner, this.realowner, this.origin, false, false, 1);
 
        if(autocvar_g_nades_pokenade_monster_lifetime > 0)
                e.monster_lifetime = time + autocvar_g_nades_pokenade_monster_lifetime;
index 68d69ab2f027f25408d1b953cbc627b271b1b72f..31db0c4db92e2663a54f0b3a9f0069220a8848a8 100644 (file)
@@ -36,14 +36,11 @@ void W_OverkillHeavyMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity
        }
 
        float okhmg_spread = bound(WEP_CVAR_PRI(okhmg, spread_min), WEP_CVAR_PRI(okhmg, spread_min) + (WEP_CVAR_PRI(okhmg, spread_add) * actor.(weaponentity).misc_bulletcounter), WEP_CVAR_PRI(okhmg, spread_max));
-       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, okhmg_spread, WEP_CVAR_PRI(okhmg, solidpenetration), WEP_CVAR_PRI(okhmg, damage), WEP_CVAR_PRI(okhmg, force), WEP_OVERKILL_HMG.m_id, EFFECT_RIFLE);
+       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, okhmg_spread, WEP_CVAR_PRI(okhmg, solidpenetration), WEP_CVAR_PRI(okhmg, damage), 0, WEP_CVAR_PRI(okhmg, force), WEP_OVERKILL_HMG.m_id, EFFECT_RIFLE);
 
        actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
 
-       Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
-
-       W_MachineGun_MuzzleFlash(actor, weaponentity);
-       W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0');
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        if (autocvar_g_casings >= 2) // casing code
        {
index 77204ae1a39d9a74802285e8afb1dc8f0958b7b8..8a00b4d77adfb92e40d3aafb6cf3c36827206243 100644 (file)
@@ -12,6 +12,8 @@ CLASS(OverkillHeavyMachineGun, Weapon)
 /* modelname */ ATTRIB(OverkillHeavyMachineGun, mdl, string, "ok_hmg");
 #ifdef GAMEQC
 /* model     */ ATTRIB(OverkillHeavyMachineGun, m_model, Model, MDL_HMG_ITEM);
+/* flash mdl */ ATTRIB(OverkillHeavyMachineGun, m_muzzlemodel, Model, MDL_MACHINEGUN_MUZZLEFLASH);
+/* flash eff */ ATTRIB(OverkillHeavyMachineGun, m_muzzleeffect, entity, EFFECT_MACHINEGUN_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(OverkillHeavyMachineGun, w_crosshair, string, "gfx/crosshairuzi");
 /* crosshair */ ATTRIB(OverkillHeavyMachineGun, w_crosshair_size, float, 0.6);
index 817e369816ac69ad599ac19474fd1d39b1798ab0..9ce9a2901856e313dd6d2c07f06f3412fb6a7e7d 100644 (file)
@@ -30,14 +30,11 @@ void W_OverkillMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weap
        }
 
        okmachinegun_spread = bound(WEP_CVAR_PRI(okmachinegun, spread_min), WEP_CVAR_PRI(okmachinegun, spread_min) + (WEP_CVAR_PRI(okmachinegun, spread_add) * actor.(weaponentity).misc_bulletcounter), WEP_CVAR_PRI(okmachinegun, spread_max));
-       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, okmachinegun_spread, WEP_CVAR_PRI(okmachinegun, solidpenetration), WEP_CVAR_PRI(okmachinegun, damage), WEP_CVAR_PRI(okmachinegun, force), WEP_OVERKILL_MACHINEGUN.m_id, EFFECT_RIFLE);
+       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, okmachinegun_spread, WEP_CVAR_PRI(okmachinegun, solidpenetration), WEP_CVAR_PRI(okmachinegun, damage), 0, WEP_CVAR_PRI(okmachinegun, force), WEP_OVERKILL_MACHINEGUN.m_id, EFFECT_RIFLE);
 
        actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
 
-       Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
-
-       W_MachineGun_MuzzleFlash(actor, weaponentity);
-       W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0');
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        if(autocvar_g_casings >= 2) // casing code
        {
index 77082c96211d6b6b4eec9080ff55e1a80cda8726..10f3b9c09fb66192f604e3beacba25ca279601ba 100644 (file)
@@ -10,6 +10,8 @@ CLASS(OverkillMachineGun, Weapon)
 /* modelname */ ATTRIB(OverkillMachineGun, mdl, string, "ok_mg");
 #ifdef GAMEQC
 /* model        */ ATTRIB(OverkillMachineGun, m_model, Model, MDL_OK_MG_ITEM);
+/* flash mdl */ ATTRIB(OverkillMachineGun, m_muzzlemodel, Model, MDL_MACHINEGUN_MUZZLEFLASH);
+/* flash eff */ ATTRIB(OverkillMachineGun, m_muzzleeffect, entity, EFFECT_MACHINEGUN_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(OverkillMachineGun, w_crosshair, string, "gfx/crosshairuzi");
 /* crosshair */ ATTRIB(OverkillMachineGun, w_crosshair_size, float, 0.6);
index ca44a070a0cf99c2db176642d49cd07efaa34bfc..55afbe45c1112e4f2fdf04632f62dd71becdbbb5 100644 (file)
@@ -95,7 +95,7 @@ void W_OverkillNex_Attack(Weapon thiswep, entity actor, .entity weaponentity, fl
 
        yoda = 0;
        damage_goodhits = 0;
-       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, thiswep.m_id);
+       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, true, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, thiswep.m_id);
 
        if(yoda && flying)
                Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
index 362f14846f1368b07b0603e53292df50c6eb8b2e..25704934f6fc0d73512b780c58f794284a456134 100644 (file)
@@ -87,11 +87,10 @@ void W_OverkillRocketPropelledChainsaw_Think(entity this)
 void W_OverkillRocketPropelledChainsaw_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 {
        entity missile = spawn(); //WarpZone_RefSys_SpawnSameRefSys(actor);
-       entity flash = spawn ();
 
        W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(okrpc, ammo), weaponentity);
        W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(okrpc, damage), thiswep.m_id);
-       Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
        PROJECTILE_MAKETRIGGER(missile);
 
        missile.owner = missile.realowner = actor;
@@ -124,10 +123,6 @@ void W_OverkillRocketPropelledChainsaw_Attack(Weapon thiswep, entity actor, .ent
 
        CSQCProjectile(missile, true, PROJECTILE_RPC, false);
 
-       setmodel(flash, MDL_RPC_MUZZLEFLASH); // precision set below
-       SUB_SetFade (flash, time, 0.1);
-       flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       W_AttachToShotorg(actor, weaponentity, flash, '5 0 0');
        missile.m_chainsaw_damage = 0;
 
        MUTATOR_CALLHOOK(EditProjectile, actor, missile);
index 928bfc0b9a8453a84ce5584e5fd6734ffca9747c..6b6763ce702fc5523dde5891bdeb89b93a331af0 100644 (file)
@@ -12,6 +12,8 @@ CLASS(OverkillRocketPropelledChainsaw, Weapon)
 /* modelname */ ATTRIB(OverkillRocketPropelledChainsaw, mdl, string, "ok_rl");
 #ifdef GAMEQC
 /* model     */ ATTRIB(OverkillRocketPropelledChainsaw, m_model, Model, MDL_RPC_ITEM);
+/* flash mdl */ ATTRIB(OverkillRocketPropelledChainsaw, m_muzzlemodel, Model, MDL_RPC_MUZZLEFLASH);
+/* flash eff */ ATTRIB(OverkillRocketPropelledChainsaw, m_muzzleeffect, entity, EFFECT_ROCKET_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(OverkillRocketPropelledChainsaw, w_crosshair, string, "gfx/crosshairrocketlauncher");
 /* crosshair */ ATTRIB(OverkillRocketPropelledChainsaw, w_crosshair_size, float, 0.6);
index a9a2ee655139555dfc70bb72ae875d9fc2061a28..2c6a16d88f81b90d4b984c43effc5f663f70dcfd 100644 (file)
 
     MSG_ANNCE_NOTIF(BEGIN,                      N__ALWAYS, "begin",             CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
 
+    MSG_ANNCE_NOTIF(HEADSHOT,                   N__ALWAYS, "headshot",          CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
+
     MSG_ANNCE_NOTIF(KILLSTREAK_03,              N_GNTLOFF, "03kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
     MSG_ANNCE_NOTIF(KILLSTREAK_05,              N_GNTLOFF, "05kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
     MSG_ANNCE_NOTIF(KILLSTREAK_10,              N_GNTLOFF, "10kills",           CH_INFO, VOL_BASEVOICE, ATTEN_NONE)
index 5d4beb1acf1a7615391d14f5f035a264ca7875ca..2fd66af671f54ea1bb85cbde7f8b7a04f0d3ba7a 100644 (file)
@@ -628,7 +628,7 @@ void PM_check_hitground(entity this)
        if (!this.wasFlying) return;
     this.wasFlying = false;
     if (this.waterlevel >= WATERLEVEL_SWIMMING) return;
-    if (time < this.ladder_time) return;
+    if (this.ladder_entity) return;
     for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
     {
        .entity weaponentity = weaponentities[slot];
index fcd4d9a459983fc06a2e35fdb1cd5e8db753e8b9..fdbf411801511ffd503a0285d478a238b61a80bf 100644 (file)
@@ -34,8 +34,9 @@ const int SND_VOLUME = BIT(0);
 const int SND_ATTENUATION = BIT(1);
 const int SND_LARGEENTITY = BIT(3);
 const int SND_LARGESOUND = BIT(4);
+const int SND_SPEEDUSHORT4000 = BIT(5);
 
-void soundtoat(int to, entity e, vector o, int chan, string samp, float vol, float attenu)
+void soundtoat(int to, entity e, vector o, int chan, string samp, float vol, float attenu, float _pitch)
 {
        if (!sound_allowed(to, e)) return;
        int entno = etof(e);
@@ -43,14 +44,17 @@ void soundtoat(int to, entity e, vector o, int chan, string samp, float vol, flo
        attenu = floor(attenu * 64);
        vol = floor(vol * 255);
        int sflags = 0;
+       int speed4000 = floor((_pitch * 0.01) * 4000 + 0.5);
        if (vol != 255) sflags |= SND_VOLUME;
        if (attenu != 64) sflags |= SND_ATTENUATION;
        if (entno >= 8192 || chan < 0 || chan > 7) sflags |= SND_LARGEENTITY;
        if (idx >= 256) sflags |= SND_LARGESOUND;
+       if (speed4000 && speed4000 != 4000) sflags |= SND_SPEEDUSHORT4000;
        WriteByte(to, SVC_SOUND);
        WriteByte(to, sflags);
        if (sflags & SND_VOLUME) WriteByte(to, vol);
        if (sflags & SND_ATTENUATION) WriteByte(to, attenu);
+       if (sflags & SND_SPEEDUSHORT4000) WriteShort(to, speed4000);
        if (sflags & SND_LARGEENTITY)
        {
                WriteShort(to, entno);
@@ -67,15 +71,15 @@ void soundtoat(int to, entity e, vector o, int chan, string samp, float vol, flo
        WriteCoord(to, o.z);
 }
 
-void soundto(int _dest, entity e, int chan, string samp, float vol, float _atten)
+void soundto(int _dest, entity e, int chan, string samp, float vol, float _atten, float _pitch)
 {
        if (!sound_allowed(_dest, e)) return;
        vector o = e.origin + 0.5 * (e.mins + e.maxs);
-       soundtoat(_dest, e, o, chan, samp, vol, _atten);
+       soundtoat(_dest, e, o, chan, samp, vol, _atten, _pitch);
 }
 void soundat(entity e, vector o, int chan, string samp, float vol, float _atten)
 {
-       soundtoat(((chan & 8) ? MSG_ALL : MSG_BROADCAST), e, o, chan, samp, vol, _atten);
+       soundtoat(((chan & 8) ? MSG_ALL : MSG_BROADCAST), e, o, chan, samp, vol, _atten, 0);
 }
 void stopsoundto(int _dest, entity e, int chan)
 {
@@ -112,7 +116,7 @@ void stopsound(entity e, int chan)
 void play2(entity e, string filename)
 {
        msg_entity = e;
-       soundtoat(MSG_ONE, NULL, '0 0 0', CH_INFO, filename, VOL_BASE, ATTEN_NONE);
+       soundtoat(MSG_ONE, NULL, '0 0 0', CH_INFO, filename, VOL_BASE, ATTEN_NONE, 0);
 }
 
 .float spamtime;
index 37cb77a7a2c1d3372d2cada530968afbf663a6a3..ef2923b86932814247d70707de3466153b51145c 100644 (file)
@@ -540,7 +540,7 @@ void Item_RespawnCountdown(entity this)
                                if(this.waypointsprite_attached.waypointsprite_visible_for_player(this.waypointsprite_attached, it, it))
                                {
                                        msg_entity = it;
-                                       soundto(MSG_ONE, this, CH_TRIGGER, SND(ITEMRESPAWNCOUNTDOWN), VOL_BASE, ATTEN_NORM);    // play respawn sound
+                                       soundto(MSG_ONE, this, CH_TRIGGER, SND(ITEMRESPAWNCOUNTDOWN), VOL_BASE, ATTEN_NORM, 0); // play respawn sound
                                }
                        });
 
index a56e7de3833a6fe4d997cda5fa4081de332c95c8..9d4ff22946a860be5b45d35e8ed09564510553f3 100644 (file)
@@ -2,7 +2,7 @@
 
 #ifdef SVQC
 
-void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity);
+void W_MuzzleFlash_Model(entity wepent, entity muzzlemodel);
 SOUND(MachineGunTurretAttack_FIRE, W_Sound("electro_fire"));
 METHOD(MachineGunTurretAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
 {
@@ -17,8 +17,8 @@ METHOD(MachineGunTurretAttack, wr_think, void(entity thiswep, entity actor, .ent
             actor.tur_head = actor;
             weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, 0, w_ready);
         }
-        fireBullet(actor, weaponentity, actor.tur_shotorg, actor.tur_shotdir_updated, actor.shot_spread, 0, actor.shot_dmg, actor.shot_force, DEATH_TURRET_MACHINEGUN.m_id, EFFECT_BULLET);
-        W_MachineGun_MuzzleFlash(actor, weaponentity);
+        fireBullet(actor, weaponentity, actor.tur_shotorg, actor.tur_shotdir_updated, actor.shot_spread, 0, actor.shot_dmg, 0, actor.shot_force, DEATH_TURRET_MACHINEGUN.m_id, EFFECT_BULLET);
+        W_MuzzleFlash_Model(actor.(weaponentity), MDL_MACHINEGUN_MUZZLEFLASH);
         setattachment(actor.(weaponentity).muzzle_flash, actor.tur_head, "tag_fire");
     }
 }
index 89ddfbd4f1ca6a28df7f9d45339b016d01923144..98426c9c33ef7b3bf43850099bc29a98101513dd 100644 (file)
@@ -9,7 +9,7 @@ METHOD(PlasmaTurret, tr_attack, void(PlasmaTurret this, entity it))
     if(MUTATOR_IS_ENABLED(mutator_instagib))
     {
         .entity weaponentity = weaponentities[0]; // TODO: unhardcode
-        FireRailgunBullet (it, weaponentity, it.tur_shotorg, it.tur_shotorg + it.tur_shotdir_updated * max_shot_distance, 10000000000,
+        FireRailgunBullet (it, weaponentity, it.tur_shotorg, it.tur_shotorg + it.tur_shotdir_updated * max_shot_distance, 10000000000, false,
                            800, 0, 0, 0, 0, DEATH_TURRET_PLASMA.m_id);
 
         Send_Effect(EFFECT_VORTEX_MUZZLEFLASH, it.tur_shotorg, it.tur_shotdir_updated * 1000, 1);
index 9fa10eefff01e8a2c7cf0a9cbd305014f7be13e4..1aee6f5c4a501e53cdc9eebf331678568a9a3a37 100644 (file)
@@ -8,7 +8,7 @@ METHOD(DualPlasmaTurret, tr_attack, void(DualPlasmaTurret thistur, entity it))
 {
     if (MUTATOR_IS_ENABLED(mutator_instagib)) {
         .entity weaponentity = weaponentities[0]; // TODO: unhardcode
-        FireRailgunBullet (it, weaponentity, it.tur_shotorg, it.tur_shotorg + it.tur_shotdir_updated * max_shot_distance, 10000000000,
+        FireRailgunBullet (it, weaponentity, it.tur_shotorg, it.tur_shotorg + it.tur_shotdir_updated * max_shot_distance, 10000000000, false,
                            800, 0, 0, 0, 0, DEATH_TURRET_PLASMA.m_id);
 
 
index bbe59aeac90aeca4980be687fb8257eb60ae545e..c16d130142056cf0da5e8ec9cec6c8b0d2cc6435 100644 (file)
@@ -16,7 +16,7 @@ METHOD(WalkerTurretAttack, wr_think, void(entity thiswep, entity actor, .entity
             weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(electro, animtime), w_ready);
         }
         sound (actor, CH_WEAPON_A, SND_UZI_FIRE, VOL_BASE, ATTEN_NORM);
-        fireBullet(actor, weaponentity, actor.tur_shotorg, actor.tur_shotdir_updated, actor.shot_spread, 0, actor.shot_dmg, actor.shot_force, DEATH_TURRET_WALK_GUN.m_id, EFFECT_BULLET);
+        fireBullet(actor, weaponentity, actor.tur_shotorg, actor.tur_shotdir_updated, actor.shot_spread, 0, actor.shot_dmg, 0, actor.shot_force, DEATH_TURRET_WALK_GUN.m_id, EFFECT_BULLET);
         Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, actor.tur_shotorg, actor.tur_shotdir_updated * 1000, 1);
     }
 }
index 3567a2b095d522857ec2e2e4454de22c3e2d3dd5..ae0c2ae77ae5c49e6aa00ef3c5b42a0035783be6 100644 (file)
@@ -7,12 +7,14 @@
     #include "notifications/all.qh"
        #include "scores.qh"
     #include <common/deathtypes/all.qh>
+       #include <common/gamemodes/_mod.qh>
 #elif defined(MENUQC)
 #elif defined(SVQC)
     #include "constants.qh"
        #include <server/mutators/_mod.qh>
     #include "notifications/all.qh"
     #include <common/deathtypes/all.qh>
+       #include <common/gamemodes/_mod.qh>
        #include "scores.qh"
     #include "mapinfo.qh"
 #endif
index 015f947b2d62bf94ff1a0e4806edc076fa01703e..a868eb4aa1f65b9c56d098ceeb779d68ba55038b 100644 (file)
@@ -422,7 +422,7 @@ bool raptor_frame(entity this, float dt)
                if(incoming)
                {
                        msg_entity = this;
-                       soundto(MSG_ONE, vehic, CH_PAIN_SINGLE, SND(VEH_MISSILE_ALARM), VOL_BASE, ATTEN_NONE);
+                       soundto(MSG_ONE, vehic, CH_PAIN_SINGLE, SND(VEH_MISSILE_ALARM), VOL_BASE, ATTEN_NONE, 0);
                }
 
                vehic.bomb1.cnt = time + 1;
index ca72ec1b23b034658bcb8617a9e60a2f9a4c9a21..e031222714e7b758496115675dbf3ed23b2c6846 100644 (file)
@@ -266,7 +266,7 @@ bool spiderbot_frame(entity this, float dt)
 
                        .entity weaponentity = weaponentities[0]; // TODO: unhardcode
                        fireBullet(this, weaponentity, v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_solidpenetration,
-                               autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN.m_id, EFFECT_BULLET);
+                               autocvar_g_vehicle_spiderbot_minigun_damage, 0, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN.m_id, EFFECT_BULLET);
 
                        sound (gun, CH_WEAPON_A, SND_UZI_FIRE, VOL_BASE, ATTEN_NORM);
                        //trailparticles(this, _particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
index e5f90df089ebe2498a7a1f33b68fb7012796e16e..c3d70fc509d2d992fae61b7be4d37d2af8df271b 100644 (file)
@@ -19,7 +19,7 @@ void viewloc_PlayerPhysics(entity this)
 
                vector old_movement = PHYS_CS(this).movement;
                PHYS_CS(this).movement_x = old_movement_y;
-               if((this.viewloc.spawnflags & VIEWLOC_FREEMOVE) && !(time < this.ladder_time))
+               if((this.viewloc.spawnflags & VIEWLOC_FREEMOVE) && !this.ladder_entity)
                        PHYS_CS(this).movement_y = old_movement_x;
                else
                        PHYS_CS(this).movement_y = 0;
@@ -30,7 +30,7 @@ void viewloc_PlayerPhysics(entity this)
                vector forward = vectoangles(normalize(level_end - level_start));
                vector backward = vectoangles(normalize(level_start - level_end));
 
-               if((this.viewloc.spawnflags & VIEWLOC_FREEMOVE) && this.angles_y < 0 && !(time < this.ladder_time))
+               if((this.viewloc.spawnflags & VIEWLOC_FREEMOVE) && this.angles_y < 0 && !this.ladder_entity)
                        PHYS_CS(this).movement_y = -PHYS_CS(this).movement_y;
 
                if(this.viewloc.spawnflags & VIEWLOC_FREEAIM)
index 1dac610ed50e482c1938b0b023d6c6cee0c9b3c7..9feb5ffe4369ae217f1db46954bca4f70ef1264f 100644 (file)
@@ -384,7 +384,7 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn
  * writes:
  *   this.origin, this.angles
  *   this.weaponchild
- *   this.movedir, this.view_ofs
+ *   this.movedir, this.view_ofs, this.movedir_aligned
  *   attachment stuff
  *   anim stuff
  * to free:
@@ -526,6 +526,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
        }
 
        this.view_ofs = '0 0 0';
+       this.movedir_aligned = this.movedir;
 
        if (this.movedir.x >= 0)
        {
@@ -536,6 +537,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
        #endif
                vector v = this.movedir;
                this.movedir = shotorg_adjust(v, false, false, algn);
+               this.movedir_aligned = shotorg_adjust(v, false, true, algn);
                this.view_ofs = shotorg_adjust(v, false, true, algn) - v;
        }
        int compressed_shotorg = compressShotOrigin(this.movedir);
@@ -671,6 +673,151 @@ CLIENT_COMMAND(weapon_find, "Show spawn locations of a weapon")
 }
 #endif
 
+#ifdef SVQC
+void W_MuzzleFlash_Model_AttachToShotorg(entity actor, .entity weaponentity, entity flash, vector offset)
+{
+       flash.owner = actor;
+       flash.angles_z = random() * 360;
+
+       entity view = actor.(weaponentity);
+       entity exterior = actor.exteriorweaponentity;
+
+       if (view.oldorigin.x > 0)
+       {
+               setattachment(flash, exterior, "");
+               setorigin(flash, view.oldorigin + offset);
+       }
+       else
+       {
+               if (gettagindex(exterior, "shot")) setattachment(flash, exterior, "shot");
+               else setattachment(flash, exterior, "tag_shot");
+               setorigin(flash, offset);
+       }
+}
+#elif defined(CSQC)
+void W_MuzzleFlash_Model_AttachToShotorg(entity wepent, entity flash, vector offset)
+{
+       flash.owner = wepent;
+       flash.angles_z = random() * 360;
+
+       if (gettagindex(wepent, "shot")) setattachment(flash, wepent, "shot");
+       else setattachment(flash, wepent, "tag_shot");
+       setorigin(flash, offset);
+}
+#endif
+
+void W_MuzzleFlash_Model_Think(entity this)
+{
+       this.frame += 2;
+       this.scale *= 0.5;
+       this.alpha -= 0.25;
+       this.nextthink = time + 0.05;
+
+       if(this.alpha <= 0)
+       {
+               setthink(this, SUB_Remove);
+               this.nextthink = time;
+               this.realowner.muzzle_flash = NULL;
+               return;
+       }
+}
+
+void W_MuzzleFlash_Model(entity wepent, entity muzzlemodel)
+{
+       if(wepent.muzzle_flash == NULL)
+               wepent.muzzle_flash = spawn();
+
+       entity flash = wepent.muzzle_flash;
+       setmodel(flash, muzzlemodel); // precision set below
+
+       flash.scale = 0.75;
+       setthink(flash, W_MuzzleFlash_Model_Think);
+       flash.nextthink = time + 0.02;
+       flash.frame = 2;
+       flash.alpha = 0.75;
+       flash.angles_z = random() * 180;
+       flash.effects = EF_ADDITIVE | EF_FULLBRIGHT;
+       flash.owner = flash.realowner = wepent;
+
+#ifdef CSQC
+       flash.drawmask = MASK_NORMAL;
+#endif
+}
+
+REGISTER_NET_TEMP(w_muzzleflash)
+
+#ifdef SVQC
+void W_MuzzleFlash(Weapon thiswep, entity actor, .entity weaponentity, vector shotorg, vector shotdir)
+{
+       // don't show an exterior muzzle effect for the off-hand
+       if(weaponslot(weaponentity) == 0)
+       {
+               Send_Effect_Except(thiswep.m_muzzleeffect, shotorg, shotdir * 1000, 1, actor);
+
+               if(thiswep.m_muzzlemodel != MDL_Null)
+               {
+                       W_MuzzleFlash_Model(actor.exteriorweaponentity, thiswep.m_muzzlemodel);
+                       W_MuzzleFlash_Model_AttachToShotorg(actor, weaponentity, actor.exteriorweaponentity.muzzle_flash, '5 0 0');
+               }
+       }
+
+       FOREACH_CLIENT(it == actor || (IS_SPEC(it) && it.enemy == actor),
+       {
+               if(!IS_REAL_CLIENT(it))
+                       continue;
+               int channel = MSG_ONE;
+               msg_entity = it;
+               WriteHeader(channel, w_muzzleflash);
+               WriteByte(channel, thiswep.m_id);
+               WriteByte(channel, weaponslot(weaponentity));
+               WriteVector(channel, shotorg);
+       });
+}
+#elif defined(CSQC)
+NET_HANDLE(w_muzzleflash, bool isNew)
+{
+       return = true;
+       int weapon_id = ReadByte();
+    int slot = ReadByte();
+    vector sv_shotorg = ReadVector();
+
+       Weapon thiswep = REGISTRY_GET(Weapons, weapon_id);
+    vector viewangles = getpropertyvec(VF_CL_VIEWANGLES);
+       vector forward, right, up;
+       MAKE_VECTORS(viewangles, forward, right, up);
+
+       if(autocvar_chase_active)
+       {
+               // in third person mode, show the muzzle flash from the server side weapon position
+               // we don't have a view model to reference in this case
+               pointparticles(thiswep.m_muzzleeffect, sv_shotorg, forward * 1000, 1);
+               return;
+       }
+    if(!autocvar_r_drawviewmodel) return;
+
+       entity wepent = viewmodels[slot];
+       // get the local player entity to calculate shot origin
+       entity rlplayer = CSQCModel_server2csqc(player_localentnum - 1);
+       if(!rlplayer)
+               rlplayer = csqcplayer; // fall back to the global
+
+       vector md = wepent.movedir_aligned;
+       vector vecs = ((md.x > 0) ? md : '0 0 0');
+       vector dv = right * -vecs.y + up * vecs.z;
+       vector org = rlplayer.origin + rlplayer.view_ofs + dv;
+       tracebox(org, '0 0 0', '0 0 0', org + forward * (vecs.x + 1), MOVE_NORMAL, rlplayer);
+       org = trace_endpos - forward * 1;
+
+       pointparticles(thiswep.m_muzzleeffect, org, forward * 1000, 1);
+
+       if(thiswep.m_muzzlemodel != MDL_Null)
+       {
+               W_MuzzleFlash_Model(wepent, thiswep.m_muzzlemodel);
+               W_MuzzleFlash_Model_AttachToShotorg(wepent, wepent.muzzle_flash, '5 0 0');
+       }
+}
+#endif
+
 
 #endif
 
index b8d7c56bf98d7ec6adedef081655098b70e56398..f98152aa8b8b1838245d80de623c8c6346a44bd6 100644 (file)
@@ -20,6 +20,7 @@ WepSet ReadWepSet();
 #include "calculations.qh"
 #include "projectiles.qh"
 #include <common/models/all.qh>
+#include <common/effects/all.qh>
 #endif
 
 #include <common/util.qh>
@@ -357,12 +358,16 @@ vector weaponentity_glowmod(Weapon wep, entity actor, int c, entity wepent)
 
 .vector spawnorigin; // for casings
 
+.vector movedir_aligned; // shot origin based on weapon alignment (unaffected by shootfromeye)
+
 // weapon animation vectors:
 .vector anim_fire1;
 .vector anim_fire2;
 .vector anim_idle;
 .vector anim_reload;
 
+.entity muzzle_flash;
+
 // static frame globals
 
 ENUMCLASS(WFRAME)
@@ -395,4 +400,8 @@ REPLICATE(cvar_cl_accuracy_data_receive, bool, "cl_accuracy_data_receive");
 #ifdef SVQC
 void wframe_send(entity actor, entity weaponentity, int wepframe, float attackrate, bool restartanim);
 #endif
+
+#ifdef SVQC
+void W_MuzzleFlash(Weapon thiswep, entity actor, .entity weaponentity, vector shotorg, vector shotdir);
+#endif
 #endif
index 2d176c04e639d66cd630668513006483f174f754..67f646cbe5b328dbbb8d7671cbef65db65189fc9 100644 (file)
@@ -56,8 +56,14 @@ CLASS(Weapon, Object)
     ATTRIB(Weapon, wpcolor, vector, '0 0 0');
     /** M: modelname : name of model (without g_ v_ or h_ prefixes) */
     ATTRIB(Weapon, mdl, string, "");
+#ifdef GAMEQC
     /** M: model MDL_id_ITEM */
     ATTRIB(Weapon, m_model, entity);
+    /** M: flash model MDL_id_MUZZLEFLASH */
+    ATTRIB(Weapon, m_muzzlemodel, entity, MDL_Null);
+    /** M: flash effect EFFECT_id_MUZZLEFLASH */
+    ATTRIB(Weapon, m_muzzleeffect, entity);
+#endif
     /** M: crosshair : per-weapon crosshair: "CrosshairImage Size" */
     ATTRIB(Weapon, w_crosshair, string, "gfx/crosshairmoustache");
     /** A: crosshair : per-weapon crosshair size (argument two of "crosshair" field) */
index 942863e701bb3bf9ffaf13d8998544e988bd6ace..387bb910fdbab55ac6c4e308bd789e47c36f9083 100644 (file)
@@ -131,7 +131,7 @@ void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
 
        W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), WEP_ARC.m_id | HITTYPE_SECONDARY);
 
-       Send_Effect(EFFECT_ARC_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        missile = new(missile);
        missile.owner = missile.realowner = actor;
index 13321039c9d215cc17211eadc3c7dd2b9c09da2d..3c79dc3350454903337952aee4b6c5ed8a8d1b9f 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Arc, Weapon)
 /* modelname */ ATTRIB(Arc, mdl, string, "arc");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Arc, m_model, Model, MDL_ARC_ITEM);
+/* flash mdl */ ATTRIB(Arc, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Arc, m_muzzleeffect, entity, EFFECT_ARC_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Arc, w_crosshair, string, "gfx/crosshairhlac");
 /* crosshair */ ATTRIB(Arc, w_crosshair_size, float, 0.7);
index 310ea19a1b53e9e0caee892f20736d27281f43d3..e0fd2282baedab6b219b19de8b47f0a4541f96c4 100644 (file)
@@ -55,7 +55,7 @@ void W_Blaster_Attack(
        vector s_forward = v_forward * cos(atk_shotangle * DEG2RAD) + v_up * sin(atk_shotangle * DEG2RAD);
 
        W_SetupShot_Dir(actor, weaponentity, s_forward, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_B, atk_damage, atk_deathtype);
-       Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(WEP_BLASTER, actor, weaponentity, w_shotorg, w_shotdir);
 
        entity missile = new(blasterbolt);
        missile.owner = missile.realowner = actor;
index 87824310c9d92f3478bc40455de063253d87b92e..ed966cf2fac76bff9a2b304a070782564bd337ad 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Blaster, Weapon)
 /* modelname */ ATTRIB(Blaster, mdl, string, "laser");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Blaster, m_model, Model, MDL_BLASTER_ITEM);
+/* flash mdl */ ATTRIB(Blaster, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Blaster, m_muzzleeffect, entity, EFFECT_BLASTER_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Blaster, w_crosshair, string, "gfx/crosshairlaser");
 /* crosshair */ ATTRIB(Blaster, w_crosshair_size, float, 0.5);
index a69f43fbd3f7afbdd01bca9d88707ee5255c5729..abed4209f7241959ea5fc82aeafbdd4844f078e1 100644 (file)
@@ -307,7 +307,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity)
        up = v_up;
 
        shots = WEP_CVAR_PRI(crylink, shots);
-       Send_Effect(EFFECT_CRYLINK_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, shots);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
        proj = prevproj = firstproj = NULL;
        for(counter = 0; counter < shots; ++counter)
        {
@@ -420,7 +420,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
        up = v_up;
 
        shots = WEP_CVAR_SEC(crylink, shots);
-       Send_Effect(EFFECT_CRYLINK_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, shots);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
        proj = prevproj = firstproj = NULL;
        for(counter = 0; counter < shots; ++counter)
        {
index 5843c94bbe2df1188b10cb092c8e7eb94e4d7f6e..501b8782273b70fd95c474546feae4c58220bca0 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Crylink, Weapon)
 /* modelname */ ATTRIB(Crylink, mdl, string, "crylink");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Crylink, m_model, Model, MDL_CRYLINK_ITEM);
+/* flash mdl */ ATTRIB(Crylink, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Crylink, m_muzzleeffect, entity, EFFECT_CRYLINK_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Crylink, w_crosshair, string, "gfx/crosshaircrylink");
 /* crosshair */ ATTRIB(Crylink, w_crosshair_size, float, 0.5);
index 997f6eb36865648470cf398e2b78294a1ffe1ee1..891c44583d65d1b491c372234c2e269979b77b19 100644 (file)
@@ -308,7 +308,7 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int
        W_DecreaseAmmo(thiswep, actor, WEP_CVAR(devastator, ammo), weaponentity);
 
        W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR(devastator, damage), thiswep.m_id);
-       Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        entity missile = WarpZone_RefSys_SpawnSameRefSys(actor);
        missile.weaponentity_fld = weaponentity;
@@ -351,13 +351,6 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int
 
        CSQCProjectile(missile, WEP_CVAR(devastator, guiderate) == 0 && WEP_CVAR(devastator, speedaccel) == 0, PROJECTILE_ROCKET, false); // because of fly sound
 
-       // muzzle flash for 1st person view
-       entity flash = spawn();
-       setmodel(flash, MDL_DEVASTATOR_MUZZLEFLASH); // precision set below
-       SUB_SetFade(flash, time, 0.1);
-       flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       W_AttachToShotorg(actor, weaponentity, flash, '5 0 0');
-
        // common properties
        MUTATOR_CALLHOOK(EditProjectile, actor, missile);
 
index 679f75499a3dfd1f4abaf82c64dfb19f4ea276ed..11481c6f95167acf56acb927595a5056b52c04a0 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Devastator, Weapon)
 /* modelname */ ATTRIB(Devastator, mdl, string, "rl");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Devastator, m_model, Model, MDL_DEVASTATOR_ITEM);
+/* flash mdl */ ATTRIB(Devastator, m_muzzlemodel, Model, MDL_DEVASTATOR_MUZZLEFLASH);
+/* flash eff */ ATTRIB(Devastator, m_muzzleeffect, entity, EFFECT_ROCKET_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Devastator, w_crosshair, string, "gfx/crosshairrocketlauncher");
 /* crosshair */ ATTRIB(Devastator, w_crosshair_size, float, 0.7);
index 69ccc4251bff69dbd7dacb70975cdf1966c62434..10005f22e541eb41f8e472ad9ca307fe1e0cecc7 100644 (file)
@@ -227,7 +227,7 @@ void W_Electro_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
                thiswep.m_id
        );
 
-       Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        proj = new(electro_bolt);
        proj.owner = proj.realowner = actor;
@@ -378,7 +378,7 @@ void W_Electro_Attack_Orb(Weapon thiswep, entity actor, .entity weaponentity)
 
        w_shotdir = v_forward; // no TrueAim for grenades please
 
-       Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        entity proj = new(electro_orb);
        proj.owner = proj.realowner = actor;
index 4480812207defe79dfddd925c4589c1a57f09ea7..9583bc9f262624adf61e9a7ec71f3b0760d6ce8b 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Electro, Weapon)
 /* modelname */ ATTRIB(Electro, mdl, string, "electro");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Electro, m_model, Model, MDL_ELECTRO_ITEM);
+/* flash mdl */ ATTRIB(Electro, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Electro, m_muzzleeffect, entity, EFFECT_ELECTRO_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Electro, w_crosshair, string, "gfx/crosshairelectro");
 /* crosshair */ ATTRIB(Electro, w_crosshair_size, float, 0.6);
index 6b52ba32abba8d81cf8a0714e820af6895c197b4..edbdecf0f0d00619c39057f449b330dbabb2e0ca 100644 (file)
@@ -137,7 +137,7 @@ void W_Fireball_Attack1(entity actor, .entity weaponentity)
 {
        W_SetupShot_ProjectileSize(actor, weaponentity, '-16 -16 -16', '16 16 16', false, 2, SND_FIREBALL_FIRE2, CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage), WEP_FIREBALL.m_id);
 
-       Send_Effect(EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(WEP_FIREBALL, actor, weaponentity, w_shotorg, w_shotdir);
 
        entity proj = new(plasma_prim);
        proj.owner = proj.realowner = actor;
@@ -275,7 +275,7 @@ void W_Fireball_Attack2(entity actor, .entity weaponentity)
        traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, actor);
        w_shotorg = trace_endpos;
 
-       Send_Effect(EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(WEP_FIREBALL, actor, weaponentity, w_shotorg, w_shotdir);
 
        proj = new(grenade);
        proj.owner = proj.realowner = actor;
index ba391f6a2d13b42dc33ae6dd08654345921c379f..dc59a109ce47a5a029b7f5a190c75fe188e86d58 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Fireball, Weapon)
 /* modelname */ ATTRIB(Fireball, mdl, string, "fireball");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Fireball, m_model, Model, MDL_FIREBALL_ITEM);
+/* flash mdl */ ATTRIB(Fireball, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Fireball, m_muzzleeffect, entity, EFFECT_FIREBALL_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Fireball, w_crosshair, string, "gfx/crosshairfireball");
 /* crosshair */ //ATTRIB(Fireball, w_crosshair_size, float, 0.65);
index 0ffa0c74d973b92f00f9c5fb4b06b22a522f0704..73cb2b8b97afbe57ed97dc22255f5118b8a86eba 100644 (file)
@@ -83,7 +83,7 @@ void W_Hagar_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 
        W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(hagar, damage), thiswep.m_id);
 
-       Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        missile = new(missile);
        missile.owner = missile.realowner = actor;
@@ -129,7 +129,7 @@ void W_Hagar_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
 
        W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage), thiswep.m_id | HITTYPE_SECONDARY);
 
-       Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        missile = new(missile);
        missile.owner = missile.realowner = actor;
@@ -185,7 +185,7 @@ void W_Hagar_Attack2_Load_Release(Weapon thiswep, entity actor, .entity weaponen
 
        shots = actor.(weaponentity).hagar_load;
        W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage) * shots, thiswep.m_id | HITTYPE_SECONDARY);
-       Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        forward = v_forward;
        right = v_right;
index 0d0f11e8575774e8d2f939e2f9f394f1c8d49920..d9df8485f4c8cc65e8cf1d2bb386029a4a7b85f0 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Hagar, Weapon)
 /* modelname */ ATTRIB(Hagar, mdl, string, "hagar");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Hagar, m_model, Model, MDL_HAGAR_ITEM);
+/* flash mdl */ ATTRIB(Hagar, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Hagar, m_muzzleeffect, entity, EFFECT_HAGAR_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Hagar, w_crosshair, string, "gfx/crosshairhagar");
 /* crosshair */ ATTRIB(Hagar, w_crosshair_size, float, 0.8);
index 6511d22b572b4fab5938c035aea73d2e18dec6a2..da2660b89e2ece43a4001f518393fede8a0eaf43 100644 (file)
@@ -31,7 +31,7 @@ void W_HLAC_Attack(Weapon thiswep, entity actor, .entity weaponentity)
         spread = spread * WEP_CVAR_PRI(hlac, spread_crouchmod);
 
        W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage), thiswep.m_id);
-       Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
        if(!autocvar_g_norecoil)
        {
                actor.punchangle_x = random() - 0.5;
@@ -81,7 +81,7 @@ void W_HLAC_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
         spread = spread * WEP_CVAR_SEC(hlac, spread_crouchmod);
 
        W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage), thiswep.m_id | HITTYPE_SECONDARY);
-       Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        missile = new(hlacbolt);
        missile.owner = missile.realowner = actor;
index 769209259bda3efb8f92291ab52937a541b9df78..5ff0e2b30ea82a9c2d1444e0c05b2a6042e08be9 100644 (file)
@@ -10,6 +10,8 @@ CLASS(HLAC, Weapon)
 /* modelname */ ATTRIB(HLAC, mdl, string, "hlac");
 #ifdef GAMEQC
 /* model     */ ATTRIB(HLAC, m_model, Model, MDL_HLAC_ITEM);
+/* flash mdl */ ATTRIB(HLAC, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(HLAC, m_muzzleeffect, entity, EFFECT_BLASTER_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(HLAC, w_crosshair, string, "gfx/crosshairhlac");
 /* crosshair */ ATTRIB(HLAC, w_crosshair_size, float, 0.6);
index bff975e005479ce5d12eaf5751ec11b6b06843f2..385fab4d6a1488544d131be653fc269a80c77e2d 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Hook, Weapon)
 /* modelname */ ATTRIB(Hook, mdl, string, "hookgun");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Hook, m_model, Model, MDL_HOOK_ITEM);
+/* flash mdl */ ATTRIB(Hook, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Hook, m_muzzleeffect, entity, EFFECT_HOOK_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Hook, w_crosshair, string, "gfx/crosshairhook");
 /* crosshair */ ATTRIB(Hook, w_crosshair_size, float, 0.5);
index 86de79f600603d02f84bab06858b5dc533b42508..684ae22bc740858542996ce53647b45491b23ab8 100644 (file)
@@ -2,43 +2,6 @@
 
 #ifdef SVQC
 
-void W_MachineGun_MuzzleFlash_Think(entity this)
-{
-       this.frame += 2;
-       this.scale *= 0.5;
-       this.alpha -= 0.25;
-       this.nextthink = time + 0.05;
-
-       if(this.alpha <= 0)
-       {
-               setthink(this, SUB_Remove);
-               this.nextthink = time;
-               this.realowner.muzzle_flash = NULL;
-               return;
-       }
-
-}
-
-void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity)
-{
-       entity wepent = actor.(weaponentity);
-
-       if(wepent.muzzle_flash == NULL)
-               wepent.muzzle_flash = spawn();
-
-       // muzzle flash for 1st person view
-       setmodel(wepent.muzzle_flash, MDL_MACHINEGUN_MUZZLEFLASH); // precision set below
-
-       wepent.muzzle_flash.scale = 0.75;
-       setthink(wepent.muzzle_flash, W_MachineGun_MuzzleFlash_Think);
-       wepent.muzzle_flash.nextthink = time + 0.02;
-       wepent.muzzle_flash.frame = 2;
-       wepent.muzzle_flash.alpha = 0.75;
-       wepent.muzzle_flash.angles_z = random() * 180;
-       wepent.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       wepent.muzzle_flash.owner = wepent.muzzle_flash.realowner = wepent;
-}
-
 void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity weaponentity)
 {
        W_SetupShot(actor, weaponentity, true, 0, SND_UZI_FIRE, CH_WEAPON_A, ((actor.(weaponentity).misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage)), deathtype);
@@ -51,14 +14,11 @@ void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity we
        ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(machinegun, first_refire) * W_WeaponRateFactor(actor);
 
        if(actor.(weaponentity).misc_bulletcounter == 1)
-               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, first_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, first_damage), WEP_CVAR(machinegun, first_force), deathtype, EFFECT_BULLET);
+               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, first_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, first_damage), 0, WEP_CVAR(machinegun, first_force), deathtype, EFFECT_BULLET);
        else
-               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, sustained_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), deathtype, EFFECT_BULLET);
+               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, sustained_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), 0, WEP_CVAR(machinegun, sustained_force), deathtype, EFFECT_BULLET);
 
-       Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
-
-       W_MachineGun_MuzzleFlash(actor, weaponentity);
-       W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0');
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        // casing code
        if(autocvar_g_casings >= 2)
@@ -127,14 +87,11 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity
        }
 
        machinegun_spread = bound(WEP_CVAR(machinegun, spread_min), WEP_CVAR(machinegun, spread_min) + (WEP_CVAR(machinegun, spread_add) * actor.(weaponentity).misc_bulletcounter), WEP_CVAR(machinegun, spread_max));
-       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, machinegun_spread, 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, machinegun_spread, WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), 0, WEP_CVAR(machinegun, sustained_force), thiswep.m_id, EFFECT_BULLET);
 
        actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
 
-       Send_Effect(EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
-
-       W_MachineGun_MuzzleFlash(actor, weaponentity);
-       W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0');
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        if(autocvar_g_casings >= 2) // casing code
        {
@@ -155,12 +112,9 @@ 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_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);
+       fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, burst_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), 0, WEP_CVAR(machinegun, sustained_force), thiswep.m_id, EFFECT_BULLET);
 
-       W_MachineGun_MuzzleFlash(actor, weaponentity);
-       W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0');
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        if(autocvar_g_casings >= 2) // casing code
        {
index 19bba63a2bb1241e62107e6b9fbb313ea91f1f70..acf1668d79f75f7a38431bc72bf7cbf9104f2677 100644 (file)
@@ -10,6 +10,8 @@ CLASS(MachineGun, Weapon)
 /* modelname */ ATTRIB(MachineGun, mdl, string, "uzi");
 #ifdef GAMEQC
 /* model     */ ATTRIB(MachineGun, m_model, Model, MDL_MACHINEGUN_ITEM);
+/* flash mdl */ ATTRIB(MachineGun, m_muzzlemodel, Model, MDL_MACHINEGUN_MUZZLEFLASH);
+/* flash eff */ ATTRIB(MachineGun, m_muzzleeffect, entity, EFFECT_MACHINEGUN_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(MachineGun, w_crosshair, string, "gfx/crosshairuzi");
 /* crosshair */ ATTRIB(MachineGun, w_crosshair_size, float, 0.6);
index 90090077c1b4c63c3f8207406c82cf6cb3ff32f5..b458e2c37371baa1c916ad2d0b92c3a1abd56002 100644 (file)
@@ -254,9 +254,6 @@ void W_MineLayer_Damage(entity this, entity inflictor, entity attacker, float da
 
 void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 {
-       entity mine;
-       entity flash;
-
        // scan how many mines we placed, and return if we reached our limit
        if(WEP_CVAR(minelayer, limit))
        {
@@ -273,9 +270,9 @@ void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity)
        W_DecreaseAmmo(thiswep, actor, WEP_CVAR(minelayer, ammo), weaponentity);
 
        W_SetupShot_ProjectileSize(actor, weaponentity, '-4 -4 -4', '4 4 4', false, 5, SND_MINE_FIRE, CH_WEAPON_A, WEP_CVAR(minelayer, damage), thiswep.m_id);
-       Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
-       mine = WarpZone_RefSys_SpawnSameRefSys(actor);
+       entity mine = WarpZone_RefSys_SpawnSameRefSys(actor);
        mine.weaponentity_fld = weaponentity;
        IL_PUSH(g_mines, mine);
        mine.owner = mine.realowner = actor;
@@ -317,13 +314,6 @@ void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 
        CSQCProjectile(mine, true, PROJECTILE_MINE, true);
 
-       // muzzle flash for 1st person view
-       flash = spawn();
-       setmodel(flash, MDL_MINELAYER_MUZZLEFLASH); // precision set below
-       SUB_SetFade(flash, time, 0.1);
-       flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       W_AttachToShotorg(actor, weaponentity, flash, '5 0 0');
-
        // common properties
 
        MUTATOR_CALLHOOK(EditProjectile, actor, mine);
index 6d63e539b49099a558de124334f28fca34826281..b822eee68a162a3f327003d4f02e3a3318ab31a6 100644 (file)
@@ -10,6 +10,8 @@ CLASS(MineLayer, Weapon)
 /* modelname */ ATTRIB(MineLayer, mdl, string, "minelayer");
 #ifdef GAMEQC
 /* model     */ ATTRIB(MineLayer, m_model, Model, MDL_MINELAYER_ITEM);
+/* flash mdl */ ATTRIB(MineLayer, m_muzzlemodel, Model, MDL_MINELAYER_MUZZLEFLASH);
+/* flash eff */ ATTRIB(MineLayer, m_muzzleeffect, entity, EFFECT_ROCKET_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(MineLayer, w_crosshair, string, "gfx/crosshairminelayer");
 /* crosshair */ ATTRIB(MineLayer, w_crosshair_size, float, 0.9);
index 904f0c12838ff37b775847a0f4541d560406abd9..6f37469f032dd6cc94e1bee71149d1d25215bcba 100644 (file)
@@ -154,7 +154,7 @@ void W_Mortar_Attack(Weapon thiswep, entity actor, .entity weaponentity)
        W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage), thiswep.m_id);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
-       Send_Effect(EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        entity gren = new(grenade);
        gren.owner = gren.realowner = actor;
@@ -206,7 +206,7 @@ void W_Mortar_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
        W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage), thiswep.m_id | HITTYPE_SECONDARY);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
-       Send_Effect(EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        gren = new(grenade);
        gren.owner = gren.realowner = actor;
index 4593442379a023b0dc0c80b86e66bd2cf2c9538c..97ee20791965e32f36c9ed2fc4bde13c4dc97859 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Mortar, Weapon)
 /* modelname */ ATTRIB(Mortar, mdl, string, "gl");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Mortar, m_model, Model, MDL_MORTAR_ITEM);
+/* flash mdl */ ATTRIB(Mortar, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Mortar, m_muzzleeffect, entity, EFFECT_GRENADE_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Mortar, w_crosshair, string, "gfx/crosshairgrenadelauncher");
 /* crosshair */ ATTRIB(Mortar, w_crosshair_size, float, 0.7);
index 7daf4ec40803c445f109569a9a8e73e532beb4e6..9f4bdc15e63d1ba3c6ef9e14177ce084952f97d7 100644 (file)
@@ -2,7 +2,7 @@
 
 #ifdef SVQC
 
-void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, float pDamage, float pForce, float pSolidPenetration, float pAmmo, int deathtype, float pTracer, float pShots, Sound pSound, entity actor)
+void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, float pDamage, float pHeadshotDamage, float pForce, float pSolidPenetration, float pAmmo, int deathtype, float pTracer, float pShots, Sound pSound, entity actor)
 {
        float i;
 
@@ -10,7 +10,7 @@ void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, flo
 
        W_SetupShot(actor, weaponentity, true, 2, pSound, CH_WEAPON_A, pDamage * pShots, deathtype);
 
-       Send_Effect(EFFECT_RIFLE_MUZZLEFLASH, w_shotorg, w_shotdir * 2000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir * 2);
 
        if(PHYS_INPUT_BUTTON_ZOOM(actor) | PHYS_INPUT_BUTTON_ZOOMSCRIPT(actor)) // if zoomed, shoot from the eye
        {
@@ -19,7 +19,7 @@ void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, flo
        }
 
        for(i = 0; i < pShots; ++i)
-               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, pSpread, pSolidPenetration, pDamage, pForce, deathtype, (pTracer ? EFFECT_RIFLE : EFFECT_RIFLE_WEAK));
+               fireBullet(actor, weaponentity, w_shotorg, w_shotdir, pSpread, pSolidPenetration, pDamage, pHeadshotDamage, pForce, deathtype, (pTracer ? EFFECT_RIFLE : EFFECT_RIFLE_WEAK));
 
        if(autocvar_g_casings >= 2)
     {
@@ -30,12 +30,12 @@ void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, flo
 
 void W_Rifle_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 {
-       W_Rifle_FireBullet(thiswep, weaponentity, WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, solidpenetration), WEP_CVAR_PRI(rifle, ammo), thiswep.m_id, WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), SND_CAMPINGRIFLE_FIRE, actor);
+       W_Rifle_FireBullet(thiswep, weaponentity, WEP_CVAR_PRI(rifle, spread), WEP_CVAR_PRI(rifle, damage), WEP_CVAR_PRI(rifle, headshot_multiplier), WEP_CVAR_PRI(rifle, force), WEP_CVAR_PRI(rifle, solidpenetration), WEP_CVAR_PRI(rifle, ammo), thiswep.m_id, WEP_CVAR_PRI(rifle, tracer), WEP_CVAR_PRI(rifle, shots), SND_CAMPINGRIFLE_FIRE, actor);
 }
 
 void W_Rifle_Attack2(Weapon thiswep, entity actor, .entity weaponentity)
 {
-       W_Rifle_FireBullet(thiswep, weaponentity, WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, solidpenetration), WEP_CVAR_SEC(rifle, ammo), thiswep.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), SND_CAMPINGRIFLE_FIRE2, actor);
+       W_Rifle_FireBullet(thiswep, weaponentity, WEP_CVAR_SEC(rifle, spread), WEP_CVAR_SEC(rifle, damage), WEP_CVAR_SEC(rifle, headshot_multiplier), WEP_CVAR_SEC(rifle, force), WEP_CVAR_SEC(rifle, solidpenetration), WEP_CVAR_SEC(rifle, ammo), thiswep.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(rifle, tracer), WEP_CVAR_SEC(rifle, shots), SND_CAMPINGRIFLE_FIRE2, actor);
 }
 
 .void(Weapon thiswep, entity actor, .entity weaponentity) rifle_bullethail_attackfunc;
index ae9a3b9aa5fa2b846800d280793f515b36e06baf..7a2348af740d78954bd6ae86e09af5f1ef1ae4a3 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Rifle, Weapon)
 /* modelname */ ATTRIB(Rifle, mdl, string, "campingrifle");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Rifle, m_model, Model, MDL_RIFLE_ITEM);
+/* flash mdl */ ATTRIB(Rifle, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Rifle, m_muzzleeffect, entity, EFFECT_RIFLE_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Rifle, w_crosshair, string, "gfx/crosshairrifle");
 /* crosshair */ ATTRIB(Rifle, w_crosshair_size, float, 0.6);
@@ -27,6 +29,7 @@ CLASS(Rifle, Weapon)
                P(class, prefix, bursttime, float, NONE) \
                P(class, prefix, damage, float, BOTH) \
                P(class, prefix, force, float, BOTH) \
+               P(class, prefix, headshot_multiplier, float, BOTH) \
                P(class, prefix, refire, float, BOTH) \
                P(class, prefix, reload, float, SEC) \
                P(class, prefix, reload_ammo, float, NONE) \
index d7ba289f5ca7ee9f1e92669a9fd5098b93791771..c782b4eafc55de68a6d555359d617f17a5ae5efc 100644 (file)
@@ -171,7 +171,7 @@ void W_Seeker_Fire_Missile(Weapon thiswep, entity actor, .entity weaponentity, v
        makevectors(actor.v_angle);
        W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_SEEKER_FIRE, CH_WEAPON_A, 0, ((m_target != NULL) ? thiswep.m_id | HITTYPE_SECONDARY : thiswep.m_id));
        w_shotorg += f_diff;
-       Send_Effect(EFFECT_SEEKER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        //actor.detornator         = false;
 
@@ -269,7 +269,8 @@ void W_Seeker_Fire_Flac(Weapon thiswep, entity actor, .entity weaponentity)
        W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_FLAC_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, flac_damage), thiswep.m_id | HITTYPE_SECONDARY);
        w_shotorg += f_diff;
 
-       Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       // uses hagar effects!
+       W_MuzzleFlash(WEP_HAGAR, actor, weaponentity, w_shotorg, w_shotdir);
 
        missile                                 = new(missile);
        missile.owner                   = missile.realowner = actor;
index 5690938137f19955987acc2b084fb4b92ebe2251..3e79ce252bdd7bb7461c306ce2e8f20664876845 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Seeker, Weapon)
 /* modelname */ ATTRIB(Seeker, mdl, string, "seeker");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Seeker, m_model, Model, MDL_SEEKER_ITEM);
+/* flash mdl */ ATTRIB(Seeker, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Seeker, m_muzzleeffect, entity, EFFECT_SEEKER_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Seeker, w_crosshair, string, "gfx/crosshairseeker");
 /* crosshair */ ATTRIB(Seeker, w_crosshair_size, float, 0.8);
index b8cae5fd5da0d66c0216c9806c788b1752cfab8d..3e25800cce5a69119e3073358f1822ac87d4c04c 100644 (file)
@@ -26,12 +26,12 @@ void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float
                antilag_takeback_all(actor, lag);
 
        for(int sc = 0;sc < bullets;sc = sc + 1)
-               fireBullet_antilag(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, force, thiswep.m_id, bullet_trail_effect, false);
+               fireBullet_antilag(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, 0, force, thiswep.m_id, bullet_trail_effect, false);
        
        if(lag && bullets > 0)
                antilag_restore_all(actor);
 
-       Send_Effect(EFFECT_SHOTGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, ammocount);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
 
        // casing code
        if(autocvar_g_casings >= 1)
@@ -40,14 +40,6 @@ void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float
                //for(int sc = 0;sc < WEP_CVAR_PRI(shotgun, ammo);sc = sc + 1)
                        SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, actor, weaponentity);
        }
-
-       // muzzle flash for 1st person view
-       entity flash = spawn();
-       setmodel(flash, MDL_SHOTGUN_MUZZLEFLASH); // precision set below
-       setthink(flash, SUB_Remove);
-       flash.nextthink = time + 0.06;
-       flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       W_AttachToShotorg(actor, weaponentity, flash, '5 0 0');
 }
 
 .float swing_prev;
index dc6dae157d7f81d345076370d116a92d332d1eb4..1c2d280102af276cdbca8e18baab892ca9910f61 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Shotgun, Weapon)
 /* modelname */ ATTRIB(Shotgun, mdl, string, "shotgun");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Shotgun, m_model, Model, MDL_SHOTGUN_ITEM);
+/* flash mdl */ ATTRIB(Shotgun, m_muzzlemodel, Model, MDL_SHOTGUN_MUZZLEFLASH);
+/* flash eff */ ATTRIB(Shotgun, m_muzzleeffect, entity, EFFECT_SHOTGUN_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Shotgun, w_crosshair, string, "gfx/crosshairshotgun");
 /* crosshair */ ATTRIB(Shotgun, w_crosshair_size, float, 0.65);
index e71ed7478a327227a021e91491aaf352bec50784..57668782f1da5ce889aa31dc733e6e3b0ba077b8 100644 (file)
@@ -85,7 +85,7 @@ NET_HANDLE(TE_CSQC_VAPORBEAMPARTICLE, bool isNew)
        this.sv_entnum = myowner;
        this.team = ReadByte() - 1;
 
-       pointparticles(EFFECT_VORTEX_MUZZLEFLASH, this.vorg1, normalize(this.vorg2 - this.vorg1) * 1000, 1);
+       //pointparticles(EFFECT_VORTEX_MUZZLEFLASH, this.vorg1, normalize(this.vorg2 - this.vorg1) * 1000, 1);
 
        if(autocvar_cl_vaporizerbeam_particle)
        {
@@ -124,9 +124,11 @@ void W_Vaporizer_Attack(Weapon thiswep, entity actor, .entity weaponentity)
 
        yoda = 0;
        damage_goodhits = 0;
-       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, vaporizer_damage, WEP_CVAR_PRI(vaporizer, force), 0, 0, 0, 0, thiswep.m_id);
+       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, vaporizer_damage, true, WEP_CVAR_PRI(vaporizer, force), 0, 0, 0, 0, thiswep.m_id);
 
        // do this now, as goodhits is disabled below
+       vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, normalize(v - w_shotorg));
        SendCSQCVaporizerBeamParticle(actor, damage_goodhits);
 
        if(yoda && flying)
@@ -186,7 +188,8 @@ void W_RocketMinsta_Attack2(entity actor, .entity weaponentity)
 
        W_SetupShot_ProjectileSize (actor, weaponentity, '0 0 -3', '0 0 -3', false, 2, SND_CRYLINK_FIRE, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id);
 
-       Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       // uses electro effects
+       W_MuzzleFlash(WEP_ELECTRO, actor, weaponentity, w_shotorg, w_shotdir);
 
     while(counter < total)
        {
@@ -238,7 +241,8 @@ void W_RocketMinsta_Attack3 (entity actor, .entity weaponentity)
 
        W_SetupShot_ProjectileSize (actor, weaponentity, '0 0 -3', '0 0 -3', false, 2, SND_ELECTRO_FIRE2, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id);
 
-       Send_Effect(EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1);
+       // uses electro effects
+       W_MuzzleFlash(WEP_ELECTRO, actor, weaponentity, w_shotorg, w_shotdir);
 
     while(counter < total)
        {
index f87a800a921aeeba42b06d248cbb16e303559472..00dbf78ec48662679a72fc58d9e85ce5b5d9d3fa 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Vaporizer, Weapon)
 /* modelname */ ATTRIB(Vaporizer, mdl, string, "minstanex");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Vaporizer, m_model, Model, MDL_VAPORIZER_ITEM);
+/* flash mdl */ ATTRIB(Vaporizer, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Vaporizer, m_muzzleeffect, entity, EFFECT_VORTEX_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Vaporizer, w_crosshair, string, "gfx/crosshairminstanex");
 /* crosshair */ ATTRIB(Vaporizer, w_crosshair_size, float, 0.6);
index 46fd4d8c0887639b8b8c32e8b116c0f60ff4538e..5a1cd1a9200469c801d85576596ec7bf43117761 100644 (file)
@@ -55,7 +55,7 @@ NET_HANDLE(TE_CSQC_VORTEXBEAMPARTICLE, bool isNew)
     vector endpos = ReadVector();
        charge = ReadByte() / 255.0;
 
-       pointparticles(EFFECT_VORTEX_MUZZLEFLASH, shotorg, normalize(endpos - shotorg) * 1000, 1);
+       //pointparticles(EFFECT_VORTEX_MUZZLEFLASH, shotorg, normalize(endpos - shotorg) * 1000, 1);
 
        //draw either the old v2.3 beam or the new beam
        charge = sqrt(charge); // divide evenly among trail spacing and alpha
@@ -139,7 +139,7 @@ void W_Vortex_Attack(Weapon thiswep, entity actor, .entity weaponentity, float i
 
        yoda = 0;
        damage_goodhits = 0;
-       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, dtype);
+       FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, false, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, dtype);
 
        if(yoda && flying)
                Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
@@ -151,7 +151,9 @@ void W_Vortex_Attack(Weapon thiswep, entity actor, .entity weaponentity, float i
 
        actor.vortex_lasthit = damage_goodhits;
 
-       //beam and muzzle flash done on client
+       //beam done on client
+    vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+       W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, normalize(v - w_shotorg));
        SendCSQCVortexBeamParticle(charge);
 
        W_DecreaseAmmo(thiswep, actor, myammo, weaponentity);
index 783e42a8ea567d146eb1e1dae62f91d9d666d7f3..a2b0a4b1db0689513c614286f020264ecfc41b93 100644 (file)
@@ -10,6 +10,8 @@ CLASS(Vortex, Weapon)
 /* modelname */ ATTRIB(Vortex, mdl, string, "nex");
 #ifdef GAMEQC
 /* model     */ ATTRIB(Vortex, m_model, Model, MDL_VORTEX_ITEM);
+/* flash mdl */ ATTRIB(Vortex, m_muzzlemodel, Model, MDL_Null);
+/* flash eff */ ATTRIB(Vortex, m_muzzleeffect, entity, EFFECT_VORTEX_MUZZLEFLASH);
 #endif
 /* crosshair */ ATTRIB(Vortex, w_crosshair, string, "gfx/crosshairnex");
 /* crosshair */ ATTRIB(Vortex, w_crosshair_size, float, 0.65);
index 624e0a9126e8a497272cf0ad2a9c98ec6b26b2eb..d4718514d232770721dc8d215b87e35dd51b8f0a 100644 (file)
@@ -24,4 +24,15 @@ void sys_phys_pregame_hold(entity this) {}
 
 void sys_phys_spectator_control(entity this) {}
 
-void sys_phys_fixspeed(entity this, float maxspeed_mod) {}
+void sys_phys_fixspeed(entity this, float maxspeed_mod)
+{
+       float spd = max(PHYS_MAXSPEED(this), PHYS_MAXAIRSPEED(this)) * maxspeed_mod;
+       if (this.speed != spd) {
+               this.speed = spd;
+               string temps = ftos(spd);
+               cvar_set("cl_forwardspeed", temps);
+               cvar_set("cl_backspeed", temps);
+               cvar_set("cl_sidespeed", temps);
+               cvar_set("cl_upspeed", temps);
+       }
+}
index 75657c90f268c6f9248377114df942c96fbf1674..70ecc524cafd2680feae7769785296f0f58f6f14 100644 (file)
@@ -112,7 +112,7 @@ void sys_phys_update(entity this, float dt)
                sys_phys_simulate(this, dt);
                this.com_phys_water = false;
                this.jumppadcount = 0;
-       } else if (time < this.ladder_time) {
+       } else if (this.ladder_entity) {
                this.com_phys_friction = PHYS_FRICTION(this);
                this.com_phys_vel_max = PHYS_MAXSPEED(this) * maxspeed_mod;
                this.com_phys_acc_rate = PHYS_ACCELERATE(this) * maxspeed_mod;
index 45128393baee77d55b07b436b735291ae9c08e0c..175c57c4844de5206959de1031ad4adff23577fa 100644 (file)
@@ -84,16 +84,6 @@ void sys_phys_spectator_control(entity this)
 
 void sys_phys_fixspeed(entity this, float maxspeed_mod)
 {
-       float spd = max(PHYS_MAXSPEED(this), PHYS_MAXAIRSPEED(this)) * maxspeed_mod;
-       if (this.speed != spd) {
-               this.speed = spd; // TODO: send this as a stat and set the below cvars on the client?
-               string temps = ftos(spd);
-               stuffcmd(this, strcat("cl_forwardspeed ", temps, "\n"));
-               stuffcmd(this, strcat("cl_backspeed ", temps, "\n"));
-               stuffcmd(this, strcat("cl_sidespeed ", temps, "\n"));
-               stuffcmd(this, strcat("cl_upspeed ", temps, "\n"));
-       }
-
        if (this.jumpspeedcap_min != autocvar_sv_jumpspeedcap_min) {
                this.jumpspeedcap_min = autocvar_sv_jumpspeedcap_min;
                stuffcmd(this, sprintf("\ncl_jumpspeedcap_min \"%s\"\n", autocvar_sv_jumpspeedcap_min));
index 5745ce072e044940ddadd3d2e19dd41875e65dbb..cf542f39c8f47d0d6120c6ef1e56336a07676e90 100644 (file)
@@ -84,7 +84,7 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i)
        if(s != "data")
                modname = sprintf("%s (%s)", modname, s);
 
-       Gametype j = MapInfo_Type_FromString(typestr); // try and get the real name of the game type
+       Gametype j = MapInfo_Type_FromString(typestr, false); // try and get the real name of the game type
        if(j) { typestr = MapInfo_Type_ToText(j); } // only set it if we actually found it
 
        me.currentServerType = strzone(typestr);
index b2ae8c0ba9269752bbeddf82c4beb723d5cf8e70..717fe524bbe98aa3f33376dfe3b05d16f60285c0 100644 (file)
@@ -1,6 +1,6 @@
 #include "dialog_singleplayer.qh"
 
-#include <common/mapinfo.qh>
+#include <common/gamemodes/_mod.qh>
 #include "bigbutton.qh"
 #include "radiobutton.qh"
 #include "textlabel.qh"
index 2de655940f70d124f67887fca042cb8678176f3f..da495b91c930dc1839c9d39de5bd9087ce281dc4 100644 (file)
@@ -1,6 +1,7 @@
 #include "gametypelist.qh"
 
 #include "dialog_multiplayer_create.qh"
+#include <common/gamemodes/_mod.qh>
 #include <common/mapinfo.qh>
 
 entity makeXonoticGametypeList()
index 6840769d72eb8e63f36cc5a1a440e1a07b8745b6..664101a81ddd2066b0779e41a0e9020152cae335 100644 (file)
@@ -26,7 +26,6 @@ void XonoticLanguageList_configureXonoticLanguageList(entity me)
 
 void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
 {
-       string s, p;
        if(isSelected)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
        else if(isFocused)
@@ -35,17 +34,31 @@ void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
        }
 
-       s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
+       string p = me.languageParameter(me, i, LANGPARM_PERCENTAGE);
+       float alpha_factor = 1;
+       if (p != "")
+       {
+               float percent = stof(p);
+               if (percent >= 90)
+                       alpha_factor = 1;
+               else if (percent >= 50)
+                       alpha_factor = 0.65;
+               else
+                       alpha_factor = 0.3;
+       }
+       else
+               p = "\xE2\x9C\x94"; // Unicode Character 'HEAVY CHECK MARK' (U+2714)
+
+       string s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
 
        vector save_fontscale = draw_fontscale;
        float f = draw_CondensedFontFactor(s, false, me.realFontSize, 1);
        draw_fontscale.x *= f;
        vector fs = me.realFontSize;
        fs.x *= f;
-       draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT, 0);
+       draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, fs, SKINCOLOR_TEXT * alpha_factor, SKINALPHA_TEXT, 0);
        draw_fontscale = save_fontscale;
 
-       p = me.languageParameter(me, i, LANGPARM_PERCENTAGE);
        if(p != "")
        {
                vector save_fontscale = draw_fontscale;
@@ -53,7 +66,8 @@ void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool
                draw_fontscale.x *= f;
                vector fs = me.realFontSize;
                fs.x *= f;
-               draw_Text(me.realUpperMargin * eY + (me.columnPercentageOrigin + (me.columnPercentageSize - draw_TextWidth(p, 0, fs))) * eX, p, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT, 0);
+               float x_ofs = me.columnPercentageOrigin + (me.columnPercentageSize - draw_TextWidth(p, 0, fs));
+               draw_Text(me.realUpperMargin * eY + x_ofs * eX, p, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT * alpha_factor, 0);
                draw_fontscale = save_fontscale;
        }
 }
index 9a55f884030e25732d23cad43de801e4e6c22c13..70b108ae339af06a97c43c62a77aed7a9d0fdbc2 100644 (file)
@@ -1,6 +1,8 @@
 #include "slider_resolution.qh"
 
 /* private static */ float XonoticResolutionSlider_DataHasChanged;
+/* attrib */ float vid_conwidth;
+/* attrib */ float vid_conheight;
 
 // Updates cvars (to be called by menu.qc at startup or on detected res change)
 float updateConwidths(float width, float height, float pixelheight)
@@ -19,6 +21,20 @@ float updateConwidths(float width, float height, float pixelheight)
        cvar_set("_menu_vid_pixelheight", ftos(pixelheight));
        cvar_set("_menu_vid_desktopfullscreen", cvar_string("vid_desktopfullscreen"));
 
+       // engine is handling conwidth calculations!
+       if((cvar_type("vid_conwidthauto") & CVAR_TYPEFLAG_ENGINE) && cvar("vid_conwidthauto"))
+       {
+               if(vid_conwidth != cvar("vid_conwidth") || vid_conheight != cvar("vid_conheight"))
+               {
+                       // Please reload resolutions list and such stuff.
+                       XonoticResolutionSlider_DataHasChanged = true;
+                       vid_conwidth = cvar("vid_conwidth");
+                       vid_conheight = cvar("vid_conheight");
+                       return 1;
+               }
+               return 0; // No recalculation
+       }
+
        r_x = width;
        r_y = height;
        r_z = pixelheight;
index c0a8c6b2b54e416017cf39149ee976f55e769e90..ac993e622bd0851e3eeb6ef5acb63c43f5e32a0c 100644 (file)
@@ -6,7 +6,7 @@
 #include "../menu.qh"
 #include <common/campaign_common.qh>
 #include <common/constants.qh>
-#include <common/mapinfo.qh>
+#include <common/gamemodes/_mod.qh>
 #include <common/util.qh>
 #include <common/command/_mod.qh>
 
index d0c6da839ceb26d2b902657ef494f308b3bbeccf..0ff47977762180e7eb5688d9215e3623ccd0fafe 100644 (file)
@@ -1174,7 +1174,7 @@ void havocbot_movetogoal(entity this)
        }
 
        float ladder_zdir = 0;
-       if(time < this.ladder_time)
+       if(this.ladder_entity)
        {
                if(this.goalcurrent.origin.z + this.goalcurrent.mins.z > this.origin.z + this.mins.z)
                {
index ebc18a6875353a2306ea07c6304d989860b76cac..fe608d1f55ac26de10917346710bff7de2e6ff68 100644 (file)
@@ -1756,7 +1756,7 @@ int navigation_poptouchedgoals(entity this)
                        gc_min = this.goalcurrent.origin - '1 1 1' * 12;
                        gc_max = this.goalcurrent.origin + '1 1 1' * 12 + eZ * (jumpheight_vec.z + STAT(PL_MIN, this).z);
                }
-               if (time < this.ladder_time)
+               if (this.ladder_entity)
                {
                        if (!boxesoverlap(this.absmin, this.absmax - eZ * STAT(PL_MAX, this).z, gc_min, gc_max))
                                break;
index da407cbbc8673d7cfd2be4603898c0bf5aa1f120..b4e6df09c60b50fd27e6ff540d810b19d53f6625 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <common/constants.qh>
 #include <common/debug.qh>
+#include <common/gamemodes/_mod.qh>
 #include <common/mapobjects/trigger/jumppads.qh>
 #include <common/net_linked.qh>
 #include <common/physics/player.qh>
index 1a01868fb3b1cc660d0e2720dac392dfdafef648..784288a6ee555b50dbf6637f238f0b4a4168bc92 100644 (file)
@@ -33,7 +33,7 @@ float Campaign_Invalid()
        string thismapname, wantedmapname;
        thismapname = GetMapname();
        wantedmapname = campaign_gametype[0];
-       if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname))
+       if(MapInfo_CurrentGametype() != MapInfo_Type_FromString(wantedmapname, false))
                return CampaignBailout("wrong game type!");
        wantedmapname = campaign_mapname[0];
        if(wantedmapname != thismapname)
@@ -67,7 +67,7 @@ void CampaignPreInit()
 
        if(autocvar_sv_cheats)
        {
-               MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
+               MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
                CampaignFile_Unload();
                CampaignBailout("JOLLY CHEATS AHAHAHAHAHAHAH))");
                return;
@@ -96,7 +96,7 @@ void CampaignPreInit()
        cvar_settemp("skill", ftos(baseskill));
        cvar_settemp("bot_number", ftos(campaign_bots[0]));
 
-       MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
+       MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0], false));
 
        if(Campaign_Invalid())
                return;
index 5047334f0a4e9025d2b54d9da8527b06c0200626..1211e8988ea98b65c5fb90ac8f952a3c0e540067 100644 (file)
@@ -39,6 +39,7 @@
 #include <common/effects/qc/globalsound.qh>
 
 #include "../common/mapobjects/func/conveyor.qh"
+#include <common/mapobjects/func/ladder.qh>
 #include "../common/mapobjects/teleporters.qh"
 #include "../common/mapobjects/target/spawnpoint.qh"
 #include <common/mapobjects/trigger/counter.qh>
@@ -691,6 +692,9 @@ void PutPlayerInServer(entity this)
                IL_REMOVE(g_swamped, this);
        this.swampslug = NULL;
        this.swamp_interval = 0;
+       if(this.ladder_entity)
+               IL_REMOVE(g_ladderents, this);
+       this.ladder_entity = NULL;
        IL_EACH(g_counters, it.realowner == this,
        {
                delete(it);
index 08758a06536f706bd722e6ed57549e0ae1b6d154..51b133636756d558d79cae3d7371d5617a99660d 100644 (file)
@@ -137,7 +137,7 @@ void ClientKill_TeamChange(entity this, float targetteam) // 0 = don't change, -
                        this.killindicator.count = bound(0, ceil(killtime), 10);
                        //sprint(this, strcat("^1You'll be dead in ", ftos(this.killindicator.cnt), " seconds\n"));
 
-                       IL_EACH(g_clones, it.enemy == this && !(it.effects & CSQCMODEL_EF_RESPAWNGHOST),
+                       IL_EACH(g_clones, it.enemy == this && !(it.effects & CSQCMODEL_EF_RESPAWNGHOST) && !it.killindicator,
                        {
                                it.killindicator = spawn();
                                it.killindicator.owner = it;
index f791446eb5872a8b0a6fb37807d430bc9aa594d0..32ccd883e97d28d0ebbce901bdd67cf8e2b4399d 100644 (file)
@@ -395,7 +395,7 @@ void CommonCommand_editmob(int request, entity caller, int argc)
 
                                        totalspawned += 1;
                                        WarpZone_TraceBox(CENTER_OR_VIEWOFS(caller), caller.mins, caller.maxs, CENTER_OR_VIEWOFS(caller) + v_forward * 150, true, caller);
-                                       mon = spawnmonster(spawn(), arg_lower, 0, caller, caller, trace_endpos, false, false, moveflag);
+                                       mon = spawnmonster(spawn(), arg_lower, MON_Null, caller, caller, trace_endpos, false, false, moveflag);
                                        print_to(caller, strcat("Spawned ", mon.monster_name));
                                        return;
                                }
@@ -416,7 +416,7 @@ void CommonCommand_editmob(int request, entity caller, int argc)
                                        if (!autocvar_g_monsters_edit) { print_to(caller, "Monster editing is disabled"); return; }
                                        if (!is_visible) { print_to(caller, "You must look at your monster to edit it"); return; }
                                        if (mon.realowner != caller && autocvar_g_monsters_edit < 2) { print_to(caller, "This monster does not belong to you"); return; }
-                                       if (mon.monsterid == MON_MAGE.monsterid) { print_to(caller, "Mage skins can't be changed"); return; }  // TODO
+                                       if (mon.monsterdef == MON_MAGE) { print_to(caller, "Mage skins can't be changed"); return; }  // TODO
 
                                        mon.skin = stof(argument);
                                        print_to(caller, strcat("Monster skin successfully changed to ", ftos(mon.skin)));
index b768ccb7e8510355d99068660661fd901dd96054..3e75b5b6f140f9dc7df7176d959c5ed2b5af952d 100644 (file)
@@ -9,8 +9,8 @@
 #include "../race.qh"
 
 #include <common/constants.qh>
+#include <common/gamemodes/_mod.qh>
 #include <common/net_linked.qh>
-#include <common/mapinfo.qh>
 #include <common/util.qh>
 
 #include <common/monsters/_mod.qh>
index 62edb992f9749b723ab8c559d979c5280f098aa9..034bd6cb92cc37004d364ff67334f355855c287d 100644 (file)
@@ -723,7 +723,7 @@ void GameCommand_gametype(int request, int argc)
                        if (argv(1) != "")
                        {
                                string s = argv(1);
-                               Gametype t = MapInfo_Type_FromString(s), tsave = MapInfo_CurrentGametype();
+                               Gametype t = MapInfo_Type_FromString(s, false), tsave = MapInfo_CurrentGametype();
 
                                if (t)
                                {
index c405b8a24b70a853003e52f4982702cc4039e274..134956e7d8fc528c328e1ee68f21a908139f6bac 100644 (file)
@@ -4,6 +4,7 @@
 #include <server/miscfunctions.qh>
 #include <server/items.qh>
 #include <server/resources.qh>
+#include <common/gamemodes/_mod.qh>
 #include <common/t_items.qh>
 #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
 #include <common/mapobjects/triggers.qh>
index e12970a9c63d3d912c881170a7c94ddd6a9cfab0..1e50f3edb224936e5d0047e68c801b12e4c08e8b 100644 (file)
@@ -357,7 +357,6 @@ const int ACTIVE_TOGGLE     = 3;
 .entity iceblock;
 .entity frozen_by; // for ice fields
 
-.entity muzzle_flash;
 .float misc_bulletcounter;     // replaces uzi & hlac bullet counter.
 
 void PlayerUseKey(entity this);
index 9a8be98da877ea4bb29b7cde797d9ebec386dc86..626b3e5ac9deb549962da400657d4d0044659fca 100644 (file)
@@ -27,6 +27,7 @@
 #include "../common/playerstats.qh"
 #include "../common/teams.qh"
 #include "../common/util.qh"
+#include <common/gamemodes/_mod.qh>
 #include <common/gamemodes/rules.qh>
 #include <common/weapons/_all.qh>
 #include "../lib/csqcmodel/sv_model.qh"
@@ -584,8 +585,8 @@ void Damage(entity targ, entity inflictor, entity attacker, float damage, int de
 
        entity attacker_save = attacker;
 
-       // special rule: gravity bomb does not hit team mates (other than for disconnecting the hook)
-       if(DEATH_ISWEAPON(deathtype, WEP_HOOK) || DEATH_ISWEAPON(deathtype, WEP_TUBA))
+       // special rule: gravity bombs and sound-based attacks do not affect team mates (other than for disconnecting the hook)
+       if(DEATH_ISWEAPON(deathtype, WEP_HOOK) || (deathtype & HITTYPE_SOUND))
        {
                if(IS_PLAYER(targ) && SAME_TEAM(targ, attacker))
                {
@@ -860,7 +861,7 @@ void Damage(entity targ, entity inflictor, entity attacker, float damage, int de
                        farcent.nextthink = time + 0.1;
                        setthink(farcent, SUB_Remove);
                }
-               else
+               else if(targ.move_movetype != MOVETYPE_NOCLIP)
                {
                        targ.velocity = targ.velocity + farce;
                }
@@ -910,7 +911,7 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in
        total_damage_to_creatures = 0;
 
        if(deathtype != (WEP_HOOK.m_id | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once
-               if(DEATH_WEAPONOF(deathtype) != WEP_TUBA) // do not send tuba damage (bandwidth hog)
+               if(!(deathtype & HITTYPE_SOUND)) // do not send radial sound damage (bandwidth hog)
                {
                        force = inflictorvelocity;
                        if(force == '0 0 0')
index aa970f4be3626a6ef4187417ad8c6f4a3f84769a..4894b272439319fd76fb9c528bf0df61296cab51 100644 (file)
@@ -364,7 +364,7 @@ void FireGrapplingHook(entity actor, .entity weaponentity)
        vector oldmovedir = actor.(weaponentity).movedir;
        actor.(weaponentity).movedir = vs;
        W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', true, 0, SND_HOOK_FIRE, CH_WEAPON_B, 0, WEP_HOOK.m_id);
-       Send_Effect(EFFECT_HOOK_MUZZLEFLASH, w_shotorg, '0 0 0', 1);
+       W_MuzzleFlash(WEP_HOOK, actor, weaponentity, w_shotorg, '0 0 0');
        actor.(weaponentity).movedir = oldmovedir;
 
        entity missile = WarpZone_RefSys_SpawnSameRefSys(actor);
index 92353f6d12e4f845ffe9538efb5114928e50d487..b66bcdaacf34b96adacaf02ddf7f62294590b3a8 100644 (file)
@@ -23,6 +23,7 @@
 #include "../common/constants.qh"
 #include <common/net_linked.qh>
 #include "../common/deathtypes/all.qh"
+#include <common/gamemodes/_mod.qh>
 #include "../common/gamemodes/sv_rules.qh"
 #include "../common/mapinfo.qh"
 #include "../common/monsters/_mod.qh"
index 62acd99d8df93ac608b6d32b431529da000189c3..090b239cc8c839ddddc8034d9f44ada102eac031 100644 (file)
@@ -9,6 +9,8 @@
 #include "weapons/tracing.qh"
 #include "weapons/weaponsystem.qh"
 
+#include <common/gamemodes/_mod.qh>
+
 #include <common/state.qh>
 
 #include "../common/minigames/sv_minigames.qh"
index fe8748f3852b494f2bf19ed73803f955bfebd00a..e427483069522786f163c6ff9cf6908151c8e84f 100644 (file)
@@ -47,10 +47,10 @@ entity mapvote_ent;
  */
 Gametype GameTypeVote_Type_FromString(string type_name)
 {
-       Gametype type = MapInfo_Type_FromString(type_name);
+       Gametype type = MapInfo_Type_FromString(type_name, false);
        if (type == NULL)
                type = MapInfo_Type_FromString(cvar_string(
-                       strcat("sv_vote_gametype_",type_name,"_type")));
+                       strcat("sv_vote_gametype_",type_name,"_type")), false);
        return type;
 }
 
@@ -58,11 +58,11 @@ int GameTypeVote_AvailabilityStatus(string type_name)
 {
        int flag = GTV_FORBIDDEN;
 
-       Gametype type = MapInfo_Type_FromString(type_name);
+       Gametype type = MapInfo_Type_FromString(type_name, false);
        if ( type == NULL )
        {
                type = MapInfo_Type_FromString(cvar_string(
-                       strcat("sv_vote_gametype_",type_name,"_type")));
+                       strcat("sv_vote_gametype_",type_name,"_type")), false);
                flag |= GTV_CUSTOM;
        }
 
index e94ee9c6ca595927bb86e9a9cc93f48f925a9aaf..1ec27a7818a1cd900aa05f51368968051d358887 100644 (file)
@@ -35,10 +35,16 @@ void soundat(entity e, vector o, float chan, string samp, float vol, float _atte
 void InitializeEntitiesRun();
 
 void stopsoundto(float _dest, entity e, float chan);
-void soundtoat(float _dest, entity e, vector o, float chan, string samp, float vol, float _atten);
+void soundtoat(float _dest, entity e, vector o, float chan, string samp, float vol, float _atten, float _pitch);
 
 void droptofloor(entity this);
 
+float trace_hits_box_1d(float end, float thmi, float thma);
+
+float trace_hits_box(vector start, vector end, vector thmi, vector thma);
+
+float tracebox_hits_box(vector start, vector mi, vector ma, vector end, vector thmi, vector thma);
+
 void attach_sameorigin(entity e, entity to, string tag);
 
 void crosshair_trace(entity pl);
@@ -82,7 +88,7 @@ void remove_unsafely(entity e);
 
 void SetMovetypeFollow(entity ent, entity e);
 
-void soundto(float dest, entity e, float chan, string samp, float vol, float atten);
+void soundto(float dest, entity e, float chan, string samp, float vol, float atten, float _pitch);
 
 void stopsound(entity e, float chan);
 
index e5a8f47f90f859908e0ba951776cbd71a3bbf854..1333b2386d81e59d4673858b5f1cac89a81bbc8c 100644 (file)
@@ -615,8 +615,17 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                this.avelocity = '0 0 0';
                // view from the floor
                this.view_ofs = '0 0 -8';
-               // toss the corpse
-               set_movetype(this, MOVETYPE_TOSS);
+               if(this.move_movetype == MOVETYPE_NOCLIP)
+               {
+                       // don't toss the corpse in this case, it can get stuck in solid (causing low fps)
+                       // or fall indefinitely into the void if out of the map
+                       this.velocity = '0 0 0';
+               }
+               else
+               {
+                       // toss the corpse
+                       set_movetype(this, MOVETYPE_TOSS);
+               }
                // shootable corpse
                this.solid = SOLID_CORPSE;
                PS(this).ballistics_density = autocvar_g_ballistics_density_corpse;
index 32fdbba172faeb67d38f1a14c6f8c46d92e0eded..43443a11ff445a20e0e45d448ae753d62e83a176 100644 (file)
@@ -10,7 +10,7 @@
 #include "command/getreplies.qh"
 #include "../common/deathtypes/all.qh"
 #include "../common/notifications/all.qh"
-#include "../common/mapinfo.qh"
+#include <common/gamemodes/_mod.qh>
 #include <common/gamemodes/rules.qh>
 #include <common/net_linked.qh>
 #include <common/state.qh>
index 0e270d30d1ab7b1b078544b1a24533aab8bab41d..3dc76afc0df832d926703f7ffd1fa2611af803ce 100644 (file)
@@ -8,7 +8,7 @@
 #include "../common/constants.qh"
 #include <common/net_linked.qh>
 #include "../common/teams.qh"
-#include <common/mapinfo.qh>
+#include <common/gamemodes/_mod.qh>
 #include "../common/mapobjects/subs.qh"
 #include "../common/mapobjects/target/spawnpoint.qh"
 #include "../common/util.qh"
index 83f1d38568b969c75683d730659838f4240ceacc..d6432d698658f270e9a60764d20f1b720c2cd3d7 100644 (file)
@@ -465,6 +465,7 @@ entity TeamBalance_CheckAllowedTeams(entity for_whom)
                team_ent.m_num_bots = 0;
        }
        setthink(balance, TeamBalance_Destroy);
+       balance.nextthink = time;
 
        int teams_mask = 0;
        string teament_name = string_null;
index 6209710b6dea85697a40639ebc18c2d7f47d509b..ef1b6bd68d81880e15f018ec4217e4f3fe81b7d4 100644 (file)
@@ -211,7 +211,18 @@ void W_SetupProjVelocity_Explicit(entity proj, vector dir, vector upDir, float p
 //  Ballistics Tracing
 // ====================
 
-void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
+bool Headshot(entity targ, entity ent, vector start, vector end)
+{
+       if(!IS_PLAYER(targ) || IS_DEAD(targ) || STAT(FROZEN, targ) || !targ.takedamage)
+               return false;
+       vector org = targ.origin; // antilag is already taken into consideration //antilag_takebackorigin(targ, CS(targ), time - ANTILAG_LATENCY(ent));
+       vector headmins = org + '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z);
+       vector headmaxs = org + '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z;
+
+       return trace_hits_box(start, end, headmins, headmaxs);
+}
+
+void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, bool headshot_notify, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
 {
        vector dir = normalize(end - start);
        vector force = dir * bforce;
@@ -220,6 +231,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
        end = end + dir;
 
        float totaldmg = 0;
+       bool headshot = false; // indicates that one of the targets hit was a headshot
 
        // trace multiple times until we hit a wall, each obstacle will be made
        // non-solid so we can hit the next, while doing this we spawn effects and
@@ -244,6 +256,9 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
                if (trace_ent == NULL || trace_fraction == 1)
                        break;
 
+               if(headshot_notify && !headshot && Headshot(trace_ent, this, start, end))
+                       headshot = true;
+
                // make the entity non-solid so we can hit the next one
                IL_PUSH(g_railgunhit, trace_ent);
                trace_ent.railgunhit = true;
@@ -285,7 +300,7 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
 
                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);
+               soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASEVOICE, ATTEN_IDLE, 0);
        });
        if(pseudoprojectile)
                delete(pseudoprojectile);
@@ -313,6 +328,9 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector
 
        IL_CLEAR(g_railgunhit);
 
+       if(headshot)
+               Send_Notification(NOTIF_ONE, this, MSG_ANNCE, ANNCE_HEADSHOT);
+
        // calculate hits and fired shots for hitscan
        if(this.(weaponentity))
                accuracy_add(this, this.(weaponentity).m_weapon, 0, min(bdamage, totaldmg));
@@ -330,7 +348,7 @@ void fireBullet_trace_callback(vector start, vector hit, vector end)
        fireBullet_last_hit = NULL;
 }
 
-void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag)
+void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect, bool do_antilag)
 {
        dir = normalize(dir + randomvec() * spread);
        vector end = start + dir * max_shot_distance;
@@ -353,6 +371,7 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
 
        WarpZone_trace_forent = this;
 
+       bool headshot = false; // indicates that one of the hit targets was a headshot
        for (;;)
        {
                WarpZone_TraceBox_ThroughZone(start, '0 0 0', '0 0 0', end, false, WarpZone_trace_forent, NULL, fireBullet_trace_callback);
@@ -400,6 +419,11 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
                        yoda = 0;
                        MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity));
                        damage = M_ARGV(4, float);
+                       if(headshot_multiplier && Headshot(hit, this, start, end))
+                       {
+                               damage *= headshot_multiplier;
+                               headshot = true;
+                       }
                        bool gooddamage = accuracy_isgooddamage(this, hit);
                        Damage(hit, this, this, damage * damage_fraction, dtype, weaponentity, start, force * dir * damage_fraction);
                        // calculate hits for ballistic weapons
@@ -459,6 +483,9 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
                        Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this);
        }
 
+       if(headshot)
+               Send_Notification(NOTIF_ONE, this, MSG_ANNCE, ANNCE_HEADSHOT);
+
        if(lag)
                antilag_restore_all(this);
 
@@ -467,7 +494,7 @@ void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector
                this.dphitcontentsmask = oldsolid;
 }
 
-void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect)
+void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect)
 {
-       fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, force, dtype, tracer_effect, true);
+       fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, headshot_multiplier, force, dtype, tracer_effect, true);
 }
index 94bd5b503ce015d2e5559fc53aae5035ed8356b8..e2f43fb7c13dfb9c2c521432318fd2a2c6210fc6 100644 (file)
@@ -64,10 +64,10 @@ void W_SetupProjVelocity_Explicit(entity proj, vector dir, vector upDir, float p
 
 .float railgundistance;
 .vector railgunforce;
-void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype);
+void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector end, float bdamage, bool headshot_notify, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype);
 
 entity fireBullet_trace_callback_eff;
 entity fireBullet_last_hit;
 void fireBullet_trace_callback(vector start, vector hit, vector end);
-void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag);
-void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect);
+void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect, bool do_antilag);
+void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect);
index ef011cffbc8784866086a3c37dcfef140fba4219..85923c8ea5817c5eb3c8ac7ea088add4452c8e56 100644 (file)
@@ -65,6 +65,7 @@ set g_respawn_ghosts_alpha 1 "respawn ghost alpha"
 set sv_gibhealth 100 "Minus health a dead body must have in order to get gibbed"
 
 // use default physics
+sv_playerphysicsqc 1
 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"