- 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 '^:'
-Thu Jul 16 07:23:56 CEST 2020
+Sun Jul 26 07:24:53 CEST 2020
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
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
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
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
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
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
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
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
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
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
# 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"
#: 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
"^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
#: 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
#: 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 ""
"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"
#: 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
#: 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
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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)"
#: 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
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"
#: 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"
" ^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
#: 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 ""
#: 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"
#: 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
#: 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"
#: 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!"
#: 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"
#: 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"
#: 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
#: 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
#: 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!"
#: 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 ""
#: 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! "
#: 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
#: 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! "
#: 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! "
#: 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! "
#: 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! "
"(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
#: 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
#: 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! "
#: 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
#: 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
#: 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
#: qcsrc/menu/xonotic/dialog_firstrun.qc:84
msgid "Undecided"
-msgstr "Sin determinar"
+msgstr "Indeciso"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:88
msgid "Save settings"
#: 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"
#: 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
#: 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:"
#: 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"
"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."
#: 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 ""
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"
#: 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:"
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"
#: 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 *:"
#: 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"
#: 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"
#: 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!"
#: 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:"
#: 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:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
msgid "1st person perspective"
-msgstr "Perspectiva en primera persona"
+msgstr "Perspectiva en 1ª persona"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
msgid "Slide to third person upon death"
"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"
#: 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 1ª persona"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
msgid "Draw the weapon model"
#: 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
#: 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>"
"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"
#: 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
#: 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
#: 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
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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)"
#: 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
#: 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"
#: 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)"
"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"
#: qcsrc/client/hud/panel/scoreboard.qc:1384
msgid "Monsters killed:"
-msgstr "殺されたモンスター:"
+msgstr "モンスターキル数:"
#: qcsrc/client/hud/panel/scoreboard.qc:1391
msgid "Secrets found:"
#: 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
#: 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
#: qcsrc/common/mapinfo.qh:271
msgid "Capture the Flag"
-msgstr "旗を取れ (CTF)"
+msgstr "キャプチャー・ザ・フラッグ (CTF)"
#: qcsrc/common/mapinfo.qh:271
msgid ""
#: qcsrc/common/mutators/mutator/buffs/all.inc:87
msgid "Jump"
-msgstr "飛び越え"
+msgstr "ジャンプ"
#: qcsrc/common/mutators/mutator/buffs/all.inc:96
msgid "Invisible"
#: 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
#: 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
#: 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 ""
#: 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
#: 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
#: 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
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
#: 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
#: 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"
#: 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
#: 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
#: 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! "
#: 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! "
#: 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! "
#: 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! "
#: 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
#: 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"
#: qcsrc/common/teams.qh:36
msgid "Neutral"
-msgstr ""
+msgstr "中立"
#: qcsrc/common/teams.qh:39
msgid "KEY^Red"
#: 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"
"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
#: 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:"
#: 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"
#: 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!"
#: 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:"
#: 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"
#: 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
#: 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
#: 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"
#: 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"
#: 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
#: 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"
#: 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"
#: 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"
#: 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:"
#: 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"
#: 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"
#: 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:"
#: 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:"
#: 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
#: 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"
#: 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
#: 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:"
#: 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
#: 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"
#: 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"
#: 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"
"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
#: 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
#: 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:"
#: 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"
"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"
#: 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"
#: 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"
#: 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"
#: 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!"
#: 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
#: 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"
#: 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
#: 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"
#: 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 ""
"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 ""
"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 ""
"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
#: 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:"
#: 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"
#: 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"
#: 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
#: 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"
#: 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"
#: 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"
#: 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"
#: 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:"
"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"
#: 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"
#: 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"
#: 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:"
#: 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
#: 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!"
#: 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"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
msgid "DET^Insane"
-msgstr ""
+msgstr "非常識"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
msgid "Player detail:"
#: 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"
#: 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"
#: 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:"
#: 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"
#: 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
"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"
"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
#: 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:"
"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"
#: 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"
#: 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"
#: 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:"
#: 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:"
#: 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
#: 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"
#: 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"
#: 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
#: 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"
#: 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"
#: 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"
#: 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:"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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
#: 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"
#: 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"
#: 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:"
"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"
#: 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
#: 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:"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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)"
"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"
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:"
#: 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:"
"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:"
#: 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)"
#: 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 "???"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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"
#: 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
"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"
#: 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"
"Bookmark the currently highlighted server so that it's faster to find in the "
"future"
msgstr ""
+"現在ハイライトされているサーバーにブックマークを付けて、未来見つけやすくする"
#: qcsrc/menu/xonotic/serverlist.qc:733
msgid "Ping"
#: 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"
#: 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>"
"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"
#: 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:"
#: 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"
# 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 ""
"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"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "Player rank"
-msgstr ""
+msgstr "玩家排名"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "SCO^rank"
#: 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"
#: 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"
#: 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"
#: 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
#: qcsrc/common/minigames/minigame/ttt.qc:2
msgid "Tic Tac Toe"
-msgstr ""
+msgstr "井字棋"
#: qcsrc/common/minigames/minigame/ttt.qc:672
msgid "Single Player"
#: 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"
// 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"
// =================
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%
uk "Ukrainian" "Українська" 50%
zh_CN "Chinese (China)" "中文" 57%
zh_TW "Chinese (Taiwan)" "國語" 61%
+ja_JP "Japanese" "日本語" 100%
ko "Korean" "한국의" 29%
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"
#include <client/miscfunctions.qh>
#include <common/ent_cs.qh>
-#include <common/mapinfo.qh>
// Info messages (#14)
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))
#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()
#include <client/defs.qh>
#include <client/miscfunctions.qh>
#include <client/main.qh>
-#include <common/mapinfo.qh>
#include <lib/csqcmodel/cl_player.qh>
// Physics (#15)
{
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();
#include <client/autocvars.qh>
#include <client/defs.qh>
#include <client/miscfunctions.qh>
-#include <common/mapinfo.qh>
// Race timer (#8)
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;
}
#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>
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))
#include <client/miscfunctions.qh>
#include "scoreboard.qh"
#include <common/ent_cs.qh>
-#include <common/mapinfo.qh>
#include <common/scores.qh>
// Score (#7)
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();
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;
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;
}
-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;
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;
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;
str = "";
if(tl > 0)
str = strcat(str, sprintf(_("^3%1.0f minutes"), tl));
- if(!ISGAMETYPE(LMS))
+ if(!gametype.m_hidelimits)
{
if(fl > 0)
{
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;
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);
#include <client/autocvars.qh>
#include <client/defs.qh>
#include <client/miscfunctions.qh>
-#include <common/mapinfo.qh>
// Vote (#9)
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
}
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);
}
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) \
/** 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);
/** 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);
#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>
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)
if(autocvar_r_letterbox == 0)
if(autocvar_viewsize < 120)
{
- if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS)))
+ if(!MUTATOR_CALLHOOK(DrawScoreboardAccuracy))
Accuracy_LoadLevels();
HUD_Main();
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!
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
#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
}
// 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";
* @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);
* @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;
}
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);
// generated file; do not modify
+#include <common/gamemodes/gamemode/assault/assault.qc>
#ifdef SVQC
#include <common/gamemodes/gamemode/assault/sv_assault.qc>
#endif
// generated file; do not modify
+#include <common/gamemodes/gamemode/assault/assault.qh>
#ifdef SVQC
#include <common/gamemodes/gamemode/assault/sv_assault.qh>
#endif
--- /dev/null
+#include "assault.qh"
--- /dev/null
+#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)
// 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
// 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
--- /dev/null
+#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);
+}
--- /dev/null
+#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);
--- /dev/null
+#include "clanarena.qh"
--- /dev/null
+#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)
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;
+ }
+}
#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;
const int CTF_FLAG_NEUTRAL = 2048;
const int CTF_SHIELDED = 4096;
const int CTF_STALEMATE = 8192;
+#endif
// 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
// 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
--- /dev/null
+#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
+}
--- /dev/null
+#pragma once
--- /dev/null
+#include "cts.qh"
--- /dev/null
+#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)
// generated file; do not modify
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qc>
#ifdef SVQC
#include <common/gamemodes/gamemode/deathmatch/sv_deathmatch.qc>
#endif
// generated file; do not modify
+#include <common/gamemodes/gamemode/deathmatch/deathmatch.qh>
#ifdef SVQC
#include <common/gamemodes/gamemode/deathmatch/sv_deathmatch.qh>
#endif
--- /dev/null
+#include "deathmatch.qh"
--- /dev/null
+#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));
#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)
#pragma once
void HUD_Mod_Dom(vector myPos, vector mySize);
+void HUD_Mod_Dom_Export(int fh);
#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));
// generated file; do not modify
+#include <common/gamemodes/gamemode/duel/duel.qc>
#ifdef SVQC
#include <common/gamemodes/gamemode/duel/sv_duel.qc>
#endif
// generated file; do not modify
+#include <common/gamemodes/gamemode/duel/duel.qh>
#ifdef SVQC
#include <common/gamemodes/gamemode/duel/sv_duel.qh>
#endif
--- /dev/null
+#include "duel.qh"
--- /dev/null
+#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)
// 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
// 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
--- /dev/null
+#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);
+}
--- /dev/null
+#pragma once
+
+void HUD_Mod_FreezeTag_Export(int fh);
--- /dev/null
+#include "freezetag.qh"
--- /dev/null
+#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)
// generated file; do not modify
+#include <common/gamemodes/gamemode/invasion/invasion.qc>
#ifdef SVQC
#include <common/gamemodes/gamemode/invasion/sv_invasion.qc>
#endif
// generated file; do not modify
+#include <common/gamemodes/gamemode/invasion/invasion.qh>
#ifdef SVQC
#include <common/gamemodes/gamemode/invasion/sv_invasion.qh>
#endif
--- /dev/null
+#include "invasion.qh"
--- /dev/null
+#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));
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);
}
}
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;
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;
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);
}
#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));
#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));
// 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
// 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
--- /dev/null
+#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;
+}
--- /dev/null
+#pragma once
--- /dev/null
+#include "lms.qh"
--- /dev/null
+#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));
return true;
return false;
}
+
+MUTATOR_HOOKFUNCTION(cl_nb, DrawScoreboardAccuracy)
+{
+ return ISGAMETYPE(NEXBALL); // accuracy is not a factor in this gamemode
+}
#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)
#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);
#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)
{
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));
// 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
// 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
--- /dev/null
+#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
+}
--- /dev/null
+#pragma once
+
+void HUD_Mod_Race(vector pos, vector mySize);
--- /dev/null
+#include "race.qh"
--- /dev/null
+#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)
// generated file; do not modify
+#include <common/gamemodes/gamemode/tdm/tdm.qc>
#ifdef SVQC
#include <common/gamemodes/gamemode/tdm/sv_tdm.qc>
#endif
// generated file; do not modify
+#include <common/gamemodes/gamemode/tdm/tdm.qh>
#ifdef SVQC
#include <common/gamemodes/gamemode/tdm/sv_tdm.qh>
#endif
--- /dev/null
+#include "tdm.qh"
--- /dev/null
+#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)
}
}
-Gametype MapInfo_Type_FromString(string gtype)
+Gametype MapInfo_Type_FromString(string gtype, bool dowarn)
{
string replacement = "";
bool do_warn = true;
}
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;
}
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)
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)
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)
{
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)
{
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;
}
void MapInfo_LoadMapSettings_SaveGameType(Gametype t)
{
MapInfo_SwitchGameType(t);
- cvar_set("gamecfg", ftos(t.m_id));
+ cvar_set("gamecfg", t.mdl);
MapInfo_LoadedGametype = t;
}
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);
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;
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! */
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;
// 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);
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;
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);
}
}
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)
#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
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;
#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);
}
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
#pragma once
-.float ladder_time;
+IntrusiveList g_ladderents;
+STATIC_INIT(g_ladderents) { g_ladderents = IL_NEW(); }
+
.entity ladder_entity;
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;
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);
}
}
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);
}
}
}
if(this.gametype != "")
- MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype));
+ MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype, false));
if (this.chmap == "")
{
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)
{
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;
#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
WriteByte(MSG_ENTITY, this.active);
WriteCoord(MSG_ENTITY, this.height);
- WriteVector(MSG_ENTITY, this.movedir);
-
trigger_common_write(this, true);
return true;
this.active = ReadByte();
this.height = ReadCoord();
- this.movedir = ReadVector();
-
trigger_common_read(this, true);
this.entremove = trigger_remove_generic;
#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"
// entity properties of monsterinfo:
.bool(int, entity actor, entity targ, .entity weaponentity) monster_attackfunc;
+.entity monsterdef;
// animations
.vector anim_blockend;
return false;
}
-spawnfunc(monster_mage) { Monster_Spawn(this, true, MON_MAGE.monsterid); }
+spawnfunc(monster_mage) { Monster_Spawn(this, true, MON_MAGE); }
#endif // SVQC
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
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);
});
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
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
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
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)
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;
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);
}
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;
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
CSQCModel_UnlinkEntity(this);
- Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+ Monster mon = this.monsterdef;
mon.mr_death(mon, this);
if(this.candrop && this.weapon)
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)
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);
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
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))
{
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))
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");
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);
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);
#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;
RandomSelection_AddEnt(it, 1, 1);
});
- monster_id = RandomSelection_chosen_ent.monsterid;
+ monster_id = RandomSelection_chosen_ent;
}
else if(monster != "")
{
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)
{
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);
+ }
}
}
#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);
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)
entity mon = M_ARGV(0, entity);
// always refill ammo
- if(mon.monsterid == MON_MAGE.monsterid)
+ if(mon.monsterdef == MON_MAGE)
mon.skin = 1;
}
#pragma once
#include "items.qh"
+#include <common/gamemodes/_mod.qh>
float autocvar_g_instagib_invis_alpha;
int autocvar_g_instagib_extralives;
{
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;
}
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
{
/* 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);
}
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
{
/* 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);
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);
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;
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);
/* 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);
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)
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];
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);
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);
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)
{
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;
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
}
});
#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))
{
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");
}
}
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);
{
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);
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);
}
}
#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
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;
.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);
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;
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)
* 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:
}
this.view_ofs = '0 0 0';
+ this.movedir_aligned = this.movedir;
if (this.movedir.x >= 0)
{
#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);
}
#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
#include "calculations.qh"
#include "projectiles.qh"
#include <common/models/all.qh>
+#include <common/effects/all.qh>
#endif
#include <common/util.qh>
.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)
#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
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) */
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;
/* 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);
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;
/* 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);
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)
{
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)
{
/* 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);
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;
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);
/* 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);
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;
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;
/* 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);
{
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;
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;
/* 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);
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;
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;
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;
/* 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);
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;
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;
/* 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);
/* 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);
#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);
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)
}
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
{
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
{
/* 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);
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))
{
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;
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);
/* 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);
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;
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;
/* 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);
#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;
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
{
}
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)
{
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;
/* 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);
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) \
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;
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;
/* 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);
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)
//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;
/* 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);
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)
{
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)
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)
{
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)
{
/* 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);
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
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);
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);
/* 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);
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);
+ }
+}
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;
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));
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);
#include "dialog_singleplayer.qh"
-#include <common/mapinfo.qh>
+#include <common/gamemodes/_mod.qh>
#include "bigbutton.qh"
#include "radiobutton.qh"
#include "textlabel.qh"
#include "gametypelist.qh"
#include "dialog_multiplayer_create.qh"
+#include <common/gamemodes/_mod.qh>
#include <common/mapinfo.qh>
entity makeXonoticGametypeList()
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)
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;
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;
}
}
#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)
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;
#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>
}
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)
{
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;
#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>
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)
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;
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;
#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>
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);
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;
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;
}
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)));
#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>
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)
{
#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>
.entity iceblock;
.entity frozen_by; // for ice fields
-.entity muzzle_flash;
.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
void PlayerUseKey(entity this);
#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"
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))
{
farcent.nextthink = time + 0.1;
setthink(farcent, SUB_Remove);
}
- else
+ else if(targ.move_movetype != MOVETYPE_NOCLIP)
{
targ.velocity = targ.velocity + farce;
}
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')
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);
#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"
#include "weapons/tracing.qh"
#include "weapons/weaponsystem.qh"
+#include <common/gamemodes/_mod.qh>
+
#include <common/state.qh>
#include "../common/minigames/sv_minigames.qh"
*/
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;
}
{
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;
}
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);
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);
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;
#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>
#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"
team_ent.m_num_bots = 0;
}
setthink(balance, TeamBalance_Destroy);
+ balance.nextthink = time;
int teams_mask = 0;
string teament_name = string_null;
// 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;
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
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;
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);
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));
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;
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);
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
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);
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);
}
.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);
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"